From: <bma...@us...> - 2009-06-02 16:16:43
|
Revision: 4830 http://fudaa.svn.sourceforge.net/fudaa/?rev=4830&view=rev Author: bmarchan Date: 2009-06-02 16:16:39 +0000 (Tue, 02 Jun 2009) Log Message: ----------- Pas de collage/d?\195?\169placement de g?\195?\169om?\195?\169trie si la g?\195?\169om?\195?\169trie a d?\195?\169placer est non conforme. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCutCopyPasteManager.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCutCopyPasteManager.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCutCopyPasteManager.java 2009-06-02 14:01:05 UTC (rev 4829) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlCutCopyPasteManager.java 2009-06-02 16:16:39 UTC (rev 4830) @@ -21,6 +21,8 @@ import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ctulu.gis.GISAttributeModel; import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; +import org.fudaa.ctulu.gis.GISDataModel; +import org.fudaa.ctulu.gis.GISDataModelMultiAdapter; import org.fudaa.ctulu.gis.GISGeometryFactory; import org.fudaa.ctulu.gis.GISLib; import org.fudaa.ctulu.gis.GISZoneCollection; @@ -252,20 +254,29 @@ */ public void paste() { try { - CtuluCommandComposite cmd; + CtuluCommandComposite cmp; + // Collage de g\xE9om\xE9trie if (models_.size()>0) { - cmd=new CtuluCommandComposite(FudaaLib.getS("Coller des g\xE9om\xE9tries")); + cmp=new CtuluCommandComposite(FudaaLib.getS("Coller des g\xE9om\xE9tries")); + GISDataModel[] mdls=new GISDataModel[models_.size()]; + for (int i=0; i<models_.size(); i++) + mdls[i]=models_.get(i).getGeomData(); + + // Si des g\xE9om\xE9tries ne sont pas conformes, aucune n'est copi\xE9e. + if (!zSceneEditor_.canCopyGeometries(new GISDataModelMultiAdapter(mdls), (ZCalqueEditable)zScene_.getCalqueActif())) + return; + + // La copie se fait sur chaque mod\xE8le et non sur un mod\xE8le global, pour tenir compte au maximum des attributs + // li\xE9s \xE0 chaque g\xE9om\xE9trie source. 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); + zSceneEditor_.copyGeometries(mdls[i], (ZCalqueEditable)zScene_.getCalqueActif(), cmp); } } + // Collage de points else { - cmd=new CtuluCommandComposite(FudaaLib.getS("Coller des sommets")); + cmp=new CtuluCommandComposite(FudaaLib.getS("Coller des sommets")); ZCalqueEditable calque=((ZCalqueEditable)zScene_.getCalqueActif()); ZModeleEditable modele=(ZModeleEditable)calque.modeleDonnees(); GISZoneCollection zone=modele.getGeomData(); @@ -313,10 +324,10 @@ } } // Ajout de la g\xE9om\xE9trie - zone.addGeometry(geom, data, cmd); + zone.addGeometry(geom, data, cmp); } if (mdlFille2d_.getCmdMng()!=null) - mdlFille2d_.getCmdMng().addCmd(cmd.getSimplify()); + mdlFille2d_.getCmdMng().addCmd(cmp.getSimplify()); } catch (IllegalArgumentException _exp) { mdlFille2d_.getVisuPanel().getController().getUI().error(_exp.getMessage()); 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-06-02 14:01:05 UTC (rev 4829) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2009-06-02 16:16:39 UTC (rev 4830) @@ -7,6 +7,8 @@ */ package org.fudaa.fudaa.modeleur; +import gnu.trove.TIntArrayList; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -24,6 +26,8 @@ import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; 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; @@ -132,59 +136,69 @@ } /** - * D\xE9place des g\xE9om\xE9tries d'un mod\xE8le vers un calque. + * Controle que les g\xE9om\xE9tries \xE0 copier vers le calque destination peuvent l'etre.<p> + * <b>Remarque</b> : Il n'est pas tenu compte des attributs li\xE9s au mod\xE8le, uniquement des g\xE9om\xE9tries. + * @param _mdlSource Le modele contenant les g\xE9om\xE9tries \xE0 copier. + * @param _cqDest Le calque de destination. + * @param return false si au moins une des g\xE9om\xE9tries n'a pas le nombre de sommets requis. true sinon. */ - 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.")); - - 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\xE9placement de g\xE9om\xE9tries")); - + public boolean canCopyGeometries(GISDataModel _mdlSource, ZCalqueEditable _cqDest) { + int nbMin=1; + if (_cqDest.canAddForme(DeForme.POLYGONE)&&!_cqDest.canAddForme(DeForme.LIGNE_BRISEE)) + nbMin=3; + else if (_cqDest.canAddForme(DeForme.LIGNE_BRISEE)) + nbMin=2; + // Controle sur le nombre de point minimum - if (_calqueDestination.canAddForme(DeForme.POLYGONE)&&!_calqueDestination.canAddForme(DeForme.LIGNE_BRISEE)) { + if (nbMin>1) { int nbProbGeom=0; - for (Geometry g : geoms) - if (g.getNumPoints()<3) + for (int i=0; i<_mdlSource.getNumGeometries(); i++) { + Geometry g=_mdlSource.getGeometry(i); + if (g.getNumPoints()<nbMin) 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 (_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; + ui_.error(FudaaLib.getS("Vous ne pouvez pas coller ou d\xE9placer ces g\xE9om\xE9tries.\n"+ + "{0} g\xE9om\xE9trie(s) a/ont moins de {1} points.", + Integer.toString(nbProbGeom),""+nbMin)); + return false; } } + return true; + } + + + /** + * Copie des g\xE9om\xE9tries d'un mod\xE8le source vers un calque. Le controle que les g\xE9om\xE9tries sont conformes est fait en amont de + * la copie.<p> Le mod\xE8le source contient les g\xE9om\xE9tries \xE0 copier d'un m\xEAme calque, afin de r\xE9cup\xE9rer le maximum d'informations + * des attributs source. La m\xE9thode doit donc \xEAtre appel\xE9e en boucle pour chaque calque contenant des g\xE9om\xE9tries a copier. + * @param _mdlSource Le modele contenant les g\xE9om\xE9tries \xE0 copier. + * @param _cqDest Le calque de destination. + */ + public void copyGeometries(GISDataModel _mdlSource, ZCalqueEditable _calqueDestination, CtuluCommandContainer _cmd) { + if(_mdlSource==null||_calqueDestination==null) + throw new IllegalArgumentException(FudaaLib.getS("Aucun des param\xE8tres ne doit \xEAtre null.")); + GISZoneCollection zoneDestination=_calqueDestination.getModelEditable().getGeomData(); + + final CtuluCommandComposite cmp = new CtuluCommandComposite(FudaaLib.getS("D\xE9placement de g\xE9om\xE9tries")); + // Nouveaux objets - Geometry[] newGeom=new Geometry[_idxSource.length]; - Object[][] newData=new Object[_idxSource.length][]; + Geometry[] newGeom=new Geometry[_mdlSource.getNumGeometries()]; + Object[][] newData=new Object[_mdlSource.getNumGeometries()][]; // Ajout des nouveaux objets. - for (int i=0; i<_idxSource.length; i++) { + for (int i=0; i<newGeom.length; i++) { + Geometry geom=_mdlSource.getGeometry(i); + // Les attributs Object[] datadest=new Object[zoneDestination.getNbAttributes()]; for (int iatt=0; iatt<datadest.length; iatt++) { - int idxAtt=zoneSource.getIndiceOf(zoneDestination.getAttribute(iatt)); + int idxAtt=_mdlSource.getIndiceOf(zoneDestination.getAttribute(iatt)); if (idxAtt!=-1) { - datadest[iatt]=zoneSource.getValue(idxAtt,_idxSource[i]); + datadest[iatt]=_mdlSource.getValue(idxAtt,i); // Les nouvelles g\xE9om\xE9tries sont modifi\xE9s, pas d'origine - if (zoneSource.getAttribute(idxAtt)==GISAttributeConstants.ETAT_GEOM) + if (_mdlSource.getAttribute(idxAtt)==GISAttributeConstants.ETAT_GEOM) datadest[iatt]=GISAttributeConstants.ATT_VAL_ETAT_MODI; } // Cas particuliers de mapping entre les attributs Z et z \\ @@ -193,19 +207,19 @@ 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=zoneSource.getIndiceOf(GISAttributeConstants.BATHY); + int indexBathy=_mdlSource.getIndiceOf(GISAttributeConstants.BATHY); if(indexBathy!=-1){ - GISAttributeModelDoubleArray data=(GISAttributeModelDoubleArray) zoneSource.getValue(indexBathy, _idxSource[i]); + GISAttributeModelDoubleArray data=(GISAttributeModelDoubleArray) _mdlSource.getValue(indexBathy, i); identique=data.getMin()==data.getMax(); } if(identique&&indexBathy!=-1) - datadest[iatt]=((GISAttributeModelDoubleArray) zoneSource.getValue(indexBathy, _idxSource[i])).getObjectValueAt(0); + datadest[iatt]=((GISAttributeModelDoubleArray) _mdlSource.getValue(indexBathy, i)).getObjectValueAt(0); // Dans le cas contraire, on demande \xE0 l'utilisateur else{ // Pour le titre de la popup, on met le titre de la geom si possible String titre=MdlResource.getS("Nom : "); - if(zoneSource.getIndiceOf(GISAttributeConstants.TITRE)!=-1) - titre+=(String) zoneSource.getValue(zoneSource.getIndiceOf(GISAttributeConstants.TITRE), _idxSource[i]); + if(_mdlSource.getIndiceOf(GISAttributeConstants.TITRE)!=-1) + titre+=(String) _mdlSource.getValue(_mdlSource.getIndiceOf(GISAttributeConstants.TITRE), i); else titre+=MdlResource.getS("sans nom"); // Instanciation de la popup @@ -218,13 +232,13 @@ // Recherche d'un attribut ayant pour ID 'Z' pour pouvoir utiliser sa valeur boolean found=false; int j=-1; - while(!found&&++j<zoneSource.getNbAttributes()) - found=zoneSource.getAttribute(j).getID().equals("Z"); + while(!found&&++j<_mdlSource.getNbAttributes()) + found=_mdlSource.getAttribute(j).getID().equals("Z"); if(found){ // Duplication de la valeur - Object[] values=new Object[geoms[i].getNumPoints()]; + Object[] values=new Object[geom.getNumPoints()]; for(int k=0;k<values.length;k++) - values[k]=zoneSource.getValue(j, _idxSource[i]); + values[k]=_mdlSource.getValue(j, i); datadest[iatt]=values; } } @@ -236,9 +250,9 @@ // La g\xE9om\xE9trie if (_calqueDestination.modeleDonnees() instanceof MdlModel2dMultiPoint) - newGeom[i]=GISGeometryFactory.INSTANCE.createMultiPoint(geoms[i].getCoordinates()); + newGeom[i]=GISGeometryFactory.INSTANCE.createMultiPoint(geom.getCoordinates()); else if (_calqueDestination.modeleDonnees() instanceof MdlModel2dLine) { - CoordinateSequence coordSeq=((GISCoordinateSequenceContainerInterface) geoms[i]).getCoordinateSequence(); + CoordinateSequence coordSeq=((GISCoordinateSequenceContainerInterface) geom).getCoordinateSequence(); boolean isFerme=coordSeq.getCoordinate(0).equals(coordSeq.getCoordinate(coordSeq.size()-1)); if((_calqueDestination.canAddForme(DeForme.LIGNE_BRISEE)&&!isFerme)||!_calqueDestination.canAddForme(DeForme.POLYGONE)) newGeom[i]=GISLib.toPolyligne(coordSeq); @@ -260,25 +274,38 @@ */ public void moveInLayerSelectedGeometries() { // Rassemblement des informations - Map<ZCalqueEditable, List<Integer>> selectedGeom=new HashMap<ZCalqueEditable, List<Integer>>(); + Map<ZCalqueEditable, TIntArrayList> selectedGeom=new HashMap<ZCalqueEditable, TIntArrayList>(); 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.put(calque, new TIntArrayList()); 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); + + // Controle que les g\xE9om\xE9tries peuvent \xEAtre d\xE9plac\xE9es. + GISDataModel[] mdls=new GISDataModel[selectedGeom.size()]; + int icpt=0; + for (ZCalqueEditable cq: selectedGeom.keySet()) { + GISDataModel mdl=cq.getModelEditable().getGeomData(); + int[] idxs=selectedGeom.get(cq).toNativeArray(); + mdls[icpt++]=new GISDataModelFilterAdapter(mdl,null,idxs); } + + // Si des g\xE9om\xE9tries ne sont pas conformes, aucune n'est copi\xE9e. + if (!canCopyGeometries(new GISDataModelMultiAdapter(mdls), calqueDestination)) + return; + + // Le d\xE9placement se fait sur chaque mod\xE8le et non sur un mod\xE8le global, pour tenir compte au maximum des attributs + // li\xE9s \xE0 chaque g\xE9om\xE9trie source. + for (int i=0; i<mdls.length; i++) { + copyGeometries(mdls[i], calqueDestination, cmp); + } + // Suppression des anciens. removeSelectedObjects(cmp); if (mng_!=null) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |