From: <bma...@us...> - 2009-03-24 15:35:09
|
Revision: 4565 http://fudaa.svn.sourceforge.net/fudaa/?rev=4565&view=rev Author: bmarchan Date: 2009-03-24 15:34:57 +0000 (Tue, 24 Mar 2009) Log Message: ----------- Tache #166 : Export des casiers au format Rubar. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeInteger.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISLib.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/CalqueGISTreeModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporterFilter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierFileFormat.java branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierWriter.java Property Changed: ---------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeInteger.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeInteger.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeInteger.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeInteger.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -11,7 +11,7 @@ /** * @author Fred Deniger - * @version $Id: GISAttributeInteger.java,v 1.8 2006-09-19 14:36:53 deniger Exp $ + * @version $Id$ */ public class GISAttributeInteger extends GISAttribute { @@ -46,7 +46,8 @@ } /** - * @param _name + * Cree un attribut integer, par defaut global. + * @param _name Le nom de l'attribut */ public GISAttributeInteger(final String _name) { super(new CtuluValueEditorInteger(), _name); Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeInteger.java ___________________________________________________________________ Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISLib.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISLib.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISLib.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -646,8 +646,8 @@ } final double r = _s.getOrdinate(0, CoordinateSequence.Z); for (int i = _s.size() - 1; i > 0; i--) { - final double t = _s.getOrdinate(i, CoordinateSequence.Z) - r; - if (t < _eps || t > _eps) { + final double t = Math.abs(_s.getOrdinate(i, CoordinateSequence.Z) - r); + if (t > _eps) { return false; } } Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierFileFormat.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierFileFormat.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierFileFormat.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -0,0 +1,45 @@ +/* + * @creation 11 Mars 2009 + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.dodico.rubar.io; + +import org.fudaa.ctulu.fileformat.FileFormatUnique; +import org.fudaa.ctulu.fileformat.FileReadOperationAbstract; +import org.fudaa.ctulu.fileformat.FileWriteOperationAbstract; +import org.fudaa.dodico.commun.DodicoLib; +import org.fudaa.dodico.h2d.resource.H2dResource; + +/** + * Un file format pour les fichier Rubar Casiers + * @author Bertrand Marchand + * @version $Id$ + */ +public class RubarCasierFileFormat extends FileFormatUnique { + + public RubarCasierFileFormat() { + super(1); + nom_ = DodicoLib.getS("Rubar casiers"); + description_ = H2dResource.getS("Fichier contenant des casiers"); + extensions_=new String[]{"mage"}; + } + static final RubarCasierFileFormat INSTANCE = new RubarCasierFileFormat(); + + /** + * @return singleton + */ + public static RubarCasierFileFormat getInstance() { + return INSTANCE; + } + + public FileReadOperationAbstract createReader() { + return null; + } + + public FileWriteOperationAbstract createWriter() { + return new RubarCasierWriter(); + } + +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierFileFormat.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierWriter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierWriter.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierWriter.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -0,0 +1,107 @@ +/* + * @creation 15 f\xE9vr. 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 de...@fu... + */ +package org.fudaa.dodico.rubar.io; + +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISAttributeInteger; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISDataModel; +import org.fudaa.ctulu.gis.GISLib; +import org.fudaa.ctulu.gis.GISPolygone; +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.Geometry; + +/** + * Une classe pour ecrire des casiers au format Rubar. + * + * @author Bertrand Marchand + * @version $Id$ + */ +public class RubarCasierWriter extends FileOpWriterCharSimpleAbstract { + + /** A utiliser pour chaque ligne de niveau, comme index sur le casier auquel elle se rapporte */ + public static final GISAttributeInterface INDEX_CASIER=new GISAttributeInteger("Index casier"); + + /** + * Ecrit les casiers. Les casiers sont consid\xE9r\xE9s conformes, c'est a dire a plus de 3 points et 0 ou plus lignes de niveaux. + * @param _o Un tableau GISDataModel[2]. + * [0] : le modele des contours de casiers + * [1] : le modele des lignes de niveau ferm\xE9es internes aux casiers. Il poss\xE8de un attribut INDEX_CASIER, qui indique le + * casier auquel chaque ligne de niveau se rapporte. + */ + protected void internalWrite(final Object _o) { + if (!(_o instanceof GISDataModel[]) || ((GISDataModel[])_o).length!=2) { + donneesInvalides(_o); + return; + } + + GISDataModel mdcasiers=((GISDataModel[])_o)[0]; + GISDataModel mdniv=((GISDataModel[])_o)[1]; + + final int iattName=mdcasiers.getIndiceOf(GISAttributeConstants.TITRE); + final int iattRef=mdniv.getIndiceOf(INDEX_CASIER); + if (iattRef==-1) { + analyze_.addFatalError(DodicoLib.getS("Arguments d'appel \xE0 RubarCasierWriter invalides")); + return; + } + + final FortranWriter writer = new FortranWriter(out_); + final int[] fmt={10,10}; + + try { + for (int icas = 0; icas < mdcasiers.getNumGeometries(); icas++) { + GISPolygone gcasier=((GISPolygone)mdcasiers.getGeometry(icas)); + + String name; + if (iattName==-1||(name=(String)mdcasiers.getValue(iattName, icas))==null||name.length()>3) name="C"+(icas+1); + + writer.writeln("$"+name); + // Le contour casier + writer.doubleField(1,getSurface(gcasier)); + writer.doubleField(0,getAltitude(gcasier.getCoordinateSequence())); + writer.writeFields(fmt); + + // Les lignes de niveau pour ce casier. + for (int iniv=0; iniv< mdniv.getNumGeometries(); iniv++) { + if (mdniv.getValue(iattRef, iniv).equals(icas)) { + GISPolygone gniv=((GISPolygone)mdniv.getGeometry(iniv)); + writer.doubleField(1,getSurface(gniv)); + writer.doubleField(0,getAltitude(gniv.getCoordinateSequence())); + writer.writeFields(fmt); + } + } + } + + } catch (final Exception _evt) { + analyze_.manageException(_evt); + } + + } + + /** + * Retourne l'altitude moyenne de la sequence pass\xE9e en argument. + * @param _seq La sequence de coordonn\xE9es. + * @return L'altitude moyenne. + */ + private double getAltitude(CoordinateSequence _seq) { + return GISLib.getMoyZ(_seq); + } + + /** + * Retourne la surface (en hectares) de la g\xE9om\xE9trie pass\xE9e en argument. + * @param _geom La g\xE9om\xE9trie pass\xE9e en argument. + * @return La surface en hectares. 0 pour un point. + */ + private double getSurface(Geometry _geom) { + return _geom.getArea()/10000; + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/rubar/io/RubarCasierWriter.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/CalqueGISTreeModel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/CalqueGISTreeModel.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/CalqueGISTreeModel.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -55,7 +55,6 @@ public class CalqueGISTreeModel extends DefaultTreeModel implements Observer { final BGroupeCalque rootLayer_; - LayerNode rootNode_; final CalqueGeometryVisitor finder_ = new CalqueGeometryVisitor(); GISVisitorChooser chooser_ = new GISVisitorChooser(); @@ -202,7 +201,6 @@ */ public CalqueGISTreeModel(final BArbreCalqueModel _model, final BGroupeCalque _root) { super(new LayerNode(_root)); - rootNode_=(LayerNode)getRoot(); rootLayer_ = _root; if (_model != null) { _model.getObservable().addObserver(this); @@ -212,8 +210,8 @@ } public final void buildTree() { - rootNode_.removeAllChildren(); - addLayer(rootNode_, rootLayer_); + ((LayerNode)getRoot()).removeAllChildren(); + addLayer((LayerNode)getRoot(), rootLayer_); } protected boolean containsGeometries(final BCalque _cq) { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -166,7 +166,7 @@ return palette_; } - public final ZEbliCalquesPanel getPanel() { + public ZEbliCalquesPanel getPanel() { return panel_; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -10,6 +10,8 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.io.File; import javax.swing.ButtonGroup; @@ -20,28 +22,21 @@ import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreePath; +import org.fudaa.ctulu.CtuluAnalyze; import org.fudaa.ctulu.CtuluLib; import org.fudaa.ctulu.CtuluLibFile; import org.fudaa.ctulu.CtuluListSelection; import org.fudaa.ctulu.CtuluUI; -import org.fudaa.ctulu.fileformat.FileFormatVersionInterface; -import org.fudaa.ctulu.gis.GISAttributeConstants; -import org.fudaa.ctulu.gis.GISAttributeInterface; -import org.fudaa.ctulu.gis.GISDataModel; import org.fudaa.ctulu.gis.GISLib; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gui.CtuluDialogPanel; import org.fudaa.ctulu.gui.CtuluFileChooserPanel; -import org.fudaa.dodico.mascaret.io.MascaretCasierFileFormat; import org.fudaa.ebli.calque.BArbreCalqueModel; import org.fudaa.ebli.calque.CalqueGISTreeModel; import org.fudaa.ebli.calque.ZCalqueAffichageDonneesAbstract; import org.fudaa.ebli.calque.ZCalqueGeometry; -import org.fudaa.ebli.calque.ZEbliCalquesPanel; -import org.fudaa.ebli.calque.ZModeleGeometry; import org.fudaa.ebli.calque.ZScene; import org.fudaa.ebli.calque.edition.ZModeleGeometryDefault; -import org.fudaa.ebli.commun.EbliListeSelectionMulti; import org.fudaa.ebli.geometrie.GrBoite; import org.fudaa.ebli.trace.TraceIcon; import org.fudaa.ebli.trace.TraceIconModel; @@ -53,11 +48,11 @@ import org.fudaa.fudaa.modeleur.resource.MdlResource; import org.fudaa.fudaa.sig.FSigLib; +import com.memoire.bu.BuComboBox; import com.memoire.bu.BuFileFilter; import com.memoire.bu.BuLabel; import com.memoire.bu.BuRadioButton; import com.memoire.bu.BuVerticalLayout; -import com.sun.java_cup.internal.internal_error; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Polygon; @@ -68,7 +63,7 @@ */ public class MdlCasierExportPanel extends CtuluDialogPanel { - private ZEbliCalquesPanel pn_; + private MdlVisuPanel pn_; private GrBoite initZoom_; private JTree trLayers_; private ZCalqueGeometry cqTmp_; @@ -76,22 +71,39 @@ private CtuluListSelection sel_=new CtuluListSelection(); private CtuluFileChooserPanel fileChooser_; private CtuluUI ui_; - private FileFormatVersionInterface[] ffs_; + private MdlCasierExporter[] exporters_; BuRadioButton rbAllLayers_; BuRadioButton rbSelectedLayers_; BuRadioButton rbVisibleLayers_; protected BuRadioButton rbSelectedGeometries_; - - public MdlCasierExportPanel(FileFormatVersionInterface[] _ffs, CtuluUI _ui, ZEbliCalquesPanel _pn, boolean _preselect) { + BuComboBox coFormat_; + + public MdlCasierExportPanel(MdlCasierExporter[] _exporters, CtuluUI _ui, MdlVisuPanel _pn, boolean _preselect) { pn_=_pn; - ffs_=_ffs; + exporters_=_exporters; ui_=_ui; setLayout(new BuVerticalLayout(5,true,true)); - BuLabel lbTitle=new BuLabel(FSigLib.getS("S\xE9lectionnez les semis \xE0 int\xE9grer aux casiers")); + JPanel pnFormat=new JPanel(); + pnFormat.setLayout(new BorderLayout(5,5)); + coFormat_=new BuComboBox(); + for (MdlCasierExporter exporter: _exporters) + coFormat_.addItem(exporter.getFileFormat().getFileFormat().createFileFilter().getShortDescription()); + coFormat_.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange()==ItemEvent.DESELECTED) return; + coFormatItemStateChanged(); + } + }); + + pnFormat.add(new BuLabel(FSigLib.getS("Format d'export")),BorderLayout.WEST); + pnFormat.add(coFormat_); + add(pnFormat); + + BuLabel lbTitle=new BuLabel(FSigLib.getS("S\xE9lectionnez les g\xE9om\xE9tries \xE0 int\xE9grer aux casiers")); add(lbTitle); - CalqueGISTreeModel md=new CalqueGISTreeModel(null,_pn.getDonneesCalque()); + CalqueGISTreeModel md=new CalqueGISTreeModel(null,_pn.getGroupAlti()); md.setMask(GISLib.MASK_MULTIPOINT); trLayers_=md.createView(true,true); @@ -104,16 +116,10 @@ sp.setPreferredSize(new Dimension(300,200)); add(sp); - BuFileFilter[] filters=new BuFileFilter[_ffs.length]; - for (int i=0; i<_ffs.length; i++) { - filters[i]=_ffs[i].getFileFormat().createFileFilter(); - } - final String title=FSigLib.getS("Fichier d'exportation"); fileChooser_=new CtuluFileChooserPanel(title); fileChooser_.setAllFileFilter(false); fileChooser_.setWriteMode(true); - fileChooser_.setFilter(filters); BuLabel lbFile=new BuLabel(title); JPanel pnFile=new JPanel(); @@ -141,6 +147,8 @@ rbSelectedGeometries_.setSelected(true); else rbSelectedGeometries_.setEnabled(false); + + coFormatItemStateChanged(); } /** @@ -169,6 +177,26 @@ } /** + * Changement de format d'export. + */ + private void coFormatItemStateChanged() { + CalqueGISTreeModel md=(CalqueGISTreeModel)trLayers_.getModel(); + md.setMask(getSelectedExporter().getMaskForSubSelection()); + // B.M. Oblig\xE9 de forcer le modele, je ne sais pourquoi. + trLayers_.setModel(null); + trLayers_.setModel(md); + + fileChooser_.setFilter(new BuFileFilter[]{getSelectedExporter().getFileFormat().getFileFormat().createFileFilter()}); + } + + /** + * Retourne l'exporter selectionn\xE9 + */ + public MdlCasierExporter getSelectedExporter() { + return exporters_[coFormat_.getSelectedIndex()]; + } + + /** * R\xE9affichage de la fenetre 2D en cas de selection d'un objet. * @param _geoms Les g\xE9om\xE9tries s\xE9lectionn\xE9es. * @param _zoom True si le zoom doit se faire sur les g\xE9ometries s\xE9lectionn\xE9es. @@ -225,14 +253,16 @@ @Override public boolean valide() { - if (trLayers_.getSelectionCount()==0) { - setErrorText(MdlResource.getS("Vous devez s\xE9lectionner au moins 1 semis")); + CtuluAnalyze ana=new CtuluAnalyze(); + if (!getSelectedExporter().isDataOk(getSelection(),ana)) { + setErrorText(ana.getErrors()[0].getMessage()); return false; } if (isFileOK()) return true; return false; } + private boolean isFileOK() { final File f=fileChooser_.getFile(); if (f==null) { @@ -240,16 +270,16 @@ return false; } - // Verification de l'extension - if (getFileFormat()==null) { - setErrorText(MdlResource.getS("Le fichier choisi a une extension inconnue")); + // Verification que l'extension est autoris\xE9e + if (!getSelectedExporter().getFileFormat().getFileFormat().createFileFilter().accept(getFile())) { + setErrorText(MdlResource.getS("Le fichier choisi a une extension invalide")); return false; } // Verification que le fichier n'existe pas. if(f.exists()) { - if (ui_.question(CtuluLib.getS("Attention"), CtuluLib.getS("Le fichier {0} existe d\xE9j\xE0. Voulez-vous l'\xE9craser?", - CtuluLibFile.getSansExtension(f.getName())))) + if (ui_.question(CtuluLib.getS("Attention"), CtuluLib.getS("Le fichier '{0}' existe d\xE9j\xE0. Voulez-vous l'\xE9craser?", + f.getName()))) f.delete(); else return false; @@ -324,19 +354,11 @@ return super.ok(); } + /** + * Reoutne le fichier selectionn\xE9. + * @return Le fichier. + */ public File getFile() { return fileChooser_.getFile(); } - - public FileFormatVersionInterface getFileFormat() { - File file=getFile(); - FileFormatVersionInterface ff=null; - for (int i=0; i<ffs_.length; i++) { - if (ffs_[i].getFileFormat().createFileFilter().accept(file)) { - ff=ffs_[i]; - break; - } - } - return ff; - } } \ No newline at end of file Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporter.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporter.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -26,9 +26,12 @@ import org.fudaa.ctulu.gis.GISLib; import org.fudaa.ctulu.gis.GISMultiPoint; import org.fudaa.ctulu.gis.GISPolygone; +import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.ctulu.gis.GISZoneCollectionMultiPoint; import org.fudaa.dodico.commun.DodicoLib; import org.fudaa.dodico.mascaret.io.MascaretCasierFileFormat; +import org.fudaa.dodico.rubar.io.RubarCasierFileFormat; +import org.fudaa.dodico.rubar.io.RubarCasierWriter; import org.fudaa.ebli.calque.ZScene; import org.fudaa.fudaa.modeleur.resource.MdlResource; @@ -37,22 +40,50 @@ import com.vividsolutions.jts.geom.CoordinateSequence; /** + * Un exporter de casiers de la fenetre 2D. A impl\xE9menter suivant chaque format d'exportation. * @author Bertrand Marchand * @version $Id$ */ public abstract class MdlCasierExporter { - public abstract CtuluIOOperationSynthese export(File _f, ZScene _scn, GISDataModel _mdCasiers, CtuluListSelection _selSemis); + /** + * Export des casiers. + * @param _f Le fichier casiers. + * @param _scn La scene. Utile pour la selection des g\xE9om\xE9tries a int\xE9grer. + * @param _mdCasiers Le modele des seuls contours de casier a exporter, selon l'option choisie (tous, selectionn\xE9s, etc.). + * @param _selGeom Les g\xE9om\xE9tries a int\xE9grer aux contours de casiers lors de l'export. + * @return Le resultat du traitement d'export. + */ + public abstract CtuluIOOperationSynthese export(File _f, ZScene _scn, GISDataModel _mdCasiers, CtuluListSelection _selGeom); + /** + * Retourne le file format associ\xE9 \xE0 l'exporter. + * @return Le file format. + */ public abstract FileFormatVersionInterface getFileFormat(); + /** + * Retourne le masque de saisie des g\xE9om\xE9tries a int\xE9grer dans les casiers (voir {@link GISLib}) + * @return Le mask. + */ + public abstract int getMaskForSubSelection(); + + /** + * Controle que les donn\xE9es sont valides avant de passer \xE0 la suite. + */ + public abstract boolean isDataOk(CtuluListSelection _sel, CtuluAnalyze _ana); + + /** + * Un exporter de casiers au format Mascaret. + * @author Bertrand Marchand + * @version $Id:$ + */ public static class Mascaret extends MdlCasierExporter { public CtuluIOOperationSynthese export(File _f, ZScene _scn, GISDataModel _mdCasiers, CtuluListSelection _selSemis) { GISDataModel mdCasiers=_mdCasiers; CtuluAnalyze ana=new CtuluAnalyze(); - if (mdCasiers!=null&&mdCasiers.getNumGeometries()!=0) { int nbCasiers=mdCasiers.getNumGeometries(); TIntArrayList idxConserves=new TIntArrayList(); @@ -89,70 +120,250 @@ public FileFormatVersionInterface getFileFormat() { return MascaretCasierFileFormat.getInstance(); } + + public int getMaskForSubSelection() { + return GISLib.MASK_MULTIPOINT; + } + + public boolean isDataOk(CtuluListSelection _sel, CtuluAnalyze _ana) { + if (_sel.isEmpty()) { + _ana.addError(DodicoLib.getS("Vous devez s\xE9lectionner au moins 1 semis"),-1); + return false; + } + + return true; + } + + /** + * Construit les semis internes aux casiers. En fait, on recr\xE9e des semis pour chaque contour de casier. + * Les casiers sans semis interne ou non conformes sont supprim\xE9s du mod\xE8le. + * + * @param _scn La scene. + * @param _mdCasiers Le modele des casiers. + * @param _idxConserves Les index casiers conserv\xE9s. (Parametre de retour) + * @param _selSemis La selection des semis. + * @return Les semis. + */ + private GISZoneCollectionMultiPoint buildSemis(ZScene _scn, + GISDataModel _mdCasiers, TIntArrayList _idxConserves, CtuluListSelection _selSemis, CtuluAnalyze _ana) { + + GISZoneCollectionMultiPoint zsemis=new GISZoneCollectionMultiPoint(); + zsemis.setAttributes(new GISAttributeInterface[]{GISAttributeConstants.BATHY},null); + zsemis.setAttributeIsZ(GISAttributeConstants.BATHY); + + List<Coordinate> coords=new ArrayList<Coordinate>(); + + for (int idxgeom=0; idxgeom<_mdCasiers.getNumGeometries(); idxgeom++) { + int iattr=_mdCasiers.getIndiceOf(GISAttributeConstants.TITRE); + String name=""; + if (iattr!=-1) + name=(String)_mdCasiers.getValue(iattr,idxgeom); + + coords.clear(); + GISPolygone geom=(GISPolygone)_mdCasiers.getGeometry(idxgeom); + + // On controle que le casier est conforme. + if (geom.getCoordinateSequence().size()<5) { + _ana.addWarn(DodicoLib.getS("Casier '{0}' : Le contour n'est pas conforme",name), 0); + continue; + } + + // On teste que le contour contient bien au moins 1 point. + PointInRing pir=GISLib.createPolygoneTester(geom); + + for (int j=_selSemis.getMinIndex(); j<=_selSemis.getMaxIndex(); j++) { + if (!_selSemis.isSelected(j)) continue; + + GISMultiPoint semis=(GISMultiPoint)_scn.getObject(j); + CoordinateSequence seq=semis.getCoordinateSequence(); + for (int k=0; k<seq.size(); k++) { + Coordinate c=seq.getCoordinate(k); + if (GISLib.isIn(c, geom, pir, 0)) + coords.add(c); + } + } + + // Le casier ne poss\xE8de aucun point interne => On le retire des casiers a exporter. + if (coords.size()==0) { + _ana.addWarn(MdlResource.getS("Casier '{0}' : Aucun point des semis s\xE9lectionn\xE9s ne se trouve \xE0 l'int\xE9rieur",name), -1); + continue; + } + _idxConserves.add(idxgeom); + + // Recup\xE9ration des points, et cr\xE9ation d'un semis. + GISMultiPoint semis=GISGeometryFactory.INSTANCE.createMultiPoint(coords.toArray(new Coordinate[0])); + zsemis.addGeometry(semis,null,null); + } + + return zsemis; + } } - - + /** - * Construit les semis internes aux casiers. En fait, on recr\xE9e des semis pour chaque contour de casier. - * Les casiers sans semis interne ou non conformes sont supprim\xE9s du mod\xE8le. - * - * @param _scn La scene. - * @param _mdCasiers Le modele des casiers. - * @param _idxConserves Les index casiers conserv\xE9s. (Parametre de retour) - * @param _selSemis La selection des semis. - * @return Les semis. + * Un exporter de casiers au format Rubar (MAGE). + * @author Bertrand Marchand + * @version $Id:$ */ - protected GISZoneCollectionMultiPoint buildSemis(ZScene _scn, - GISDataModel _mdCasiers, TIntArrayList _idxConserves, CtuluListSelection _selSemis, CtuluAnalyze _ana) { + public static class Rubar extends MdlCasierExporter { - GISZoneCollectionMultiPoint zsemis=new GISZoneCollectionMultiPoint(); - zsemis.setAttributes(new GISAttributeInterface[]{GISAttributeConstants.BATHY},null); - zsemis.setAttributeIsZ(GISAttributeConstants.BATHY); + public CtuluIOOperationSynthese export(File _f, ZScene _scn, GISDataModel _mdCasiers, CtuluListSelection _selNiveaux) { + GISDataModel mdCasiers=_mdCasiers; + + CtuluAnalyze ana=new CtuluAnalyze(); + CtuluIOOperationSynthese synt=new CtuluIOOperationSynthese(); + synt.setAnalyze(ana); + + if (mdCasiers==null || mdCasiers.getNumGeometries()==0) { + ana.addWarn(DodicoLib.getS("Aucun casiers \xE0 exporter"), -1); + return synt; + } + + if (!hasNoIntersectionWithContours(_scn, _mdCasiers, _selNiveaux) || + !hasNoIntersectionWithNiveaux(_scn, _mdCasiers, _selNiveaux)) { + ana.addError(DodicoLib.getS("Les lignes de niveaux s\xE9lectionn\xE9es coupent des\n"+ + "contours de casiers ou se coupent entre elles.\n" + + "Aucun casiers export\xE9"), -1); + return synt; + } + + int nbCasiers=mdCasiers.getNumGeometries(); + TIntArrayList idxConserves=new TIntArrayList(); + GISZoneCollectionLigneBrisee mdNiveaux=buildNiveaux(_scn, mdCasiers, idxConserves, _selNiveaux, ana); + + // On ne conserve du mod\xE8le que les indexs conserv\xE9s. + if (idxConserves.size()!=nbCasiers) { + mdCasiers=new GISDataModelFilterAdapter(mdCasiers, null, idxConserves.toNativeArray()); + } + + FileWriteOperationAbstract writer=getFileFormat().createWriter(); + CtuluAnalyze ana2=writer.write(new GISDataModel[]{mdCasiers, mdNiveaux}, _f, null).getAnalyze(); + ana.merge(ana2); + + if (!ana.containsErrors()&&!ana.containsFatalError()) { + if (idxConserves.size()!=nbCasiers) { + ana.addWarn(DodicoLib.getS("{0} casiers sur {1} ont \xE9t\xE9 export\xE9s", ""+idxConserves.size(), ""+nbCasiers), -1); + } + else { + ana.addInfo(DodicoLib.getS("{0} casiers sur {1} ont \xE9t\xE9 export\xE9s", ""+nbCasiers, ""+nbCasiers), -1); + } + } + + return synt; + } - List<Coordinate> coords=new ArrayList<Coordinate>(); + public FileFormatVersionInterface getFileFormat() { + return RubarCasierFileFormat.getInstance(); + } + + public int getMaskForSubSelection() { + return GISLib.MASK_POLYGONE; + } - for (int idxgeom=0; idxgeom<_mdCasiers.getNumGeometries(); idxgeom++) { - int iattr=_mdCasiers.getIndiceOf(GISAttributeConstants.TITRE); - String name=""; - if (iattr!=-1) - name=(String)_mdCasiers.getValue(iattr,idxgeom); + public boolean isDataOk(CtuluListSelection _sel, CtuluAnalyze _ana) { + return true; + } + + /** + * Test que les courbes de niveaux n'ont pas d'intersections entre elles. + * @return true si pas d'intersections avec les autres courbes de niveaux. + */ + private boolean hasNoIntersectionWithNiveaux(ZScene _scn, + GISDataModel _mdCasiers, CtuluListSelection _selNiveaux) { - coords.clear(); - GISPolygone geom=(GISPolygone)_mdCasiers.getGeometry(idxgeom); + for (int iniv1=_selNiveaux.getMinIndex(); iniv1<=_selNiveaux.getMaxIndex(); iniv1++) { + if (!_selNiveaux.isSelected(iniv1)) continue; + GISPolygone niv1=(GISPolygone)_scn.getObject(iniv1); + + // Test avec les courbes de niveaux + for (int iniv2=iniv1+1; iniv2<=_selNiveaux.getMaxIndex(); iniv2++) { + if (!_selNiveaux.isSelected(iniv2)) continue; + GISPolygone niv2=(GISPolygone)_scn.getObject(iniv2); + if (niv2.intersects(niv1)) return false; + } + } + return true; + } + + /** + * Test que les courbes de niveaux n'ont pas d'intersections avec les contours de casiers. + * @return true si pas d'intersections avec les contours. + */ + private boolean hasNoIntersectionWithContours(ZScene _scn, + GISDataModel _mdCasiers, CtuluListSelection _selNiveaux) { - // On controle que le casier est conforme. - if (geom.getCoordinateSequence().size()<5) { - _ana.addWarn(DodicoLib.getS("Casier '{0}' : Le contour n'est pas conforme",name), 0); - continue; + for (int iniv1=_selNiveaux.getMinIndex(); iniv1<=_selNiveaux.getMaxIndex(); iniv1++) { + if (!_selNiveaux.isSelected(iniv1)) continue; + GISPolygone niv1=(GISPolygone)_scn.getObject(iniv1); + + // Test avec les casiers + for (int j=0; j<_mdCasiers.getNumGeometries(); j++) { + GISPolygone casier=(GISPolygone)_mdCasiers.getGeometry(j); + if (casier.intersects(niv1)) return false; + } } + return true; + } + + /** + * Construit les lignes de niveau internes aux casiers. + * Les casiers non conformes sont supprim\xE9s du mod\xE8le. + * + * @param _scn La scene. + * @param _mdCasiers Le modele des casiers. + * @param _idxConserves Les index casiers conserv\xE9s. (Parametre de retour) + * @param _selNiveaux La selection des lignes de niveau. + * @return Les semis. + */ + private GISZoneCollectionLigneBrisee buildNiveaux(ZScene _scn, + GISDataModel _mdCasiers, TIntArrayList _idxConserves, CtuluListSelection _selNiveaux, CtuluAnalyze _ana) { - // On teste que le contour contient bien au moins 1 point. - PointInRing pir=GISLib.createPolygoneTester(geom); + GISZoneCollectionLigneBrisee zniveaux=new GISZoneCollectionLigneBrisee(); + zniveaux.setAttributes(new GISAttributeInterface[]{GISAttributeConstants.BATHY,RubarCasierWriter.INDEX_CASIER},null); + zniveaux.setAttributeIsZ(GISAttributeConstants.BATHY); - for (int j=_selSemis.getMinIndex(); j<=_selSemis.getMaxIndex(); j++) { - if (!_selSemis.isSelected(j)) continue; + List<Coordinate> coords=new ArrayList<Coordinate>(); + + for (int idxgeom=0; idxgeom<_mdCasiers.getNumGeometries(); idxgeom++) { + int iattr=_mdCasiers.getIndiceOf(GISAttributeConstants.TITRE); + String name=""; + if (iattr!=-1) + name=(String)_mdCasiers.getValue(iattr,idxgeom); - GISMultiPoint semis=(GISMultiPoint)_scn.getObject(j); - CoordinateSequence seq=semis.getCoordinateSequence(); - for (int k=0; k<seq.size(); k++) { - Coordinate c=seq.getCoordinate(k); - if (GISLib.isIn(c, geom, pir, 0)) - coords.add(c); + coords.clear(); + GISPolygone geom=(GISPolygone)_mdCasiers.getGeometry(idxgeom); + + // On controle que le casier est conforme (tous les points du contour on m\xEAme Z) + if (!GISLib.isNiveau(geom.getCoordinateSequence())) { + _ana.addWarn(DodicoLib.getS("Casier '{0}' : Le contour n'est pas conforme (Z non constant)",name), 0); + continue; } + + // On recherche a quel contour appartient chaque ligne de niveau. A ce stade, les courbes de niveaux ne se coupent pas entre + // elles, et ne coupent pas de contours. + PointInRing pir=GISLib.createPolygoneTester(geom); + + for (int j=_selNiveaux.getMinIndex(); j<=_selNiveaux.getMaxIndex(); j++) { + if (!_selNiveaux.isSelected(j)) continue; + + GISPolygone niv=(GISPolygone)_scn.getObject(j); + CoordinateSequence seq=niv.getCoordinateSequence(); + // Une coordonn\xE9e dans le contour => La ligne de niveau appartient au contour. + Coordinate c=seq.getCoordinate(0); + if (GISLib.isIn(c, geom, pir, 0)) { + zniveaux.addGeometry(niv,new Object[]{null,new Integer(idxgeom)},null); + } + } + + _idxConserves.add(idxgeom); + + // Recup\xE9ration des points, et cr\xE9ation d'un semis. +// GISMultiPoint semis=GISGeometryFactory.INSTANCE.createMultiPoint(coords.toArray(new Coordinate[0])); +// zniveaux.addGeometry(semis,null,null); } - // Le casier ne poss\xE8de aucun point interne => On le retire des casiers a exporter. - if (coords.size()==0) { - _ana.addWarn(MdlResource.getS("Casier '{0}' : Aucun point des semis s\xE9lectionn\xE9s ne se trouve \xE0 l'int\xE9rieur",name), -1); - continue; - } - _idxConserves.add(idxgeom); - - // Recup\xE9ration des points, et cr\xE9ation d'un semis. - GISMultiPoint semis=GISGeometryFactory.INSTANCE.createMultiPoint(coords.toArray(new Coordinate[0])); - zsemis.addGeometry(semis,null,null); + // Pour intiailiser la BATHY. + zniveaux.postImport(0); + return zniveaux; } - - return zsemis; } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporterFilter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporterFilter.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporterFilter.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -19,11 +19,11 @@ import org.fudaa.fudaa.modeleur.layer.MdlLayer2dCasier; /** - * Un filtre qui retourne un modele de donn\xE9es pour des calques/g\xE9om\xE9tries selectionn\xE9es + * Un filtre qui retourne un modele de casiers pour des calques/g\xE9om\xE9tries selectionn\xE9es * de l'arbre des calques. * * @author Bertrand Marchand - * @version $Id:$ + * @version $Id$ */ public class MdlCasierExporterFilter implements BCalqueVisitor { @@ -73,8 +73,17 @@ * aucune donn\xE9e r\xE9cup\xE9r\xE9e apr\xE8s filtre. */ public GISDataModel filter() { + // On transfert dans les zones casier les Z de l'attribut vers la coordonn\xE9e. + mdTree_.getRootCalque().apply(new BCalqueVisitor() { + public boolean visit(BCalque _cq) { + if (_cq instanceof MdlLayer2dCasier) { + ((MdlLayer2dCasier)_cq).modeleDonnees().getGeomData().prepareExport(); + } + return true; + } + }); + zones.clear(); - if (isOnlyOnSelectedLayers_) { final BCalque[] parent=mdTree_.getSelection(); if (parent!=null) Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -202,4 +202,8 @@ changeState(bt.getActionCommand()); } } + + public MdlVisuPanel getPanel() { + return (MdlVisuPanel)super.getPanel(); + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -118,6 +118,13 @@ return /*parent_*/null; } + /** + * Retourne le groupe des calques de donn\xE9es altim\xE9triques + */ + public BGroupeCalque getGroupAlti() { + return cqAlti_; + } + public void importImage() { // actImport_.actionPerformed(null); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java 2009-03-23 13:58:06 UTC (rev 4564) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java 2009-03-24 15:34:57 UTC (rev 4565) @@ -9,7 +9,9 @@ import java.awt.event.ActionEvent; import java.io.File; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import org.fudaa.ctulu.CtuluIOOperationSynthese; import org.fudaa.ctulu.CtuluLib; @@ -21,13 +23,11 @@ import org.fudaa.ebli.calque.ZCalqueGeometry; import org.fudaa.ebli.calque.ZModeleGeometry; import org.fudaa.ebli.calque.ZScene; -import org.fudaa.ebli.calque.ZSelectionEvent; -import org.fudaa.ebli.calque.ZSelectionListener; import org.fudaa.ebli.commun.EbliActionSimple; import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.MdlCasierExportPanel; import org.fudaa.fudaa.modeleur.MdlCasierExporter; import org.fudaa.fudaa.modeleur.MdlCasierExporterFilter; -import org.fudaa.fudaa.modeleur.MdlCasierExportPanel; import org.fudaa.fudaa.modeleur.MdlEditionManager; import org.fudaa.fudaa.modeleur.resource.MdlResource; import org.fudaa.fudaa.ressource.FudaaResource; @@ -47,12 +47,10 @@ } public void actionPerformed(final ActionEvent _e) { - MdlCasierExporter exporter; - // Les formats de fichier casiers exportables. - HashMap<FileFormatVersionInterface, MdlCasierExporter> ff2Exporter=new HashMap<FileFormatVersionInterface, MdlCasierExporter>(); - ff2Exporter.put((exporter=new MdlCasierExporter.Mascaret()).getFileFormat(),exporter); - - FileFormatVersionInterface[] ffs=ff2Exporter.keySet().toArray(new FileFormatVersionInterface[0]); + // Les exporters de fichier casiers. + MdlCasierExporter[] exporters=new MdlCasierExporter[2]; + exporters[0]=new MdlCasierExporter.Rubar(); + exporters[1]=new MdlCasierExporter.Mascaret(); ZScene scn=editor_.getSupport(); boolean bpreselect= @@ -60,7 +58,7 @@ !scn.isSelectionEmpty() && containsOnlyCasiers(); - MdlCasierExportPanel pn=new MdlCasierExportPanel(ffs,editor_.getUi(),editor_.getPanel(),bpreselect); + MdlCasierExportPanel pn=new MdlCasierExportPanel(exporters,editor_.getUi(),editor_.getPanel(),bpreselect); if (pn.afficheModaleOk(editor_.getFrame(), FudaaLib.getS("Export de casiers"))) { // R\xE9cup\xE9ration du modele des casiers a exporter. @@ -70,9 +68,11 @@ flt.setTreatmentOnlyOnSelectedLayers(pn.isExportOnSelectedLayers()); GISDataModel mdCasiers=flt.filter(); + // Exporter et fichier selectionn\xE9s. File f=pn.getFile(); - exporter=ff2Exporter.get(pn.getFileFormat()); + MdlCasierExporter exporter=pn.getSelectedExporter(); + // Export. CtuluIOOperationSynthese synt=exporter.export(f,scn,mdCasiers,pn.getSelection()); editor_.getUi().manageErrorOperationAndIsFatal(synt); } @@ -82,6 +82,10 @@ return CtuluLib.getS("S\xE9lectionner des casiers."); } + /** + * Controle que la selection ne contient que des contours de casiers. + * @return + */ public boolean containsOnlyCasiers() { ZScene scn=editor_.getSupport(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |