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

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

There is a newer version: 2.7
Show newest version
/*
 * @creation     13 nov. 2008
 * @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.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.fudaa.ctulu.CtuluAnalyze;
import org.fudaa.ctulu.fileformat.FileReadOperationAbstract;
import org.fudaa.ctulu.fileformat.FortranInterface;
import org.fudaa.dodico.commun.DodicoLib;

/**
 * Parser du format Mascaret. (versions 6.0 et pr?c?dentes).
 * Lit des fichiers Mascaret g?or?f?renc?s ou non.
 *
 * @author Emmanuel MARTIN, [email protected]
 * @version $Id$
 */
public class MascaretGEOReader extends FileReadOperationAbstract {

  /** Exception lev?e quand une probl?me est trouv? pendant le parsing. */
  private class ParseError extends Exception{
    public ParseError(String _message){
      super(_message);
    }
  }
  
  /** Le fichier ? lire */
  private FileReader rawData_;
  private String fileName_;
  /** Les caract?res de 's?paration' */
  private char[] charSeparation_=new char[]{' ', '\t'};
  private char charSeparationNewLigne_='\n';
  /** Le bief */
  MascaretBief bief=new MascaretBief();
  
  public MascaretGEOReader() {
    rawData_=null;
  }
  
  /**
   * Retourne vrai si _element est dans _tabElements
   * @param _element
   * @param _tabElements
   * @return retourne vrai si _element est dans _tabElements
   */
  private boolean in(final char _element, final char[] _tabElements){
    boolean found=false;
    int i=-1;
    while(!found&&++i<_tabElements.length)
      found=_element==_tabElements[i];
    return found;
  }
  
  /**
   * @return token dont le caract?re de s?paration est le retour ? la ligne. Null si rien ? lire.
   */
  private StringBuffer nextLineToken(){
    StringBuffer token=new StringBuffer();
    int currentRawChar;
    try {
      currentRawChar=rawData_.read();
      // Lecture du token : lecture tant qu'un caract?re de s?paration n'est pas
      // trouv?.
      while (currentRawChar!=-1&&((char)currentRawChar)!=charSeparationNewLigne_) {
        token.append((char)currentRawChar);
        currentRawChar=rawData_.read();
      }
    }
    catch (IOException _exc) {
      // Erreur dans un des rawData_.read()
      _exc.printStackTrace();
    }
    // Retour du token
    return token.length()==0 ? null:token;
  }
  
  /**
   * Retourne le token suivant dans le flux (liste de caract?re jusqu'au
   * caract?re de s?paration suivant).
   * @return le token ou null si il n'y en a pas.
   */
  private String nextWordToken(StringBuffer _lineToken) {
    StringBuffer token=new StringBuffer();
    // Elimination des caract?res de s?paration avant le token
    while (_lineToken.length()>0&&in(_lineToken.charAt(0), charSeparation_))
      _lineToken.deleteCharAt(0);
    // Lecture du token : lecture tant qu'un caract?re de s?paration n'est pas
    // trouv?.
    while (_lineToken.length()>0&&!in(_lineToken.charAt(0), charSeparation_)) {
      token.append(_lineToken.charAt(0));
      _lineToken.deleteCharAt(0);
    }
    // Retour du token
    return token.toString().length()==0 ? null:token.toString();
  }
  
  /*
   * Lit les g?om?tries et les retourne sous forme d'un tableau d'objets contenant
   * le nom du bief +  5 collections distinctes.

* [0] : Nom du bief
* [1] : Les 5 collections : 0: Traces, 1: Profils, 2:Axe, 3:Rives, 4:Stockage */ @Override protected Object[] internalRead() { try { StringBuffer lineToken=nextLineToken(); if(lineToken==null) throw new ParseError(fileName_+DodicoLib.getS(" : le fichier est vide.")); /* * Boucle principale : une it?ration par profil */ String token=nextWordToken(lineToken); while (lineToken!=null&&token.equalsIgnoreCase("profil")) { MascaretProfilAbstractRepresentation profil=new MascaretProfilAbstractRepresentation(); // Premi?re ligne \\ // Extraction des informations commune ? 1d et 2d profil.nomBief=nextWordToken(lineToken); profil.nomProfil=nextWordToken(lineToken); profil.abscLong=Double.parseDouble(nextWordToken(lineToken)); // Coordonn?es de trace de profile : non pr?sent dans les fichiers 1d token=nextWordToken(lineToken); while (token!=null&&!token.equals("AXE")) { profil.ptsTrace.add(new double[]{Double.parseDouble(token), Double.parseDouble(nextWordToken(lineToken))}); token=nextWordToken(lineToken); } // Coordonn?e d'intersection du profile et de l'axe hydraulique if (token!=null&&token.equals("AXE")) profil.ptAxeHydrau=new double[]{Double.parseDouble(nextWordToken(lineToken)), Double.parseDouble(nextWordToken(lineToken))}; // Lignes suivantes : coordonn?es du profile \\ lineToken=nextLineToken(); while (lineToken!=null&&!(token=nextWordToken(lineToken)).equalsIgnoreCase("profil")) { profil.abscTravers.add(Double.parseDouble(token)); profil.coordZ.add(Double.parseDouble(nextWordToken(lineToken))); profil.typePts.add(nextWordToken(lineToken).charAt(0)); // Coordonn?es XY : non pr?sent dans les fichiers 1d token=nextWordToken(lineToken); if (token!=null) profil.pts.add(new double[]{Double.parseDouble(token), Double.parseDouble(nextWordToken(lineToken))}); lineToken=nextLineToken(); } // Verification de la coh?rance des informations if (profil.is1d()) throw new ParseError(fileName_+DodicoLib.getS(" : les profils 1D ne sont pas g?r?s")); else if (!(profil.is2d()&&profil.check2D())) throw new ParseError(fileName_+DodicoLib.getS(" : le fichier source comporte des erreurs.")); // Ajout du profile ? la liste et traitement du profile suivant bief.addProfil(profil); } // G?n?ration des GISZoneCollectionLigneBrisee avec les informations extraites et // retour de celle-ci if (progress_!=null) progress_.setDesc(DodicoLib.getS("Lecture de ")+fileName_); return new Object[]{bief.getBiefName(),bief.buildZones(analyze_, progress_)}; } catch (ParseError _exc) { analyze_.addFatalError(_exc.getMessage()); } catch (NumberFormatException _exc){ analyze_.addFatalError(fileName_+DodicoLib.getS(" : le fichier source comporte des erreurs.")); } catch (NullPointerException _exc){ analyze_.addFatalError(fileName_+DodicoLib.getS(" : le fichier source comporte des erreurs.")); } return null; } /* (non-Javadoc) * @see org.fudaa.ctulu.fileformat.FileOperationAbstract#getFortranInterface() */ @Override protected FortranInterface getFortranInterface() { return new FortranInterface() { @Override public void close() throws IOException{ if (rawData_ != null) rawData_.close(); } }; } /* (non-Javadoc) * @see org.fudaa.ctulu.fileformat.FileOperationAbstract#setFile(java.io.File) */ @Override public void setFile(File _f) { fileName_=_f.getName(); analyze_ = new CtuluAnalyze(); analyze_.setResource(_f.getAbsolutePath()); try { rawData_=new FileReader(_f); } catch (FileNotFoundException _exc) { } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy