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

org.fudaa.dodico.rubar.io.RubarStWriter Maven / Gradle / Ivy

There is a newer version: 2.7
Show newest version
/*
 * @creation 15 f?vr. 07
 * @modification $Date: 2007-05-04 13:47:30 $
 * @license GNU General Public License 2
 * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
 * @mail [email protected]
 */
package org.fudaa.dodico.rubar.io;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.fudaa.ctulu.CtuluLib;
import org.fudaa.ctulu.CtuluNumberFormatI;
import org.fudaa.ctulu.ProgressionUpdater;
import org.fudaa.ctulu.fileformat.FortranLib;
import org.fudaa.ctulu.gis.CtuluLibGeometrie;
import org.fudaa.ctulu.gis.GISAttributeConstants;
import org.fudaa.ctulu.gis.GISDataModel;
import org.fudaa.ctulu.gis.GISDataModelFilterAdapter;
import org.fudaa.ctulu.gis.GISLib;
import org.fudaa.dodico.commun.DodicoLib;
import org.fudaa.dodico.fortran.FileOpWriterCharSimpleAbstract;
import org.fudaa.dodico.fortran.FortranWriter;

import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.LineString;

/**
 * Une classe pour ecrire les donn?es Rubar St. Si le mod?le poss?de un attribut TITRE, alors il est ?crit comme
 * nom du profil.
 * 
 * @author fred deniger, Bertrand Marchand
 * @version $Id$
 */
public class RubarStWriter extends FileOpWriterCharSimpleAbstract {

  /** Pour chaque profil, association entre l'indice de certains points et des indices de lignes directrices.*/
  HashMap>[] pts2lds_=null;
  /** Le mod?le de profils, une fois r?ordonn?, ou identique si non r?ordonn?. */
  GISDataModel profs_=null;
  /** Le nom des lignes directrices, une fois control?es et modifi?es. */
  List ldirnames_=new ArrayList();
  /** Le fichier est de type ST */
  boolean isSt_;

  @Override
  public void setFile(final File _f) {
    isSt_ = !_f.getName().toLowerCase().endsWith(".cn");
    super.setFile(_f);
  }
  
  /**
   * Ecrit les profils et les lignes directrices.
   * param _o Un tableau GISDataModel[2]. 
   * [0] : le modele des profils (ou null si aucun profil), 
   * [1] : le modele de lignes directrices (ou null ou de longueur 0 si aucune ligne directrice).
   */
  @Override
  protected void internalWrite(final Object _o) {
    ProgressionUpdater up=new ProgressionUpdater(progress_);
    
    if (!(_o instanceof GISDataModel[]) || ((GISDataModel[])_o).length!=2) {
      donneesInvalides(_o);
      return;
    }
    
    profs_=((GISDataModel[])_o)[0];
    GISDataModel lines=((GISDataModel[])_o)[1];

    // Profils ou non ?
    boolean bprofs=profs_!=null && profs_.getNumGeometries()!=0;
    // Lignes directrices ou non ?
    boolean bldirs=lines!=null && lines.getNumGeometries()!=0;
    
    if (!bprofs) {
      if (bldirs) {
        analyze_.addInfo(DodicoLib.getS("Aucun profil : Les lignes directrices ne seront pas export?es"));
      }
      else {
        analyze_.addInfo(DodicoLib.getS("Aucun profil ? exporter"));
      }
      return;
    }
    
    // Si pb avec les lignes directrices => Pas d'?criture de fichier.
    if (!prepareWrite((GISDataModel[])_o,up)) return;
        
    final int attName=profs_.getIndiceOf(GISAttributeConstants.TITRE);
    final int attPk=profs_.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO);
    
    final int[] fmtEntete = new int[] { 6, 6, 6, 6, 1, 12, 1, 42 };
    final int[] fmt = new int[] { 1, 12, 1, 12, 1, 12, 1, 3 };
    final FortranWriter writer = new FortranWriter(out_);
    writer.setSpaceBefore(true);
    final CtuluNumberFormatI numbFmt = FortranLib.getImprovedFortranFormat(12, 4);
    final String sep = "999.999";

    try {
      int nb=profs_.getNumGeometries();
      up.setValue(50, nb, 50, 50);

      for (int i = 0; i > pts2ld=bldirs?pts2lds_[i]:null;
        String name;
        double pk=0;
        final CoordinateSequence str = ((LineString) profs_.getGeometry(i)).getCoordinateSequence();
        if (isSt_) {

          if (attName==-1||(name=(String)profs_.getValue(attName, i))==null) name="";
          name=name.substring(0,Math.min(name.length(),42));
          // PK, issu du commentaire hydrualique.
          if (attPk!=-1) {
            pk=GISLib.getHydroCommentDouble((String)profs_.getValue(attPk, i),GISAttributeConstants.ATT_COMM_HYDRO_PK);
          }
          // Nombre de points => On tient compte des points dupliqu?s car partag?s par plusieurs lignes directrices.
          int nbpt=0;
          for (int k=0; k idxline=bldirs ? pts2ld.get(k):null;
            if (idxline!=null)
              nbpt+=idxline.size();
            else
              nbpt+=1;
          }
          
          writer.setSpaceBefore(false);
          writer.stringField(7, name);
          writer.stringField(6, "");
          writer.stringField(5, numbFmt.format(pk));
          writer.stringField(4, "");
          writer.intField(3, nbpt);
          writer.intField(2, 0);
          writer.intField(1, 0);
          writer.intField(0, i+1);
          writer.writeFields(fmtEntete);
          writer.setSpaceBefore(true);
        }
        for (int k = 0; k < str.size(); k++) {
          // Un m?me point de profil peut ?tre partag? par plusieurs lignes directrices => On duplique ce point.
          ArrayList idxline=bldirs?pts2ld.get(k):null;
          if (idxline!=null) {
            for (int il=0; il
   * 
   * @param _mdls Les mod?les de lignes directrices et profils.
   * @param _up L'updater pour la progression
   * @return true si ok.
   */
  private boolean prepareWrite(GISDataModel[] _mdls, ProgressionUpdater _up) {
    GISDataModel ldirs=_mdls[1];
    
    pts2lds_=null;
    if (ldirs==null || ldirs.getNumGeometries()==0) return true; // On ne peut rien controler sans lignes directrices.
    
    // Les lignes directrices doivent avoir m?me nombre de points.
    int nbpts=-1;
    for (int i=0; i ordProfs=new ArrayList(profs_.getNumGeometries());
    CoordinateSequence firstLine=((LineString)ldirs.getGeometry(0)).getCoordinateSequence();
    _up.setValue(50, firstLine.size(), 0, 30);

    // On r?ordonne les profils suivant la 1ere ligne directrice.
    NEXT_LD_COORD:
    for (int i=0; i On associe un index de ligne directrice aux points qui en contiennent.
    pts2lds_=new HashMap[profs_.getNumGeometries()];
    for (int i=0; i>();
      CoordinateSequence seqprof=((LineString)profs_.getGeometry(i)).getCoordinateSequence();
      
      NEXT_LD:
      for (int j=0; j idxlines=pts2lds_[i].get(k);
            // Pas encore de ligne directrice associ?.
            if (idxlines==null) {
              idxlines=new ArrayList();
              pts2lds_[i].put(k,idxlines);
            }
            // Si une ligne directrice au moins est d?j? associ?e au pt courant et que le pt d'apr?s a m?mes 
            // coordonn?es, on passe le pt courant. Ceci dans le but d'eviter la duplication de points.
            else if (k3 ||
           ldirnames_.indexOf(name)!=-1) {
        ldirnames_.add(null);
      }
      else {
        ldirnames_.add(name);
      }
    }

    // Ajout de noms de lignes conformes.
    int idir=0;
    char init='A';
    init--;
    
    for (int j=0; j




© 2015 - 2024 Weber Informatics LLC | Privacy Policy