From: <bma...@us...> - 2009-03-16 14:47:57
|
Revision: 4548 http://fudaa.svn.sourceforge.net/fudaa/?rev=4548&view=rev Author: bmarchan Date: 2009-03-16 14:47:47 +0000 (Mon, 16 Mar 2009) Log Message: ----------- Exports casiers des calques selectionn?\195?\169s vers MAscaret. Modified Paths: -------------- 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 branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java Added Paths: ----------- 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/resource/exporter-casier.png branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/resource/new-casier.png Removed Paths: ------------- 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/MdlCasierExporter.java Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java (from rev 4547, branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java) =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExportPanel.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -0,0 +1,342 @@ +/* + * @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.ButtonGroup; +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.commun.FudaaLib; +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.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; + +/** + * Un panneau de saisie des g\xE9om\xE9tries altim\xE9triques pour l'export de casiers. + * @author Bertrand Marchand + * @version $Id$ + */ +public class MdlCasierExportPanel 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_; + BuRadioButton rbAllLayers_; + BuRadioButton rbSelectedLayers_; + BuRadioButton rbVisibleLayers_; + protected BuRadioButton rbSelectedGeometries_; + + public MdlCasierExportPanel(FileFormatVersionInterface[] _ffs, CtuluUI _ui, ZEbliCalquesPanel _pn, boolean _preselect) { + 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); + + rbAllLayers_=new BuRadioButton(FudaaLib.getS("Exporter les casiers de tous les calques")); + rbSelectedLayers_=new BuRadioButton(FudaaLib.getS("Exporter les casiers des calques s\xE9lectionn\xE9s (et leurs sous-calques)")); + rbVisibleLayers_=new BuRadioButton(FudaaLib.getS("Exporter les casiers des seuls calques visibles")); + rbSelectedGeometries_=new BuRadioButton(FudaaLib.getS("Exporter les casiers selectionn\xE9s")); + add(rbAllLayers_); + add(rbSelectedLayers_); + add(rbVisibleLayers_); + add(rbSelectedGeometries_); + ButtonGroup bgLayers=new ButtonGroup(); + bgLayers.add(rbAllLayers_); + bgLayers.add(rbSelectedLayers_); + bgLayers.add(rbVisibleLayers_); + bgLayers.add(rbSelectedGeometries_); + + rbAllLayers_.setSelected(true); + if (_preselect) + rbSelectedGeometries_.setSelected(true); + else + rbSelectedGeometries_.setEnabled(false); + } + + /** + * 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_; + } + + /** + * L'export se fait-il sur tous les calques casiers. + */ + public boolean isExportOnAllLayers() { + return rbAllLayers_.isSelected(); + } + + /** + * L'export se fait-il sur les calques casiers selectionn\xE9s uniquement. + */ + public boolean isExportOnSelectedLayers() { + return rbSelectedLayers_.isSelected(); + } + + /** + * L'export se fait-il sur les calques casiers visibles uniquement. + */ + public boolean isExportOnVisibleLayers() { + return rbVisibleLayers_.isSelected(); + } + + /** + * L'export se fait-il sur les casiers selectionn\xE9s uniquement. + */ + public boolean isExportOnSelectedGeometries() { + return rbSelectedGeometries_.isSelected(); + } + + /** + * 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 Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporter.java (from rev 4547, 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/MdlCasierExporter.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporter.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -0,0 +1,158 @@ +/* + * @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; + +import gnu.trove.TIntArrayList; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.fudaa.ctulu.CtuluAnalyze; +import org.fudaa.ctulu.CtuluIOOperationSynthese; +import org.fudaa.ctulu.CtuluListSelection; +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.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISLib; +import org.fudaa.ctulu.gis.GISMultiPoint; +import org.fudaa.ctulu.gis.GISPolygone; +import org.fudaa.ctulu.gis.GISZoneCollectionMultiPoint; +import org.fudaa.dodico.commun.DodicoLib; +import org.fudaa.dodico.mascaret.io.MascaretCasierFileFormat; +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; + +/** + * @author Bertrand Marchand + * @version $Id$ + */ +public abstract class MdlCasierExporter { + + public abstract CtuluIOOperationSynthese export(File _f, ZScene _scn, GISDataModel _mdCasiers, CtuluListSelection _selSemis); + + public abstract FileFormatVersionInterface getFileFormat(); + + 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(); + GISZoneCollectionMultiPoint mdSemis=buildSemis(_scn, mdCasiers, idxConserves, _selSemis, ana); + if (mdSemis.getNumGeometries()!=0) { + // 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, 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); + } + } + } + else { + ana.addWarn(DodicoLib.getS("Aucun casiers \xE0 exporter"), -1); + } + + CtuluIOOperationSynthese synt=new CtuluIOOperationSynthese(); + synt.setAnalyze(ana); + return synt; + } + + public FileFormatVersionInterface getFileFormat() { + return MascaretCasierFileFormat.getInstance(); + } + } + + + /** + * 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. + */ + protected 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; + } +} Added: 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 (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporterFilter.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -0,0 +1,116 @@ +/* + * @creation 16 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; + +import java.util.ArrayList; +import java.util.List; + +import org.fudaa.ctulu.gis.GISDataModel; +import org.fudaa.ctulu.gis.GISDataModelFilterAdapter; +import org.fudaa.ctulu.gis.GISDataModelMultiAdapter; +import org.fudaa.ebli.calque.BArbreCalqueModel; +import org.fudaa.ebli.calque.BCalque; +import org.fudaa.ebli.calque.BCalqueVisitor; +import org.fudaa.fudaa.modeleur.layer.MdlLayer2dCasier; + +/** + * Un filtre qui retourne un modele de donn\xE9es pour des calques/g\xE9om\xE9tries selectionn\xE9es + * de l'arbre des calques. + * + * @author Bertrand Marchand + * @version $Id:$ + */ +public class MdlCasierExporterFilter implements BCalqueVisitor { + + boolean isOnlyOnSelectedLayers_; + boolean isOnlyOnVisibleLayers_; + boolean isOnlyOnSelectedGeometries_; + BArbreCalqueModel mdTree_; + List<GISDataModel> zones=new ArrayList<GISDataModel>(); + + + public MdlCasierExporterFilter(BArbreCalqueModel _mdTree) { + mdTree_=_mdTree; + } + + public boolean visit(BCalque _cq) { + if (_cq instanceof MdlLayer2dCasier) { + MdlLayer2dCasier cq=(MdlLayer2dCasier)_cq; + GISDataModel md; + + // Si pas visible on passe. + if (isOnlyOnVisibleLayers_ && !_cq.isVisible()) + return true; + // Si pas de g\xE9om\xE9tries on passe. + if (cq.modeleDonnees().getNombre()==0) + return true; + + md=cq.modeleDonnees().getGeomData(); + + if (isOnlyOnSelectedGeometries_) { + // Si pas de g\xE9om\xE9tries selectionn\xE9es on passe. + if (cq.isSelectionEmpty()) + return true; + + // Si des g\xE9om\xE9tries s\xE9lectionn\xE9es, on trie. + if (cq.getNbSelected()!=cq.modeleDonnees().getNombre()) { + int[] sel=cq.getSelectedIndex(); + md=new GISDataModelFilterAdapter(md,null,sel); + } + } + zones.add(md); + } + return true; + } + + /** + * Lance le traitement et retourne le modele de data en cons\xE9quence. Peut \xEAtre null si + * aucune donn\xE9e r\xE9cup\xE9r\xE9e apr\xE8s filtre. + */ + public GISDataModel filter() { + zones.clear(); + + if (isOnlyOnSelectedLayers_) { + final BCalque[] parent=mdTree_.getSelection(); + if (parent!=null) + for (int i=0; i<parent.length; i++) + parent[i].apply(this); + } + else { + mdTree_.getRootCalque().apply(this); + } + + if (zones.size()==0) + return null; + else + return new GISDataModelMultiAdapter(zones.toArray(new GISDataModel[0])); + } + + /** + * Le traitement ne s'applique qu'aux seuls calques s\xE9l\xE9ectionn\xE9s. + * @param _b True : Uniquement les calques visibles sont consid\xE9r\xE9s. + */ + public void setTreatmentOnlyOnSelectedLayers(boolean _b) { + isOnlyOnSelectedLayers_=_b; + } + + /** + * Le traitement ne s'applique qu'aux seuls calques visibles. + * @param _b True : Uniquement les calques visibles sont consid\xE9r\xE9s. + */ + public void setTreatmentOnlyOnVisibleLayers(boolean _b) { + isOnlyOnVisibleLayers_=_b; + } + + /** + * Le traitement s'applique uniquement aux g\xE9om\xE9tries selectionn\xE9es. + */ + public void setTreatmentOnlySelectedGeometries(boolean _b) { + isOnlyOnSelectedGeometries_=_b; + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasierExporterFilter.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Deleted: 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 2009-03-16 09:42:56 UTC (rev 4547) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCasiersExportPanel.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -1,298 +0,0 @@ -/* - * @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 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:42:56 UTC (rev 4547) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -8,11 +8,14 @@ package org.fudaa.fudaa.modeleur; import java.awt.event.ActionEvent; +import java.util.List; import javax.swing.Action; import org.fudaa.ebli.calque.BGroupeCalque; +import org.fudaa.ebli.calque.ZEbliCalquePanelController; import org.fudaa.ebli.calque.ZSelectionEvent; +import org.fudaa.ebli.calque.action.EbliCalqueActionVariableChooser; import org.fudaa.ebli.calque.action.SceneShowOrientationAction; import org.fudaa.ebli.commun.EbliActionInterface; import org.fudaa.ebli.commun.EbliActionMap; @@ -81,6 +84,11 @@ mng_=editor.getMng(); return editor; } + + protected void initButtonGroupSpecific(final List<EbliActionInterface> _l, final ZEbliCalquePanelController _res) { + super.initButtonGroupSpecific(_l, _res); + _l.add(new MdlCasierExportAction((MdlEditionManager)gisEditor_)); + } protected BuMenu[] createSpecificMenus(final String _title) { BuMenu[] ret=new BuMenu[3]; @@ -99,7 +107,6 @@ EbliActionInterface[] actions=super.getActionsInterface(); 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++) 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-16 09:42:56 UTC (rev 4547) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExportAction.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -15,6 +15,7 @@ import org.fudaa.ctulu.CtuluLib; import org.fudaa.ctulu.fileformat.FileFormatVersionInterface; import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISDataModel; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; import org.fudaa.ebli.calque.ZCalqueGeometry; @@ -24,8 +25,11 @@ 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.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; @@ -33,15 +37,13 @@ * Une action pour exporter des casiers. * @author Bertrand Marchand */ -public class MdlCasierExportAction extends EbliActionSimple implements ZSelectionListener { +public class MdlCasierExportAction extends EbliActionSimple { 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); + super(FudaaResource.FUDAA.getString("Exporter les casiers..."), MdlResource.MDL.getIcon("exporter-casier"), "EXPORT_CASIER"); + setDefaultToolTip(FudaaResource.FUDAA.getString("Exporte les casiers de la vue 2D")); editor_=_editor; - editor_.getSupport().addSelectionListener(this); } public void actionPerformed(final ActionEvent _e) { @@ -52,27 +54,30 @@ FileFormatVersionInterface[] ffs=ff2Exporter.keySet().toArray(new FileFormatVersionInterface[0]); - MdlCasiersExportPanel pn=new MdlCasiersExportPanel(ffs,editor_.getUi(),editor_.getPanel()); + ZScene scn=editor_.getSupport(); + boolean bpreselect= + !scn.isAtomicMode() && + !scn.isSelectionEmpty() && + containsOnlyCasiers(); + + MdlCasierExportPanel pn=new MdlCasierExportPanel(ffs,editor_.getUi(),editor_.getPanel(),bpreselect); if (pn.afficheModaleOk(editor_.getFrame(), FudaaLib.getS("Export de casiers"))) { - ZScene scn=editor_.getSupport(); + + // R\xE9cup\xE9ration du modele des casiers a exporter. + MdlCasierExporterFilter flt=new MdlCasierExporterFilter(editor_.getPanel().getArbreCalqueModel()); + flt.setTreatmentOnlySelectedGeometries(pn.isExportOnSelectedGeometries()); + flt.setTreatmentOnlyOnVisibleLayers(pn.isExportOnVisibleLayers()); + flt.setTreatmentOnlyOnSelectedLayers(pn.isExportOnSelectedLayers()); + GISDataModel mdCasiers=flt.filter(); + File f=pn.getFile(); exporter=ff2Exporter.get(pn.getFileFormat()); - CtuluIOOperationSynthese synt=exporter.export(f,scn,scn.getLayerSelection(),pn.getSelection()); + CtuluIOOperationSynthese synt=exporter.export(f,scn,mdCasiers,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."); } @@ -95,11 +100,4 @@ } return true; } - - /* (non-Javadoc) - * @see org.fudaa.ebli.calque.ZSelectionListener#selectionChanged(org.fudaa.ebli.calque.ZSelectionEvent) - */ - public void selectionChanged(ZSelectionEvent _evt) { - updateForSelectionChanged(); - } } Deleted: 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 2009-03-16 09:42:56 UTC (rev 4547) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/MdlCasierExporter.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -1,201 +0,0 @@ -/* - * @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; - } -} Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/resource/exporter-casier.png =================================================================== (Binary files differ) Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/resource/exporter-casier.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: svn:keywords + Id Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/resource/new-casier.png =================================================================== (Binary files differ) Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/resource/new-casier.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java 2009-03-16 09:42:56 UTC (rev 4547) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java 2009-03-16 14:47:47 UTC (rev 4548) @@ -121,7 +121,7 @@ /** * @return un tableau contenant les actions sp\xE9cifiques \xE0 l'application qui - * seront dans le menu Vue2D. + * seront dans le menu Vue2D (et pas dans la barre d'outils). */ protected EbliActionInterface[] getActionsInterface(){ return new EbliActionInterface[] { @@ -155,7 +155,7 @@ return theme_; } - protected void initButtonGroupSpecific(final List _l, final ZEbliCalquePanelController _res) {} + protected void initButtonGroupSpecific(final List<EbliActionInterface> _l, final ZEbliCalquePanelController _res) {} /** * Pour etre accessible depuis inner classes. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |