From: <bma...@us...> - 2009-03-16 09:43:05
|
Revision: 4547 http://fudaa.svn.sourceforge.net/fudaa/?rev=4547&view=rev Author: bmarchan Date: 2009-03-16 09:42:56 +0000 (Mon, 16 Mar 2009) Log Message: ----------- Export casiers Mascaret Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/fileformat/FileFormatVersionInterface.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.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/ZScene.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/commun/impl/FudaaCommonImplementation.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/layer/MdlModel2dCasier.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierFileFormat.java branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierWriter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java 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/MdlCasierExporter.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/fileformat/FileFormatVersionInterface.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/fileformat/FileFormatVersionInterface.java 2009-03-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/fileformat/FileFormatVersionInterface.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -14,6 +14,8 @@ /** + * Une interface d\xE9finissant un format de fichier. Elle permet d'acc\xE9der a la classe d'\xE9criture/lecture de ce format + * de fichier. * @author Fred Deniger * @version $Id: FileFormatVersionInterface.java,v 1.3 2006-02-09 08:59:30 deniger Exp $ */ Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java 2009-03-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -60,6 +60,8 @@ public final static String ATT_NATURE_RV="RV"; /** Nature limite de stockage */ public final static String ATT_NATURE_LS="LS"; + /** Nature casier */ + public final static String ATT_NATURE_CA="CA"; /** * Un attribut nom, global. 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-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISLib.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -222,7 +222,31 @@ } return false; } + + /** + * Teste qu'une coordonn\xE9e est a l'interieur d'un polygone. + * @param _c La coordonn\xE9e + * @param _poly Le polygone. + * @param _ptInRing Le tester correspondant au polygone. A utiliser lorsque la m\xE9thode est appel\xE9e pour un grand nombre de + * points pour optimiser la vitesse de recherche. Peut \xEAtre null. + * @param _tolerance La tol\xE9rance pour la recherche. Peut \xEAtre = 0. + * @return True : La coordonn\xE9e _c est a l'interieur du polygone. + */ + public static boolean isIn(final Coordinate _c, final GISPolygone _poly, PointInRing _ptInRing, double _tolerance) { + Envelope env=_poly.getEnvelopeInternal(); + PointInRing pir=_ptInRing; + if (pir==null) + pir=new SIRtreePointInRing(_poly); + + // La boite englobante && le pir contiennent le point... + if (env.contains(_c) && pir.isInside(_c)) return true; + // ... ou le point est a une distance inferieure a tol\xE9rance du polygone. + if (_tolerance>0 && getDistanceFromFrontier(_poly.getCoordinateSequence(), _c)<=_tolerance) + return true; + return false; + } + public static int isInIdx(final Coordinate _c, final Envelope[] _env, final PointInRing[] _ptInRing) { if (_env == null || _ptInRing == null || _c == null) { return -1; @@ -335,6 +359,13 @@ return r; } + public static PointInRing createPolygoneTester(final LinearRing _a) { + if (_a == null) { + return null; + } + return new SIRtreePointInRing(_a); + } + /** * @param _seq la sequence de coordonn\xE9es * @param _coord les coordonn\xE9es du point a tester Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierFileFormat.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierFileFormat.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierFileFormat.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -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.mascaret.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 Mascaret Casiers + * @author Bertrand Marchand + * @version $Id$ + */ +public class MascaretCasierFileFormat extends FileFormatUnique { + + public MascaretCasierFileFormat() { + super(1); + nom_ = DodicoLib.getS("Mascaret casiers"); + description_ = H2dResource.getS("Fichier contenant des casiers g\xE9or\xE9f\xE9renc\xE9s"); + extensions_=new String[]{"casieref"}; + } + static final MascaretCasierFileFormat INSTANCE = new MascaretCasierFileFormat(); + + /** + * @return singleton + */ + public static MascaretCasierFileFormat getInstance() { + return INSTANCE; + } + + public FileReadOperationAbstract createReader() { + return null; + } + + public FileWriteOperationAbstract createWriter() { + return new MascaretCasierWriter(); + } + +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierFileFormat.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierWriter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierWriter.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierWriter.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -0,0 +1,81 @@ +/* + * @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.mascaret.io; + +import java.io.PrintWriter; + +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; +import org.fudaa.ctulu.gis.GISDataModel; +import org.fudaa.dodico.commun.DodicoLib; +import org.fudaa.dodico.fortran.FileOpWriterCharSimpleAbstract; + +import com.vividsolutions.jts.geom.CoordinateSequence; + +/** + * Une classe pour ecrire des casiers au format Mascaret. + * + * @author Bertrand Marchand + * @version $Id$ + */ +public class MascaretCasierWriter extends FileOpWriterCharSimpleAbstract { + + /** + * Ecrit les casiers. Les casiers sont consid\xE9r\xE9s conformes, c'est a dire a plus de 4 points et un point semis. + * param _o Un tableau GISDataModel[2]. + * [0] : le modele des contours de casiers + * [1] : le modele des multipoints internes aux casiers, dans le m\xEAme ordre que les casiers. + */ + protected void internalWrite(final Object _o) { + if (!(_o instanceof GISDataModel[]) || ((GISDataModel[])_o).length!=2) { + donneesInvalides(_o); + return; + } + + GISDataModel casiers=((GISDataModel[])_o)[0]; + GISDataModel semis=((GISDataModel[])_o)[1]; + if (casiers.getNumGeometries()!=semis.getNumGeometries()) { + analyze_.addError(DodicoLib.getS("Chaque casier doit contenir au moins un semis"), -1); + return; + } + + final int attName=casiers.getIndiceOf(GISAttributeConstants.TITRE); + + final PrintWriter writer = new PrintWriter(out_); + + try { + for (int i = 0; i < casiers.getNumGeometries(); i++) { + CoordinateSequence seqCas=((GISCoordinateSequenceContainerInterface) casiers.getGeometry(i)).getCoordinateSequence(); + CoordinateSequence seqSemis=((GISCoordinateSequenceContainerInterface) semis.getGeometry(i)).getCoordinateSequence(); + + String name; + if (attName==-1||(name=(String)casiers.getValue(attName, i))==null) name="C"+(i+1); + + writer.println("Casier "+name); + // Les points du contour. + for (int k = 0; k < seqCas.size(); k++) { + double x=seqCas.getOrdinate(k,0); + double y=seqCas.getOrdinate(k,1); + double z=seqCas.getOrdinate(k,2); + writer.println(x+" "+y+" "+z+" F"); + } + // Les points internes + for (int k = 0; k < seqSemis.size(); k++) { + double x=seqSemis.getOrdinate(k,0); + double y=seqSemis.getOrdinate(k,1); + double z=seqSemis.getOrdinate(k,2); + writer.println(x+" "+y+" "+z+" I"); + } + } + + } catch (final Exception _evt) { + analyze_.manageException(_evt); + } + + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/dodico/src/org/fudaa/dodico/mascaret/io/MascaretCasierWriter.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java 2009-03-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -237,7 +237,6 @@ public boolean isOnlyOnIndexSelected() { boolean b=false; for (ZCalqueAffichageDonneesInterface cq :getTargetLayers()) { -// for (CtuluListSelectionInterface list : lists_) { if (cq.getLayerSelection().isOnlyOnIndexSelected()) { if (!b) b=true; else return false; @@ -255,11 +254,11 @@ public boolean isSelected(int _idx) { int idecal=0; ZCalqueAffichageDonneesInterface[] cqs=getTargetLayers(); - for (int i=0; i<cqs.length-1; i++) { - if (_idx <= cqs[i].getLayerSelection().getMaxIndex()+idecal) { - return cqs[i].getLayerSelection().isSelected(_idx-idecal); + for (ZCalqueAffichageDonneesInterface cq :getTargetLayers()) { + if (_idx <= cq.getLayerSelection().getMaxIndex()+idecal) { + return cq.getLayerSelection().isSelected(_idx-idecal); } - idecal+=cqs[i].modeleDonnees().getNombre(); + idecal+=cq.modeleDonnees().getNombre(); } return false; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/commun/impl/FudaaCommonImplementation.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/commun/impl/FudaaCommonImplementation.java 2009-03-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/commun/impl/FudaaCommonImplementation.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -995,10 +995,10 @@ return true; } else if (_analyze.containsErrors()) error(_analyze.getDesc(), CtuluAnalyze.getResume(_analyze.getErrorCanal(), 5), false); + else if (_analyze.containsWarnings()) + warn(FudaaLib.getS("Attention"), CtuluAnalyze.getResume(_analyze.getWarnCanal(), 20), false); else if (_analyze.containsInfos()) message(FudaaLib.getS("Informations"), CtuluAnalyze.getResume(_analyze.getInfoCanal(), 20), false); - else if (_analyze.containsWarnings()) - warn(FudaaLib.getS("Attention"), CtuluAnalyze.getResume(_analyze.getWarnCanal(), 20), false); return false; } Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -0,0 +1,298 @@ +/* + * @creation 8 sept. 06 + * @modification $Date: 2009-03-10 17:37:38 +0100 (mar., 10 mars 2009) $ + * @license GNU General Public License 2 + * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail de...@fu... + */ +package org.fudaa.fudaa.modeleur; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.io.File; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.TreePath; + +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; +import org.fudaa.ebli.trace.TraceLigne; +import org.fudaa.ebli.trace.TraceLigneModel; +import org.fudaa.ebli.trace.TraceSurface; +import org.fudaa.ebli.trace.TraceSurfaceModel; +import org.fudaa.fudaa.modeleur.resource.MdlResource; +import org.fudaa.fudaa.sig.FSigLib; + +import com.memoire.bu.BuFileFilter; +import com.memoire.bu.BuLabel; +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; + +/** + * Un panneau de saisie des g\xE9om\xE9tries altim\xE9triques pour l'export de casiers. + * @author Bertrand Marchand + * @version $Id$ + */ +public class MdlCasiersExportPanel extends CtuluDialogPanel { + + private ZEbliCalquesPanel pn_; + private GrBoite initZoom_; + private JTree trLayers_; + private ZCalqueGeometry cqTmp_; + private GISZoneCollection support_; + private CtuluListSelection sel_=new CtuluListSelection(); + private CtuluFileChooserPanel fileChooser_; + private CtuluUI ui_; + private FileFormatVersionInterface[] ffs_; + + public MdlCasiersExportPanel(FileFormatVersionInterface[] _ffs, CtuluUI _ui, ZEbliCalquesPanel _pn) { + pn_=_pn; + ffs_=_ffs; + ui_=_ui; + setLayout(new BuVerticalLayout(5,true,true)); + + BuLabel lbTitle=new BuLabel(FSigLib.getS("S\xE9lectionnez les semis \xE0 int\xE9grer aux casiers")); + add(lbTitle); + + CalqueGISTreeModel md=new CalqueGISTreeModel(null,_pn.getDonneesCalque()); + md.setMask(GISLib.MASK_MULTIPOINT); + trLayers_=md.createView(true,true); + + trLayers_.addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(TreeSelectionEvent e) { + treeSelectionChanged(getSelectedGeomInTree(),true); + } + }); + JScrollPane sp=new JScrollPane(trLayers_); + 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(); + pnFile.setLayout(new BorderLayout(3, 3)); + pnFile.add(lbFile, BorderLayout.WEST); + pnFile.add(fileChooser_, BorderLayout.CENTER); + add(pnFile); + } + + /** + * Retourne les indexs s\xE9lectionn\xE9es de la scene. + * @return Les indexs sous la forme d'une liste. + */ + private CtuluListSelection getSelectedGeomInTree() { + sel_.clear(); + + if (trLayers_.isSelectionEmpty()) { + return sel_; + } + + ZScene scn=pn_.getScene(); + + TreePath[] selpaths=trLayers_.getSelectionPaths(); + for (int i=0; i<selpaths.length; i++) { + final CalqueGISTreeModel.LayerNode node=(CalqueGISTreeModel.LayerNode)selpaths[i].getLastPathComponent(); + final ZCalqueAffichageDonneesAbstract cq = (ZCalqueAffichageDonneesAbstract) node.getUserObject(); + final int idx=node.getIdxGeom(); + + sel_.add(scn.layerId2SceneId(cq,idx)); + } + + return sel_; + } + + /** + * 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. + */ + private void treeSelectionChanged(final CtuluListSelection _sel, final boolean _zoom) { + if (pn_==null) { + return; + } + if (_sel == null || _sel.isEmpty()) { + if (cqTmp_ != null) { + cqTmp_.setVisible(false); + } + return; + } + + ZModeleGeometryDefault mdl=new ZModeleGeometryDefault(); + support_=mdl.getGeomData(); + ZScene scn=pn_.getScene(); + + for (int i=_sel.getMinIndex(); i<=_sel.getMaxIndex(); i++) { + if (!_sel.isSelected(i)) continue; + support_.addGeometry((Geometry)scn.getObject(i), null, null); + } + + // Ajout de l'enveloppe externe pour visualisation. + Geometry g=support_.convexHull(); + if (g instanceof Polygon) + support_.addGeometry(((Polygon)g).getExteriorRing(), null, null); + else + support_.addGeometry(g, null, null); + + if (cqTmp_ == null) { + initZoom_ = pn_.getVueCalque().getViewBoite(); + cqTmp_ = new ZCalqueGeometry(mdl); + cqTmp_.setDestructible(true); + final TraceIconModel model = new TraceIconModel(TraceIcon.PLUS_DOUBLE, 4, Color.RED); + cqTmp_.setIconModel(0, model); + cqTmp_.setIconModel(1, model); + final TraceLigneModel ligne = new TraceLigneModel(TraceLigne.INVISIBLE, 2, Color.RED); + cqTmp_.setLineModel(0, ligne); + cqTmp_.setLineModel(1, ligne); + final TraceSurfaceModel surfMdl=new TraceSurfaceModel(TraceSurface.UNIFORME,new Color(255,50,0,40),null); + cqTmp_.setSurfaceModel(0,surfMdl); + pn_.getVueCalque().getCalque().enPremier(cqTmp_); + pn_.getCqInfos().enPremier(); + } + cqTmp_.modele(mdl); + cqTmp_.setVisible(true); + + if (_zoom) { + BArbreCalqueModel.actionCenter(cqTmp_, pn_); + } + } + + @Override + public boolean valide() { + if (trLayers_.getSelectionCount()==0) { + setErrorText(MdlResource.getS("Vous devez s\xE9lectionner au moins 1 semis")); + return false; + } + if (isFileOK()) + return true; + return false; + } + private boolean isFileOK() { + final File f=fileChooser_.getFile(); + if (f==null) { + setErrorText(MdlResource.getS("Donnez un nom au fichier d'exportation")); + return false; + } + + // Verification de l'extension + if (getFileFormat()==null) { + setErrorText(MdlResource.getS("Le fichier choisi a une extension inconnue")); + 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())))) + f.delete(); + else + return false; + } + + if (CtuluLibFile.getExtension(CtuluLibFile.getSansExtension(f.getName()))!=null) { + setErrorText(CtuluLib.getS("Ne mettez pas plusieurs '.' dans le nom.")); + return false; + } + setErrorText(null); + return true; + } + + /** + * Retourne la selection. Elle peut \xEAtre vide. + */ + public CtuluListSelection getSelection() { + return sel_; + } + + /** + * Retourne le modele des g\xE9om\xE9tries supports (les g\xE9om\xE9tries s\xE9l\xE9ectionn\xE9es dans l'arbre). + * @return Le mod\xE8le. + */ +// public GISDataModel getSupportCollection() { +// support_.setAttributes(new GISAttributeInterface[]{GISAttributeConstants.BATHY}, null); +// support_.setAttributeIsZ(GISAttributeConstants.BATHY); +// support_.postImport(0); +// return support_; +// } + + /** + * Fermeture du dialogue, et suppression du calque qui visualise les g\xE9om\xE9tries s\xE9lectionn\xE9es. + */ + private void close() { + if (cqTmp_!=null) { + cqTmp_.detruire(); + cqTmp_=null; + // Suppression de l'enveloppe externe. + support_.removeGeometries(new int[]{support_.getNbGeometries()-1}, null); + pn_.getVueCalque().getCalque().repaint(); + } + pn_.getVueCalque().changeRepere(this, initZoom_); + } + + @Override + public void cancel() { + close(); + super.cancel(); + } + + @Override + public boolean ok() { + close(); + return super.ok(); + } + + 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 Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native 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-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -22,6 +22,7 @@ import org.fudaa.fudaa.commun.impl.FudaaCommonImplementation; import org.fudaa.fudaa.modeleur.action.CalqueDeleteCalqueAction; import org.fudaa.fudaa.modeleur.action.CalqueNewCalqueAction; +import org.fudaa.fudaa.modeleur.action.MdlCasierExportAction; import org.fudaa.fudaa.modeleur.action.SceneShowLabelAction; import org.fudaa.fudaa.modeleur.layer.MdlLayer1dAxe; import org.fudaa.fudaa.modeleur.layer.MdlLayer1dBank; @@ -96,11 +97,13 @@ protected EbliActionInterface[] getActionsInterface(){ EbliActionInterface[] actions=super.getActionsInterface(); - EbliActionInterface[] allActions=new EbliActionInterface[actions.length+2]; + EbliActionInterface[] allActions=new EbliActionInterface[actions.length+4]; + allActions[0]=null; + allActions[1]=new MdlCasierExportAction((MdlEditionManager)gisEditor_); + allActions[2]=new SceneShowOrientationAction(gisEditor_.getPanel().getArbreCalqueModel()); + allActions[3]=new SceneShowLabelAction(gisEditor_.getPanel().getArbreCalqueModel()); for(int i=0;i<actions.length;i++) - allActions[i]=actions[i]; - allActions[allActions.length-2]=new SceneShowOrientationAction(gisEditor_.getPanel().getArbreCalqueModel()); - allActions[allActions.length-1]=new SceneShowLabelAction(gisEditor_.getPanel().getArbreCalqueModel()); + allActions[i+4]=actions[i]; return allActions; } Added: 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 (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -0,0 +1,105 @@ +/* + * @creation 26 nov. 2008 + * @modification $Date: 2009-03-06 15:58:09 +0100 (ven., 06 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.fudaa.modeleur.action; + +import java.awt.event.ActionEvent; +import java.io.File; +import java.util.HashMap; + +import org.fudaa.ctulu.CtuluIOOperationSynthese; +import org.fudaa.ctulu.CtuluLib; +import org.fudaa.ctulu.fileformat.FileFormatVersionInterface; +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISZoneCollection; +import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; +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.MdlCasiersExportPanel; +import org.fudaa.fudaa.modeleur.MdlEditionManager; +import org.fudaa.fudaa.ressource.FudaaResource; + + +/** + * Une action pour exporter des casiers. + * @author Bertrand Marchand + */ +public class MdlCasierExportAction extends EbliActionSimple implements ZSelectionListener { + MdlEditionManager editor_; + + public MdlCasierExportAction(MdlEditionManager _editor) { + super(FudaaResource.FUDAA.getString("Exporter les casiers"), null, "EXPORT_CASIER"); + setDefaultToolTip(FudaaResource.FUDAA.getString("Exporte les casiers s\xE9lectionn\xE9s")); + setEnabled(false); + editor_=_editor; + editor_.getSupport().addSelectionListener(this); + } + + 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]); + + MdlCasiersExportPanel pn=new MdlCasiersExportPanel(ffs,editor_.getUi(),editor_.getPanel()); + if (pn.afficheModaleOk(editor_.getFrame(), FudaaLib.getS("Export de casiers"))) { + ZScene scn=editor_.getSupport(); + File f=pn.getFile(); + exporter=ff2Exporter.get(pn.getFileFormat()); + + CtuluIOOperationSynthese synt=exporter.export(f,scn,scn.getLayerSelection(),pn.getSelection()); + editor_.getUi().manageErrorOperationAndIsFatal(synt); + } + } + + public void updateForSelectionChanged() { + ZScene scn=editor_.getSupport(); + + // Si la selection est en mode global et que seuls des casiers sont selectionn\xE9s. + setEnabled( + !scn.isAtomicMode() && + !scn.isSelectionEmpty() && + containsOnlyCasiers()); + } + + public String getEnableCondition() { + return CtuluLib.getS("S\xE9lectionner des casiers."); + } + + public boolean containsOnlyCasiers() { + ZScene scn=editor_.getSupport(); + + for (int i=scn.getLayerSelection().getMinIndex(); i<=scn.getLayerSelection().getMinIndex(); i++) { + if (!scn.getLayerSelection().isSelected(i)) continue; + + ZCalqueAffichageDonneesInterface calque=scn.getLayerForId(i); + int idGeom=scn.sceneId2LayerId(i); + + if(!(calque instanceof ZCalqueGeometry)) return false; + + GISZoneCollection zone=((ZModeleGeometry)calque.modeleDonnees()).getGeomData(); + int iattNat=zone.getIndiceOf(GISAttributeConstants.NATURE); + if (iattNat==-1||!zone.getValue(iattNat, idGeom).equals(GISAttributeConstants.ATT_NATURE_CA)) + return false; + } + return true; + } + + /* (non-Javadoc) + * @see org.fudaa.ebli.calque.ZSelectionListener#selectionChanged(org.fudaa.ebli.calque.ZSelectionEvent) + */ + public void selectionChanged(ZSelectionEvent _evt) { + updateForSelectionChanged(); + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExporter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExporter.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExporter.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -0,0 +1,201 @@ +/* + * @creation 11 mars 2009 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2009 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.fudaa.modeleur.action; + +import gnu.trove.TIntArrayList; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; + +import org.fudaa.ctulu.CtuluAnalyze; +import org.fudaa.ctulu.CtuluIOOperationSynthese; +import org.fudaa.ctulu.CtuluListSelection; +import org.fudaa.ctulu.CtuluListSelectionInterface; +import org.fudaa.ctulu.fileformat.FileFormatVersionInterface; +import org.fudaa.ctulu.fileformat.FileWriteOperationAbstract; +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISDataModel; +import org.fudaa.ctulu.gis.GISDataModelFilterAdapter; +import org.fudaa.ctulu.gis.GISDataModelMultiAdapter; +import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISLib; +import org.fudaa.ctulu.gis.GISMultiPoint; +import org.fudaa.ctulu.gis.GISPolygone; +import org.fudaa.ctulu.gis.GISZoneCollection; +import org.fudaa.ctulu.gis.GISZoneCollectionMultiPoint; +import org.fudaa.dodico.commun.DodicoLib; +import org.fudaa.dodico.mascaret.io.MascaretCasierFileFormat; +import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; +import org.fudaa.ebli.calque.ZCalqueGeometry; +import org.fudaa.ebli.calque.ZModeleGeometry; +import org.fudaa.ebli.calque.ZScene; +import org.fudaa.fudaa.modeleur.resource.MdlResource; + +import com.vividsolutions.jts.algorithm.PointInRing; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.CoordinateSequence; +import com.vividsolutions.jts.geom.Geometry; + +/** + * @author Bertrand Marchand + * @version $Id:$ + */ +public abstract class MdlCasierExporter { + + public abstract CtuluIOOperationSynthese export(File _f, ZScene _scn, CtuluListSelectionInterface _selCasiers, CtuluListSelection _selSemis); + + public abstract FileFormatVersionInterface getFileFormat(); + + static class Mascaret extends MdlCasierExporter { + + public CtuluIOOperationSynthese export(File _f, ZScene _scn, CtuluListSelectionInterface _selCasiers, CtuluListSelection _selSemis) { + CtuluListSelection selCasiers=new CtuluListSelection(_selCasiers); + CtuluAnalyze ana=new CtuluAnalyze(); + + int nbCasiers=_selCasiers.getNbSelectedIndex(); + GISZoneCollectionMultiPoint mdSemis=buildSemis(_scn, selCasiers, _selSemis, ana); + if (mdSemis.getNumGeometries()!=0) { + GISDataModel mdCasiers=getCasiersDataModel(_scn, selCasiers); + + FileWriteOperationAbstract writer=getFileFormat().createWriter(); + CtuluAnalyze ana2=writer.write(new GISDataModel[]{mdCasiers,mdSemis}, _f, null).getAnalyze(); + ana.merge(ana2); + } + + if (!ana.containsErrors()&&!ana.containsFatalError()) { + if (nbCasiers>mdSemis.getNumGeometries()) { + ana.addWarn(DodicoLib.getS("{0} casiers sur {1} ont \xE9t\xE9 export\xE9s", ""+mdSemis.getNumGeometries(), ""+nbCasiers), -1); + } + else { + ana.addInfo(DodicoLib.getS("{0} casiers sur {1} ont \xE9t\xE9 export\xE9s", ""+mdSemis.getNumGeometries(), ""+nbCasiers), -1); + } + } + + CtuluIOOperationSynthese synt=new CtuluIOOperationSynthese(); + synt.setAnalyze(ana); + return synt; + } + + public FileFormatVersionInterface getFileFormat() { + return MascaretCasierFileFormat.getInstance(); + } + } + + /** + * Recuperation du data model des casiers. + */ + protected GISDataModel getCasiersDataModel(ZScene _scn, CtuluListSelection _selcasiers) { + // Association entre une zone et les indexs selectionn\xE9s sur celle ci + class ZoneComposite { + GISZoneCollection zone; + TIntArrayList idxs=new TIntArrayList(); + + public ZoneComposite(GISZoneCollection _zone) { + zone=_zone; + } + } + + // R\xE9cup\xE9ration des zones des casiers et indexs selectionn\xE9s. + List<ZoneComposite> comps=new ArrayList<ZoneComposite>(); + for (int i=_selcasiers.getMinIndex(); i<=_selcasiers.getMaxIndex(); i++) { + if (_selcasiers.isSelected(i)) { + GISZoneCollection zone=((ZCalqueGeometry)_scn.getLayerForId(i)).modeleDonnees().getGeomData(); + ZoneComposite comp; + if (comps.size()==0 || comps.get(comps.size()-1).zone!=zone) { + comp=new ZoneComposite(zone); + comps.add(comp); + } + else { + comp=comps.get(comps.size()-1); + } + comp.idxs.add(_scn.sceneId2LayerId(i)); + } + } + + int i=0; + GISDataModel[] models=new GISDataModel[comps.size()]; + for (ZoneComposite comp : comps) { + comp.zone.prepareExport(); + models[i++]=new GISDataModelFilterAdapter(comp.zone,null,comp.idxs.toNativeArray()); + } + return new GISDataModelMultiAdapter(models); + } + + /** + * 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 de la selection. + * + * @param _scn La scene. + * @param _selCasiers La selection des casiers. + * @param _selSemis La selection des semis. + * @return Les semis. + */ + protected GISZoneCollectionMultiPoint buildSemis(ZScene _scn, + CtuluListSelection _selCasiers, 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 i=_selCasiers.getMinIndex(); i<=_selCasiers.getMaxIndex(); i++) { + if (!_selCasiers.isSelected(i)) continue; + + GISZoneCollection zone=((ZCalqueGeometry)_scn.getLayerForId(i)).modeleDonnees().getGeomData(); + int idxgeom=_scn.sceneId2LayerId(i); + int iattr=zone.getIndiceOf(GISAttributeConstants.TITRE); + String name=""; + if (iattr!=-1) + name=(String)zone.getValue(iattr,idxgeom); + + coords.clear(); + GISPolygone geom=(GISPolygone)zone.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); + _selCasiers.remove(i); + 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); + _selCasiers.remove(i); + continue; + } + + // 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; + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExporter.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dCasier.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dCasier.java 2009-03-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dCasier.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -39,6 +39,6 @@ // Pas de container de commande pour cette op\xE9ration, sinon conserv\xE9 en undo/redo. getGeomData().setAttributes(attrs, null); getGeomData().setAttributeIsZ(GISAttributeConstants.BATHY); - getGeomData().setFixedAttributeValue(GISAttributeConstants.NATURE, GISAttributeConstants.ATT_NATURE_ZN); + getGeomData().setFixedAttributeValue(GISAttributeConstants.NATURE, GISAttributeConstants.ATT_NATURE_CA); } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java 2009-03-16 09:36:48 UTC (rev 4546) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java 2009-03-16 09:42:56 UTC (rev 4547) @@ -18,7 +18,6 @@ import org.fudaa.ctulu.fileformat.FileFormatVersionInterface; import org.fudaa.ctulu.gui.CtuluDialogPanel; import org.fudaa.ctulu.gui.CtuluFileChooserPanel; -import org.fudaa.fudaa.commun.FudaaLib; import org.fudaa.fudaa.modeleur.resource.MdlResource; import org.fudaa.fudaa.sig.FSigLib; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |