All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fudaa.dodico.mascaret.io.MascaretGEOWriter Maven / Gradle / Ivy

There is a newer version: 2.7
Show newest version
/*
 * @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;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy