Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* @creation 19 d?c. 2008
* @modification $Date:$
* @license GNU General Public License 2
* @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne
* @mail [email protected]
*/
package org.fudaa.dodico.mascaret.io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.fudaa.ctulu.CtuluAnalyze;
import org.fudaa.ctulu.fileformat.FileWriteOperationAbstract;
import org.fudaa.ctulu.fileformat.FortranInterface;
import org.fudaa.ctulu.gis.GISAttributeConstants;
import org.fudaa.ctulu.gis.GISAttributeModelDoubleInterface;
import org.fudaa.ctulu.gis.GISLib;
import org.fudaa.ctulu.gis.GISPolyligne;
import org.fudaa.ctulu.gis.GISZoneCollection;
import org.fudaa.dodico.commun.DodicoLib;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import java.text.DecimalFormat;
import org.fudaa.ctulu.CtuluLib;
import org.fudaa.ebli.geometrie.GrPoint;
import org.fudaa.ebli.geometrie.GrPolyligne;
import org.fudaa.fudaa.commun.FudaaPreferences;
/**
* Ecrit au format mascaret 1d ou 2d.
* @author Emmanuel MARTIN
* @version $Id$
*/
public class MascaretGEOWriter extends FileWriteOperationAbstract {
/** Le flux de sorti. */
private Writer out_;
/** Le bief au format Mascaret ? ?crire. */
private MascaretBief bief_;
/** Type du fichier mascaret de destination 1D ou 2D. */
private boolean is1D_=true;
/**
* Cette classe permet ? l'exporteur de selectionner les
* profils ? exporter. G?n?ralement les profiles invalides sont ignor?s.
* @author Emmanuel MARTIN
* @version $Id$
*/
public interface FunctorSelectProfil {
public boolean exportProfil(GISZoneCollection _zone, int _idxProfil);
}
public MascaretGEOWriter(boolean _is1D) {
is1D_=_is1D;
}
/**
* L'argument doit ?tre un tableau contenant :
* 0 : string : le nom du bief
* 1 : GISZoneCollectionLigneBrisee[] : les zones dans lesquelles trouver les g?om?tries
* 2 : FunctorSelectProfil : pour selectionner les profils ? exporter
*
* On passe en param?tre les diff?rentes GISZoneCollectionLigneBrisee qui
* contiennent les g?om?tries n?c?ssaires ? l'exportation. Ces zone peuvent
* contenir des g?om?tries incompatible avec l'export (comme des polygones),
* elles seront simplement ignor?es. Dans le cas o? des g?om?tries manqueront,
* une exception du type MascaretDataIncomplete est lev?e. Les profils invalides
* sont ?galements ignor?s. Si certaines donn?es sont incoh?rentes une exception
* du type MascaretDataError est lev?e. La version du fichier de destination ('1d'
* ou '2d'). Si un des trois param?tres est null une exception de type
* {@link IllegalArgumentException} est lev?e.
*/
@Override
protected void internalWrite(Object _o) {
// Le format pour les coordonn?es, avec un nombre de d?cimales limit?
int nbDigits=FudaaPreferences.FUDAA.getIntegerProperty(MascaretExportPreferencesComponent.MASCARET_EXPORT_NB_DIGITS, -1);
DecimalFormat fmt=CtuluLib.getNoEffectDecimalFormat();
if (nbDigits != -1) {
fmt.setMaximumFractionDigits(nbDigits);
}
DecimalFormat fmtZ=CtuluLib.getNoEffectDecimalFormat();
fmtZ.setMaximumFractionDigits(2);
try {
if(((Object[])_o).length!=3)
throw new IllegalArgumentException("Il doit y avoir 3 param?tres dans _o.");
String nomBief=(String)((Object[])_o)[0];
GISZoneCollection[] zones=(GISZoneCollection[])((Object[])_o)[1];
FunctorSelectProfil selectorProfil=(FunctorSelectProfil)((Object[])_o)[2];
if (nomBief==null)
throw new IllegalArgumentException("nomBief ne doit pas ?tre null");
if (zones==null)
throw new IllegalArgumentException("zones mustn't be null");
generateMascaretProfilAbstractRepresentations(nomBief, zones, selectorProfil);
for (int i=0; i profils=new ArrayList();
List indexProfils=new ArrayList();
int nbProfilNotKeep=0;
for (int i=0; i<_zones.length; i++) {
int idxAttNature=_zones[i].getIndiceOf(GISAttributeConstants.NATURE);
if (idxAttNature!=-1)
for (int j=0; j<_zones[i].getNbGeometries(); j++)
if (_zones[i].getValue(idxAttNature, j)==GISAttributeConstants.ATT_NATURE_PF) {
if(_selectorProfil.exportProfil(_zones[i], j)) {
profils.add(_zones[i]);
indexProfils.add(j);
}
else
nbProfilNotKeep++;
}
}
if (nbProfilNotKeep>0)
analyze_.addWarn(DodicoLib.getS("{0} profils sur {1} n'ont pas ?t? export?s car ils ne sont pas conformes",""+nbProfilNotKeep,""+(indexProfils.size()+nbProfilNotKeep)), -1);
else
analyze_.addInfo(DodicoLib.getS("{0} profils ont ?t? export?s",""+(indexProfils.size()+nbProfilNotKeep)));
// G?n?ration des MascaretProfilAbstractRepresentations \\
bief_=new MascaretBief();
int countNoName=1;
GISPolyligne axeHydraulique=(GISPolyligne)zoneAxeHydraulique.getGeometry(indexAxeHydraulique);
for (int i=0;i seps=new ArrayList();
//INTERSECTION_RIVE_GAUCHE
int idxInterRiveG=zoneProfil.getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE);
Integer idxRG=-1;
if(idxInterRiveG!=-1) {
idxRG=(Integer) zoneProfil.getValue(idxInterRiveG, idxProfil);
seps.add(idxRG);
}
//INTERSECTION_RIVE_DROITE
int idxInterRiveD=zoneProfil.getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE);
Integer idxRD=-1;
if(idxInterRiveD!=-1) {
idxRD=(Integer) zoneProfil.getValue(idxInterRiveD, idxProfil);
seps.add(idxRD);
}
//INTERSECTION_LIMITE_STOCKAGE_GAUCHE
int idxInterStockageG=zoneProfil.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE);
Integer idxSG=-1;
if(idxInterStockageG!=-1) {
idxSG=(Integer) zoneProfil.getValue(idxInterStockageG, idxProfil);
seps.add(idxSG);
}
//INTERSECTION_LIMITE_STOCKAGE_DROITE
int idxInterStockageD=zoneProfil.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE);
Integer idxSD=-1;
if(idxInterStockageD!=-1) {
idxSD=(Integer) zoneProfil.getValue(idxInterStockageD, idxProfil);
seps.add(idxSD);
}
if(idxRG==-1&&idxRD!=-1||idxRG!=-1&&idxRD==-1)
throw new MascaretDataIncomplete("Il y a une seule rive (il doit y en avoir soit 0 soit 2)");
if(idxSG==-1&&idxSD!=-1||idxSG!=-1&&idxSD==-1)
throw new MascaretDataIncomplete("Il y a une seule limite de stockage (il doit y en avoir soit 0 soit 2)");
Integer[] sepsT=seps.toArray(new Integer[0]);
Arrays.sort(sepsT);
// Bathy Topo ou Stockage
if(sepsT.length==4){
int j;
for(j=0;j coord=new ArrayList();
int idx1=0;
int idx2=1;
int idx3=2;
int idxPointRupturePrecedent=-1;
while(idx3<_seq.size()) {
if(idx1==idx2)
idx2++;
else if(idx2==idx3)
idx3++;
else if(_seq.getCoordinate(idx1).equals(_seq.getCoordinate(idx2)))
idx2++;
else if(_seq.getCoordinate(idx2).equals(_seq.getCoordinate(idx3)))
idx3++;
else {
if(getAngle(_seq.getCoordinate(idx1), _seq.getCoordinate(idx2), _seq.getCoordinate(idx3))<(Math.PI-0.0001))
if(idxPointRupturePrecedent<0||!_seq.getCoordinate(idxPointRupturePrecedent).equals(_seq.getCoordinate(idx2)))
coord.add(_seq.getCoordinate(idx2));
if(idx2+11)
return 1;
else
return 0;
}
/**
* Retourne la projection de _a sur la droite _b_c.
* Attention : Il s'agit bien d'une projection sur une
* droite et non un segment de droite : le r?sultat
* peut ?tre en dehors de [_b, _c]
*/
private Coordinate proj(Coordinate _a, Coordinate _b, Coordinate _c){
Coordinate vBC=vec(_b, _c);
Coordinate vBA=vec(_b, _a);
double normeBC=Math.sqrt(vBC.x*vBC.x+vBC.y*vBC.y+vBC.z*vBC.z);
double produitScalaireBCBA=vBC.x*vBA.x+vBC.y*vBA.y+vBC.z*vBA.z;
double rapportSurBC=produitScalaireBCBA/(normeBC*normeBC);
return new Coordinate(vBC.x*rapportSurBC+_b.x, vBC.y*rapportSurBC+_b.y, vBC.z*rapportSurBC+_b.z);
}
/**
* Compars les deux vecteurs avec la tol?rance donn?e. Le dernier param?tre
* indique si un normalisation des deux vecteurs doit ?tre faite avec la
* comparaison. Les vecteurs ne sont pas modif?s dans l'op?ration. _testZ doit
* ?tre mit ? vrai pour que la comparaison tienne compte du z.
*/
private boolean egal(Coordinate _a, Coordinate _b) {
Coordinate diff=vec(_a, _b);
return Math.abs(diff.x)<0.0001&&Math.abs(diff.y)<0.0001;
}
/**
* retourne le vecteur _a, _b sous forme de Coordinate.
*/
private Coordinate vec(Coordinate _a, Coordinate _b){
return new Coordinate(_b.x-_a.x, _b.y-_a.y, _b.z-_a.z);
}
/**
* Calcul l'abscisse curviligne du point indiqu? en param?tre
*/
private double absCurv(CoordinateSequence _coordSeq, int _idxPoint){
if(_idxPoint==0)
return 0;
double valueCurviligne=0;
for (int j=1; j<=_idxPoint; j++)
valueCurviligne+=_coordSeq.getCoordinate(j).distance(_coordSeq.getCoordinate(j-1));
return valueCurviligne;
}
}