From: <emm...@us...> - 2009-01-21 17:31:02
|
Revision: 4390 http://fudaa.svn.sourceforge.net/fudaa/?rev=4390&view=rev Author: emmanuel_martin Date: 2009-01-21 17:30:56 +0000 (Wed, 21 Jan 2009) Log Message: ----------- Tache #128 "On aimerait pouvoir copier des g?\195?\169om?\195?\169tries/sommets vers un calque sans passer par une duplication" Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZSceneEditor.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/MdlFille2d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/CutCopyPasteManager.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/ZDialog.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZSceneEditor.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZSceneEditor.java 2009-01-21 16:06:25 UTC (rev 4389) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZSceneEditor.java 2009-01-21 17:30:56 UTC (rev 4390) @@ -11,7 +11,6 @@ import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluCommandManager; import org.fudaa.ctulu.CtuluUI; -import org.fudaa.ebli.calque.ZCalqueAffichageDonnees; import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; import org.fudaa.ebli.calque.ZEbliCalquesPanel; import org.fudaa.ebli.calque.ZScene; 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-01-21 16:06:25 UTC (rev 4389) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/commun/impl/FudaaCommonImplementation.java 2009-01-21 17:30:56 UTC (rev 4390) @@ -320,6 +320,16 @@ act=replaceItemByAction("DUPLIQUER"); act.setEnabled(false); if (act!=null) EbliActionMap.getInstance().addAction(act); + + act=replaceItemByAction("COUPER"); + act.setEnabled(false); + if (act!=null) EbliActionMap.getInstance().addAction(act); + act=replaceItemByAction("COLLER"); + act.setEnabled(false); + if (act!=null) EbliActionMap.getInstance().addAction(act); + act=replaceItemByAction("COPIER"); + act.setEnabled(false); + if (act!=null) EbliActionMap.getInstance().addAction(act); } /** Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/CutCopyPasteManager.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/CutCopyPasteManager.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/CutCopyPasteManager.java 2009-01-21 17:30:56 UTC (rev 4390) @@ -0,0 +1,309 @@ +/* + * @creation 21 janv. 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.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.event.InternalFrameAdapter; +import javax.swing.event.InternalFrameEvent; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; + +import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISAttributeModel; +import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; +import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISLib; +import org.fudaa.ctulu.gis.GISZoneCollection; +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.calque.dessin.DeForme; +import org.fudaa.ebli.calque.edition.ZCalqueEditable; +import org.fudaa.ebli.calque.edition.ZModeleEditable; +import org.fudaa.ebli.commun.EbliActionInterface; +import org.fudaa.ebli.commun.EbliActionMap; +import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.layer.MdlModel2dLine; +import org.fudaa.fudaa.modeleur.layer.MdlModel2dMultiPoint; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.CoordinateSequence; +import com.vividsolutions.jts.geom.Geometry; + +/** + * G\xE8re les fonctions de couper/coller/copier de la fen\xEAtre 2d. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class CutCopyPasteManager { + /** La fen\xEAtre 2d \xE0 g\xE9rer. */ + protected MdlFille2d mdlFille2d_; + /** La sc\xE8ne permettant l'acc\xE8s sur les g\xE9om\xE9tries et les selections. */ + protected ZScene zScene_; + /** L'editeur de sc\xE8ne contenant les m\xE9thodes pour le d\xE9placement des g\xE9om\xE9tries. */ + protected MdlSceneEditor zSceneEditor_; + /** Copy action interface */ + protected EbliActionInterface copyAction_; + /** Cut action interface */ + protected EbliActionInterface cutAction_; + /** Paste action interface */ + protected EbliActionInterface pasteAction_; + /** Les mod\xE8les contennant les g\xE9om\xE9tries en cours de copy. */ + protected List<ZModeleGeometry> models_=new ArrayList<ZModeleGeometry>(); + /** Les points selectionn\xE9s pour la copy en mode sommet. */ + protected List<Coordinate> coordinates_=new ArrayList<Coordinate>(); + // Les gestionnaires d'\xE9v\xE9nements \\ + protected EventFrameManager eventManager1_; + protected EventSelectedGeometriesManager eventManager2_; + protected EventSelectedCalquesManager eventManager3_; + + /** + * Mise \xE0 jour correcte de bouton copier/coller/couper lors des diff\xE9rente + * manipulation de la fen\xEAtre. + */ + protected class EventFrameManager extends InternalFrameAdapter { + public boolean blockPaste_=false; + public boolean blockCopy_=false; + public boolean blockCut_=false; + + public void internalFrameActivated(InternalFrameEvent e) { + blockPaste_=false; + blockCopy_=false; + blockCut_=false; + updateButtons(); + } + + public void internalFrameDeactivated(InternalFrameEvent e) { + blockPaste_=true; + blockCopy_=true; + blockCut_=true; + updateButtons(); + } + } + + /** + * Mise \xE0 jour des boutons en fonction de la selection qui est faite dans les + * calques. + */ + protected class EventSelectedGeometriesManager implements ZSelectionListener { + public boolean blockPaste_=false; + public boolean blockCopy_=false; + public boolean blockCut_=false; + + public void selectionChanged(ZSelectionEvent _evt) { + blockCopy_=zScene_.isSelectionEmpty(); + blockCut_=zScene_.isSelectionEmpty()||zScene_.isAtomicMode(); + updateButtons(); + } + } + + /** + * Mise \xE0 jour de du bouton 'coller' en fonction du calque selectionn\xE9 dans + * l'arbre des calques. + */ + protected class EventSelectedCalquesManager implements TreeSelectionListener { + public boolean blockPaste_=false; + public boolean blockCopy_=false; + public boolean blockCut_=false; + + public void valueChanged(TreeSelectionEvent e) { + blockCut_=!(mdlFille2d_.getArbreCalqueModel().getSelectedCalque() instanceof ZCalqueEditable); + blockCopy_=blockCut_; + blockPaste_=blockCut_; + updateButtons(); + } + } + + public CutCopyPasteManager(MdlFille2d _mdlFille2d, MdlSceneEditor _zSceneEditor) { + mdlFille2d_=_mdlFille2d; + zScene_=_zSceneEditor.getScene(); + zSceneEditor_=_zSceneEditor; + copyAction_=EbliActionMap.getInstance().getAction("COPIER"); + cutAction_=EbliActionMap.getInstance().getAction("COUPER"); + pasteAction_=EbliActionMap.getInstance().getAction("COLLER"); + // Verification de la pr\xE9sence des actions + if (copyAction_==null||cutAction_==null||pasteAction_==null) + throw new IllegalArgumentException(FudaaLib + .getS("Les actions n\xE9c\xE9ssaire aux fonctionnalit\xE9s de couper/copier/coller n'ont pas \xE9t\xE9 trouv\xE9s.")); + // Mise en place des diff\xE9rentes \xE9coutes + eventManager1_=new EventFrameManager(); + eventManager2_=new EventSelectedGeometriesManager(); + eventManager3_=new EventSelectedCalquesManager(); + mdlFille2d_.addInternalFrameListener(eventManager1_); + zScene_.addSelectionListener(eventManager2_); + mdlFille2d_.getArbreCalqueModel().addTreeSelectionListener(eventManager3_); + // Initialisation des valeurs de blockage des boutons. + eventManager2_.selectionChanged(null); + eventManager3_.valueChanged(null); + } + + /** + * Active les boutons qui doivent l'\xEAtre. + */ + protected void updateButtons() { + copyAction_.setEnabled(!eventManager1_.blockCopy_&&!eventManager2_.blockCopy_&&!eventManager3_.blockCopy_); + pasteAction_.setEnabled((models_.size()>0||coordinates_.size()>0)&&!eventManager1_.blockPaste_&&!eventManager2_.blockPaste_&&!eventManager3_.blockPaste_); + cutAction_.setEnabled(!eventManager1_.blockCut_&&!eventManager2_.blockCut_&&!eventManager3_.blockCut_); + } + + public void copy() { + models_.clear(); + coordinates_.clear(); + if (zScene_.isAtomicMode()) { + // Copy en mode atomic \\ + int[] idxScene=zScene_.getLayerSelectionMulti().getIdxSelected(); + if (idxScene!=null) { + for(int i=0;i<idxScene.length;i++) { + // Extraction des informations sur la zone + GISZoneCollection zone=((ZModeleEditable) zScene_.getLayerForId(idxScene[i]).modeleDonnees()).getGeomData(); + GISAttributeInterface attrZ=zone.getAttributeIsZ(); + int idxAttrZ=-1; + if(attrZ!=null) + idxAttrZ=zone.getIndiceOf(zone.getAttributeIsZ()); + // La g\xE9om\xE9trie \xE0 traiter + CoordinateSequence seqGeom=zone.getCoordinateSequence(zScene_.sceneId2LayerId(idxScene[i])); + int[] selectedIdx=zScene_.getLayerSelectionMulti().getSelection(idxScene[i]).getSelectedIndex(); + // Extraction des coordonn\xE9es + for(int j=0;j<selectedIdx.length;j++) { + Coordinate coord=seqGeom.getCoordinate(selectedIdx[j]); + if(attrZ!=null) { + if(attrZ.isAtomicValue()) + coord.z=(Double) ((GISAttributeModel) zone.getValue(idxAttrZ, zScene_.sceneId2LayerId(idxScene[i]))).getObjectValueAt(selectedIdx[j]); + else + coord.z=(Double) zone.getValue(selectedIdx[j], idxAttrZ); + } + coordinates_.add(coord); + } + } + } + } + else { + // Copy en mode global \\ + int[] idxScene=zScene_.getLayerSelection().getSelectedIndex(); + if (idxScene!=null) { + // Tri des g\xE9om\xE9tries en fonction de leur calque d'origine + Map<ZCalqueEditable, List<Integer>> selectedGeom=new HashMap<ZCalqueEditable, List<Integer>>(); + for (int i=0; i<idxScene.length; i++) { + ZCalqueEditable calque=(ZCalqueEditable)zScene_.getLayerForId(idxScene[i]); + if (!selectedGeom.containsKey(calque)) + selectedGeom.put(calque, new ArrayList<Integer>()); + selectedGeom.get(calque).add(zScene_.sceneId2LayerId(idxScene[i])); + } + // Cr\xE9ation des mod\xE8les de cache + for (Map.Entry<ZCalqueEditable, List<Integer>> entry : selectedGeom.entrySet()) { + // Cr\xE9ation du mod\xE8le + ZModeleEditable modelSource=entry.getKey().getModelEditable(); + ZModeleEditable modelCache=null; + if (modelSource instanceof MdlModel2dMultiPoint) + modelCache=new MdlModel2dMultiPoint(null); + else if (modelSource instanceof MdlModel2dLine) + modelCache=new MdlModel2dLine(null); + modelCache.getGeomData().setAttributes(modelSource.getGeomData().getAttributes(), null); + // Remplissage du mod\xE8le + for (int i=0; i<entry.getValue().size(); i++) { + int idxGeom=zScene_.sceneId2LayerId(entry.getValue().get(i)); + Geometry geom=modelSource.getGeomData().getGeometry(idxGeom); + GISAttributeModel[] models=modelSource.getGeomData().getModels(); + Object[] data=new Object[models.length]; + for (int j=0; j<data.length; j++) + data[j]=models[j].getObjectValueAt(idxGeom); + modelCache.getGeomData().addGeometry(geom, data, null); + } + // Ajout du mod\xE8le de cache + models_.add(modelCache); + } + } + } + updateButtons(); + } + + public void cut() { + copy(); + zSceneEditor_.removeSelectedObjects(mdlFille2d_.getCmdMng()); + } + + public void paste() { + try { + CtuluCommandComposite cmd; + // Collage de g\xE9om\xE9trie + if (models_.size()>0) { + cmd=new CtuluCommandComposite(FudaaLib.getS("Coller des g\xE9om\xE9tries")); + for (int i=0; i<models_.size(); i++) { + int[] idxSource=new int[models_.get(i).getNombre()]; + for (int j=0; j<idxSource.length; j++) + idxSource[j]=j; + zSceneEditor_.moveGeometries(models_.get(i), idxSource, (ZCalqueEditable)zScene_.getCalqueActif(), cmd); + } + } + // Collage de points + else { + cmd=new CtuluCommandComposite(FudaaLib.getS("Coller des points")); + ZCalqueEditable calque=((ZCalqueEditable)zScene_.getCalqueActif()); + ZModeleEditable modele=(ZModeleEditable)calque.modeleDonnees(); + GISZoneCollection zone=modele.getGeomData(); + GISAttributeInterface attrZ=zone.getAttributeIsZ(); + int idxAttrZ=-1; + if (attrZ!=null) + idxAttrZ=zone.getIndiceOf(attrZ); + // Cr\xE9ation de la g\xE9om\xE9trie + CoordinateSequence coordSeq=new GISCoordinateSequenceFactory().create(coordinates_.toArray(new Coordinate[0])); + Geometry geom=null; + if (modele instanceof MdlModel2dMultiPoint) + geom=GISGeometryFactory.INSTANCE.createMultiPoint(coordSeq); + else if (modele instanceof MdlModel2dLine) { + boolean isFerme=coordSeq.getCoordinate(0).equals(coordSeq.getCoordinate(coordSeq.size()-1)); + if ((calque.canAddForme(DeForme.LIGNE_BRISEE)&&!isFerme)||!calque.canAddForme(DeForme.POLYGONE)) { + if (coordSeq.size()<2) + throw new IllegalArgumentException(FudaaLib.getS("Il faut au moins deux points pour coller en temps que polyligne.")); + geom=GISLib.toPolyligne(coordSeq); + } + else { + if (coordSeq.size()<2) + throw new IllegalArgumentException(FudaaLib.getS("Il faut au moins trois points pour coller en temps que polygone.")); + geom=GISLib.toPolygone(coordSeq); + } + } + // Cr\xE9ation de l'attribut z + Object[] data=new Object[zone.getNbAttributes()]; + if (attrZ!=null) + if (attrZ.isAtomicValue()) { + data[idxAttrZ]=new double[coordSeq.size()]; + for (int i=0; i<coordSeq.size(); i++) + ((double[])data[idxAttrZ])[i]=coordSeq.getOrdinate(i, 2); + } + else { + boolean allSame=true; + int i=0; + while (allSame&&++i<coordSeq.size()) + allSame=coordSeq.getOrdinate(i-1, 2)==coordSeq.getOrdinate(i, 2); + if (allSame) + data[idxAttrZ]=coordSeq.getOrdinate(0, 2); + else { + ZDialog dialog =new ZDialog(mdlFille2d_.getVisuPanel().getEditor().getFrame(), FudaaLib.getS("Choisissez un Z")); + dialog.setVisible(true); + data[idxAttrZ]=dialog.getValue(); + } + } + // Ajout de la g\xE9om\xE9trie + zone.addGeometry(geom, data, cmd); + } + if (mdlFille2d_.getCmdMng()!=null) + mdlFille2d_.getCmdMng().addCmd(cmd.getSimplify()); + } + catch (IllegalArgumentException _exp) { + mdlFille2d_.getVisuPanel().getController().getUI().error(_exp.getMessage()); + } + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/CutCopyPasteManager.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlFille2d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlFille2d.java 2009-01-21 16:06:25 UTC (rev 4389) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlFille2d.java 2009-01-21 17:30:56 UTC (rev 4390) @@ -9,11 +9,6 @@ import java.awt.Dimension; -import com.db4o.ObjectContainer; - -import com.memoire.bu.BuCutCopyPasteInterface; -import com.memoire.bu.BuUndoRedoInterface; - import org.fudaa.ctulu.CtuluCommandManager; import org.fudaa.ctulu.CtuluExportDataInterface; import org.fudaa.ctulu.CtuluUI; @@ -21,15 +16,17 @@ import org.fudaa.ctulu.ProgressionInterface; import org.fudaa.ctulu.image.CtuluImageImporter; import org.fudaa.ctulu.image.CtuluImageProducer; - import org.fudaa.ebli.calque.ZEbliFilleCalques; - import org.fudaa.fudaa.commun.impl.FudaaCommonImplementation; import org.fudaa.fudaa.commun.save.FudaaFilleVisuPersistence; import org.fudaa.fudaa.commun.save.FudaaSavable; import org.fudaa.fudaa.commun.save.FudaaSaveZipWriter; import org.fudaa.fudaa.sig.FSigResource; +import com.db4o.ObjectContainer; +import com.memoire.bu.BuCutCopyPasteInterface; +import com.memoire.bu.BuUndoRedoInterface; + /** * La fenetre interne vue 2D des donn\xE9es du modeleur. Elle construit le composant arbre de * calques {@link org.fudaa.ebli.calque.BArbreCalque}. La plupart des traitements est @@ -42,11 +39,15 @@ public class MdlFille2d extends ZEbliFilleCalques implements BuUndoRedoInterface, CtuluExportDataInterface, CtuluImageImporter, CtuluUndoRedoInterface, FudaaSavable, BuCutCopyPasteInterface { + /** Le gestionnaire de couper/coller/copier de la fen\xEAtre. */ + protected CutCopyPasteManager cutCopyPasteManager_; + public MdlFille2d(FudaaCommonImplementation _ui) { super(new MdlVisuPanel(_ui), _ui, null); setName("mdlMainFille"); setTitle(FSigResource.FSIG.getString("Vue 2D")); setPreferredSize(new Dimension(500, 400)); + cutCopyPasteManager_=new CutCopyPasteManager(this, (MdlSceneEditor) getMdlVisuPanel().getEditor().getSceneEditor()); } public void saveIn(final FudaaSaveZipWriter _writer, final ProgressionInterface _prog) { @@ -96,13 +97,20 @@ } - public void copy() {} + public void copy() { + cutCopyPasteManager_.copy(); + } - public void cut() {} + public void cut() { + cutCopyPasteManager_.cut(); + } public void duplicate() { getMdlVisuPanel().duplicate(); } - public void paste() {} + public void paste() { + cutCopyPasteManager_.paste(); + } + } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2009-01-21 16:06:25 UTC (rev 4389) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2009-01-21 17:30:56 UTC (rev 4390) @@ -23,6 +23,7 @@ import javax.swing.JPanel; import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluListSelection; import org.fudaa.ctulu.CtuluListSelectionInterface; import org.fudaa.ctulu.collection.CtuluCollection; @@ -141,125 +142,99 @@ } /** - * D\xE9place les g\xE9om\xE9tries s\xE9lectionn\xE9es dans le calque cible. + * D\xE9place des g\xE9om\xE9tries d'un mod\xE8le vers un calque. */ - public void moveInLayerSelectedGeometries() { - ZModeleGeometry mdldest=(ZModeleGeometry)((ZCalqueAffichageDonneesInterface)getScene().getCalqueActif()).modeleDonnees(); - if(mdldest==null) - return; - GISZoneCollection coldest=mdldest.getGeomData(); - if(coldest==null) - return; + public void moveGeometries(ZModeleGeometry _mldSource, int[] _idxSource, ZCalqueEditable _calqueDestination, CtuluCommandContainer _cmd) { + if(_mldSource==null||_idxSource==null||_calqueDestination==null) + throw new IllegalArgumentException(FudaaLib.getS("Aucun des param\xE8tres ne doit \xEAtre null.")); - int[] idxGeom=getScene().getLayerSelection().getSelectedIndex(); - Geometry[] geoms=new Geometry[idxGeom.length]; - for (int i=0; i<idxGeom.length; i++) { - geoms[i]=(Geometry)getScene().getObject(idxGeom[i]); - } + GISZoneCollection zoneSource=_mldSource.getGeomData(); + GISZoneCollection zoneDestination=_calqueDestination.getModelEditable().getGeomData(); + + Geometry[] geoms=new Geometry[_idxSource.length]; + for (int i=0; i<_idxSource.length; i++) + geoms[i]=zoneSource.getGeometry(_idxSource[i]); - final CtuluCommandComposite cmp = new CtuluCommandComposite(FudaaLib.getS("D\xE9placer dans calque cible")); + final CtuluCommandComposite cmp = new CtuluCommandComposite(FudaaLib.getS("D\xE9placement de g\xE9om\xE9tries")); // Controle sur le nombre de point minimum - ZCalqueEditable calque=(ZCalqueEditable)getScene().getCalqueActif(); - if(calque.canAddForme(DeForme.POLYGONE)&&!calque.canAddForme(DeForme.LIGNE_BRISEE)) - for (Geometry g : geoms) { - if (g.getNumPoints()<3) { - ui_.error(FudaaLib.getS("Vous ne pouvez pas d\xE9placer ces g\xE9om\xE9tries.\nUne au moins est constitu\xE9e de moins de 3 points.")); - return; - } + if (_calqueDestination.canAddForme(DeForme.POLYGONE)&&!_calqueDestination.canAddForme(DeForme.LIGNE_BRISEE)) { + int nbProbGeom=0; + for (Geometry g : geoms) + if (g.getNumPoints()<3) + nbProbGeom++; + if (nbProbGeom>0) { + ui_.error(FudaaLib.getS("Vous ne pouvez pas d\xE9placer ces g\xE9om\xE9tries.\n")+Integer.toString(nbProbGeom) + +FudaaLib.getS(" g\xE9om\xE9trie(s) a/ont moins de 3 points.")); + return; } - else if(calque.canAddForme(DeForme.LIGNE_BRISEE)) - for (Geometry g : geoms) { - if (g.getNumPoints()<2) { - ui_.error(FudaaLib.getS("Vous ne pouvez pas d\xE9placer ces g\xE9om\xE9tries.\nUne au moins est constitu\xE9e de moins de 2 points.")); - return; - } + } + else if (_calqueDestination.canAddForme(DeForme.LIGNE_BRISEE)) { + int nbProbGeom=0; + for (Geometry g : geoms) + if (g.getNumPoints()<2) + nbProbGeom++; + if (nbProbGeom>0) { + ui_.error(FudaaLib.getS("Vous ne pouvez pas d\xE9placer ces g\xE9om\xE9tries.\n")+Integer.toString(nbProbGeom) + +FudaaLib.getS(" g\xE9om\xE9trie(s) a/ont moins de 2 points.")); + return; } + } // Nouveaux objets - Geometry[] newGeom=new Geometry[idxGeom.length]; - Object[][] newData=new Object[idxGeom.length][]; + Geometry[] newGeom=new Geometry[_idxSource.length]; + Object[][] newData=new Object[_idxSource.length][]; // Ajout des nouveaux objets. - for (int i=0; i<idxGeom.length; i++) { - + for (int i=0; i<_idxSource.length; i++) { // Les attributs - Object[] datadest=new Object[coldest.getNbAttributes()]; - GISZoneCollection colsrc=((ZModeleGeometry)getScene().getLayerForId(idxGeom[i]).modeleDonnees()).getGeomData(); + Object[] datadest=new Object[zoneDestination.getNbAttributes()]; for (int iatt=0; iatt<datadest.length; iatt++) { - int idxAtt=colsrc.getIndiceOf(coldest.getAttribute(iatt)); + int idxAtt=zoneSource.getIndiceOf(zoneDestination.getAttribute(iatt)); if (idxAtt!=-1) { - datadest[iatt]=colsrc.getValue(idxAtt, getScene().sceneId2LayerId(idxGeom[i])); + datadest[iatt]=zoneSource.getValue(idxAtt,_idxSource[i]); // Les nouvelles g\xE9om\xE9tries sont modifi\xE9s, pas d'origine - if (colsrc.getAttribute(idxAtt)==GISAttributeConstants.ETAT_GEOM) + if (zoneSource.getAttribute(idxAtt)==GISAttributeConstants.ETAT_GEOM) datadest[iatt]=GISAttributeConstants.ATT_VAL_ETAT_MODI; } // Cas particuliers de mapping entre les attributs Z et z \\ else{ // On va essayer de renseigner le Z global de destination - if(coldest.getAttribute(iatt).getID().equals("Z")){ + if(zoneDestination.getAttribute(iatt).getID().equals("Z")){ // Cas o\xF9 un z atomique existe dans la source et qu'il est constant boolean identique=true; - int indexBathy=colsrc.getIndiceOf(GISAttributeConstants.BATHY); + int indexBathy=zoneSource.getIndiceOf(GISAttributeConstants.BATHY); if(indexBathy!=-1){ - GISAttributeModelDoubleArray data=(GISAttributeModelDoubleArray) colsrc.getValue(indexBathy, getScene().sceneId2LayerId(idxGeom[i])); + GISAttributeModelDoubleArray data=(GISAttributeModelDoubleArray) zoneSource.getValue(indexBathy, _idxSource[i]); identique=data.getMin()==data.getMax(); } if(identique&&indexBathy!=-1) - datadest[iatt]=((GISAttributeModelDoubleArray) colsrc.getValue(indexBathy, getScene().sceneId2LayerId(idxGeom[i]))).getObjectValueAt(0); + datadest[iatt]=((GISAttributeModelDoubleArray) zoneSource.getValue(indexBathy, _idxSource[i])).getObjectValueAt(0); // Dans le cas contraire, on demande \xE0 l'utilisateur else{ - // Utilisation d'une fen\xEAtre modale pour l'obtension du Z. - class myDialogModal extends JDialog implements ActionListener{ - private JComponent text_; - public myDialogModal(Frame _frame, String _title){ - super(_frame, _title, true); - // Position & resizable - setLocation(_frame.getLocation().x+_frame.getSize().width/2, _frame.getLocation().y+_frame.getSize().height/2); - setResizable(false); - // Contenu - JPanel container=new JPanel(new BuBorderLayout(2, 2)); - container.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); - text_=GISAttributeConstants.BATHY.getEditor().createEditorComponent(); - JButton ok=new JButton(MdlResource.MDL.getString("Valider")); - ok.addActionListener(this); - container.add(new BuLabel(MdlResource.MDL.getString("Valeur de Z :")), BuBorderLayout.WEST); - container.add(text_, BuBorderLayout.EAST); - container.add(ok, BuBorderLayout.SOUTH); - add(container); - pack(); - } - public void actionPerformed(ActionEvent e) { - setVisible(false); - dispose(); - } - public Double getValue(){ - return (Double) GISAttributeConstants.BATHY.getEditor().getValue(text_); - } - } // Pour le titre de la popup, on met le titre de la geom si possible String titre=MdlResource.MDL.getString("Nom : "); - if(colsrc.getIndiceOf(GISAttributeConstants.TITRE)!=-1) - titre+=(String) colsrc.getValue(colsrc.getIndiceOf(GISAttributeConstants.TITRE), getScene().sceneId2LayerId(idxGeom[i])); + if(zoneSource.getIndiceOf(GISAttributeConstants.TITRE)!=-1) + titre+=(String) zoneSource.getValue(zoneSource.getIndiceOf(GISAttributeConstants.TITRE), _idxSource[i]); else titre+=MdlResource.MDL.getString("sans nom"); // Instanciation de la popup - myDialogModal dialog =new myDialogModal(calquePanel_.getEditor().getFrame(), titre); + ZDialog dialog =new ZDialog(calquePanel_.getEditor().getFrame(), titre); dialog.setVisible(true); datadest[iatt]=dialog.getValue(); } } - else if(coldest.getAttribute(iatt)==GISAttributeConstants.BATHY){ + else if(zoneDestination.getAttribute(iatt)==GISAttributeConstants.BATHY){ // Recherche d'un attribut ayant pour ID 'Z' pour pouvoir utiliser sa valeur boolean found=false; int j=-1; - while(!found&&++j<colsrc.getNbAttributes()) - found=colsrc.getAttribute(j).getID().equals("Z"); + while(!found&&++j<zoneSource.getNbAttributes()) + found=zoneSource.getAttribute(j).getID().equals("Z"); if(found){ // Duplication de la valeur Object[] values=new Object[geoms[i].getNumPoints()]; for(int k=0;k<values.length;k++) - values[k]=colsrc.getValue(j, getScene().sceneId2LayerId(idxGeom[i])); + values[k]=zoneSource.getValue(j, _idxSource[i]); datadest[iatt]=values; } } @@ -270,12 +245,12 @@ newData[i]=datadest; // La g\xE9om\xE9trie - if (mdldest instanceof MdlModel2dMultiPoint) + if (_mldSource instanceof MdlModel2dMultiPoint) newGeom[i]=GISGeometryFactory.INSTANCE.createMultiPoint(geoms[i].getCoordinates()); - else if (mdldest instanceof MdlModel2dLine) { + else if (_mldSource instanceof MdlModel2dLine) { CoordinateSequence coordSeq=((GISCoordinateSequenceContainerInterface) geoms[i]).getCoordinateSequence(); boolean isFerme=coordSeq.getCoordinate(0).equals(coordSeq.getCoordinate(coordSeq.size()-1)); - if((calque.canAddForme(DeForme.LIGNE_BRISEE)&&!isFerme)||!calque.canAddForme(DeForme.POLYGONE)) + if((_calqueDestination.canAddForme(DeForme.LIGNE_BRISEE)&&!isFerme)||!_calqueDestination.canAddForme(DeForme.POLYGONE)) newGeom[i]=GISLib.toPolyligne(coordSeq); else newGeom[i]=GISLib.toPolygone(coordSeq); @@ -284,13 +259,40 @@ // Ajout des nouvelles g\xE9om\xE9tries for (int i=0; i<newGeom.length; i++) - coldest.addGeometry(newGeom[i], newData[i], cmp); - - // Suppression des anciens. - removeSelectedObjects(cmp); + zoneDestination.addGeometry(newGeom[i], newData[i], cmp); - if (mng_ != null) { - mng_.addCmd(cmp.getSimplify()); + if (_cmd != null) + _cmd.addCmd(cmp.getSimplify()); + } + + /** + * D\xE9place les g\xE9om\xE9tries s\xE9lectionn\xE9es dans le calque cible. + */ + public void moveInLayerSelectedGeometries() { + // Rassemblement des informations + Map<ZCalqueEditable, List<Integer>> selectedGeom=new HashMap<ZCalqueEditable, List<Integer>>(); + int[] idxScene=getScene().getLayerSelection().getSelectedIndex(); + if (idxScene!=null) { + // Tri des g\xE9om\xE9tries en fonction de leur calque + for (int i=0; i<idxScene.length; i++) { + ZCalqueEditable calque=(ZCalqueEditable) getScene().getLayerForId(idxScene[i]); + if(!selectedGeom.containsKey(calque)) + selectedGeom.put(calque, new ArrayList<Integer>()); + selectedGeom.get(calque).add(getScene().sceneId2LayerId(idxScene[i])); + } + ZCalqueEditable calqueDestination=(ZCalqueEditable)getScene().getCalqueActif(); + final CtuluCommandComposite cmp=new CtuluCommandComposite(FudaaLib.getS("D\xE9placer dans calque cible")); + // D\xE9placement des g\xE9om\xE9tries + for(Map.Entry<ZCalqueEditable, List<Integer>> entry: selectedGeom.entrySet()) { + int[] idxSource=new int[entry.getValue().size()]; + for(int j=0;j<entry.getValue().size();j++) + idxSource[j]=entry.getValue().get(j); + moveGeometries(entry.getKey().getModelEditable(), idxSource, calqueDestination, cmp); + } + // Suppression des anciens. + removeSelectedObjects(cmp); + if (mng_!=null) + mng_.addCmd(cmp.getSimplify()); } } Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/ZDialog.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/ZDialog.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/ZDialog.java 2009-01-21 17:30:56 UTC (rev 4390) @@ -0,0 +1,59 @@ +/* + * @creation 21 janv. 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.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JPanel; + +import org.fudaa.ctulu.gis.GISAttributeConstants; + +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuLabel; + +/** + * Fen\xEAtre modale pour l'obtension d'un Z. + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class ZDialog extends JDialog implements ActionListener { + private JComponent text_; + + public ZDialog(Frame _frame, String _title) { + super(_frame, _title, true); + // Position & resizable + setLocation(_frame.getLocation().x+_frame.getSize().width/2, _frame.getLocation().y+_frame.getSize().height/2); + setResizable(false); + // Contenu + JPanel container=new JPanel(new BuBorderLayout(2, 2)); + container.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + text_=GISAttributeConstants.BATHY.getEditor().createEditorComponent(); + JButton ok=new JButton(MdlResource.MDL.getString("Valider")); + ok.addActionListener(this); + container.add(new BuLabel(MdlResource.MDL.getString("Valeur de Z :")), BuBorderLayout.WEST); + container.add(text_, BuBorderLayout.EAST); + container.add(ok, BuBorderLayout.SOUTH); + add(container); + pack(); + } + + public void actionPerformed(ActionEvent e) { + setVisible(false); + dispose(); + } + + public Double getValue() { + return (Double)GISAttributeConstants.BATHY.getEditor().getValue(text_); + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/ZDialog.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |