From: <emm...@us...> - 2008-11-04 15:44:06
|
Revision: 4162 http://fudaa.svn.sourceforge.net/fudaa/?rev=4162&view=rev Author: emmanuel_martin Date: 2008-11-04 15:44:00 +0000 (Tue, 04 Nov 2008) Log Message: ----------- Tache #51 : "On ne peut pas joindre 2 semis, comme c'est le cas pour 2 polylignes. " Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueMultiPointEditable.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleMultiPointEditable.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dMultiPoint.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigEditor.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueMultiPointEditable.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueMultiPointEditable.java 2008-11-04 09:50:06 UTC (rev 4161) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueMultiPointEditable.java 2008-11-04 15:44:00 UTC (rev 4162) @@ -355,4 +355,27 @@ public final void setEditor(final ZEditorDefault _editor) { editor_ = _editor; } + + /** + * Joint 2 semis de points. + * + * @param _cmd La pile de commandes. + * @return true si les semis de points ont \xE9t\xE9 jointes. + */ + public boolean joinGeometries(final CtuluCommandContainer _cmd) { + if (isSelectionEmpty()) + return false; + + int[] idxSemis; + if(isAtomicMode()) + idxSemis=selectionMulti_.getIdxSelected(); + else + idxSemis=selection_.getSelectedIndex(); + if(idxSemis.length!=2) + return false; + + // On vide la selection, les 2 semis sont supprim\xE9es par la jonction. + clearSelection(); + return getMultiPointModel().joinGeometries(idxSemis, _cmd)!=-1; + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleMultiPointEditable.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleMultiPointEditable.java 2008-11-04 09:50:06 UTC (rev 4161) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleMultiPointEditable.java 2008-11-04 15:44:00 UTC (rev 4162) @@ -9,9 +9,17 @@ import gnu.trove.TIntObjectIterator; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JPanel; import javax.swing.table.AbstractTableModel; import org.fudaa.ctulu.CtuluAnalyze; @@ -29,6 +37,7 @@ import org.fudaa.ctulu.gis.GISAttributeModelDoubleArray; import org.fudaa.ctulu.gis.GISGeometryFactory; import org.fudaa.ctulu.gis.GISMultiPoint; +import org.fudaa.ctulu.gis.GISPolyligne; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gis.GISZoneCollectionMultiPoint; import org.fudaa.ctulu.gui.CtuluTable; @@ -39,11 +48,14 @@ import org.fudaa.ebli.commun.EbliListeSelectionMultiInterface; import org.fudaa.ebli.palette.BPaletteInfo.InfoData; +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuLabel; import com.memoire.bu.BuTable; import com.memoire.fu.FuLog; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory; /** * Une implementation par defaut d'un mod\xE8le \xE9ditable pour des multipoints. @@ -799,4 +811,69 @@ if(idxAttr >= 0) getGeomData().getDataModel(idxAttr).setObject(_idx, GISAttributeConstants.ATT_VAL_ETAT_MODI, _cmd); } + + /** + * Joint 2 semis de points. + * + * @param _idsSemis Les index des 2 semis. + * @param _cmd Le conteneur de commandes. + * @return L'index de la nouvelle ligne si OK, -1 sinon. + */ + public int joinGeometries(int[] _idxSemis, final CtuluCommandContainer _cmd) { + if (geometries_ == null||_idxSemis==null||_idxSemis.length!=2) + return -1; + final CtuluCommandComposite cmp = new CtuluCommandComposite("Jointure de semis de points"); + + // Nouvelles coordonn\xE9es + int nbPointMulti1=geometries_.getGeometry(_idxSemis[0]).getNumPoints(); + int nbPointMulti2=geometries_.getGeometry(_idxSemis[1]).getNumPoints(); + Coordinate[] coord=new Coordinate[nbPointMulti1+nbPointMulti2]; + // Remplisage de coord + for(int i=0;i<_idxSemis.length;i++){ + GISMultiPoint multipoint=(GISMultiPoint) geometries_.getGeometry(_idxSemis[i]); + for(int j=0;j<multipoint.getNumPoints();j++) + coord[i*nbPointMulti1+j]=multipoint.getCoordinateSequence().getCoordinate(j); + } + + // Les datas + Object[] dataSemis=new Object[geometries_.getNbAttributes()]; + for (int att=0; att<geometries_.getNbAttributes(); att++) { + // Attributs atomiques + if (geometries_.getAttribute(att).isAtomicValue()) { + // R\xE9cup\xE9ration des valeurs + Object[] values=new Object[nbPointMulti1+nbPointMulti2]; + for(int i=0;i<_idxSemis.length;i++){ + GISMultiPoint multipoint=(GISMultiPoint) geometries_.getGeometry(_idxSemis[i]); + for(int j=0;j<multipoint.getNumPoints();j++) + values[i*nbPointMulti1+j]=((GISAttributeModel) geometries_.getModel(att).getObjectValueAt(_idxSemis[i])).getObjectValueAt(j); + } + dataSemis[att]=(GISAttributeModel)geometries_.getModel(att).getAttribute().createDataForGeom(values,nbPointMulti1+nbPointMulti2); + } + // Attributs globaux + else { + // Cas particulier de l'attribut TITRE => <TITRE_GEOM1>_<TITRE_GEOM2> + if (geometries_.getModel(att).getAttribute()==GISAttributeConstants.TITRE) { + String name1=(String)geometries_.getModel(att).getObjectValueAt(_idxSemis[0]); + String name2=(String)geometries_.getModel(att).getObjectValueAt(_idxSemis[1]); + dataSemis[att]=name1+"_"+name2; + } + // Cas particulier de l'attribut ETAT_GEOM => ATT_VAL_ETAT_MODI + else if (geometries_.getModel(att).getAttribute()==GISAttributeConstants.ETAT_GEOM) { + dataSemis[att]=GISAttributeConstants.ATT_VAL_ETAT_MODI; + } + // On prend arbitrairement la valeur de la premi\xE8re polyligne. + else + dataSemis[att]=geometries_.getModel(att).getAttribute().createDataForGeom(geometries_.getModel(att).getObjectValueAt(_idxSemis[0]),1); + } + } + + // Remplacement dans la collection. + if (getGeomData().addGeometry(GISGeometryFactory.INSTANCE.createMultiPoint(coord), dataSemis, _cmd)!=-1) { + geometries_.removeGeometries(_idxSemis, cmp); + if (_cmd!=null) + _cmd.addCmd(cmp.getSimplify()); + return geometries_.getNbGeometries()-1; + } + return -1; + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dMultiPoint.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dMultiPoint.java 2008-11-04 09:50:06 UTC (rev 4161) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dMultiPoint.java 2008-11-04 15:44:00 UTC (rev 4162) @@ -49,6 +49,7 @@ FSigEditor editor=(FSigEditor)getEditor(); ArrayList vacts=new ArrayList(); vacts.addAll(Arrays.asList(editor.getEditAction())); + vacts.add(editor.getJoinAction()); // vacts.add(editor.getSplitAction()); // vacts.add(editor.getJoinAction()); vacts.add(null); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigEditor.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigEditor.java 2008-11-04 09:50:06 UTC (rev 4161) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigEditor.java 2008-11-04 15:44:00 UTC (rev 4162) @@ -20,6 +20,7 @@ import org.fudaa.ctulu.ProgressionInterface; import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISMultiPoint; import org.fudaa.ctulu.gis.GISPolygone; import org.fudaa.ctulu.gis.GISPolyligne; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; @@ -33,12 +34,14 @@ import org.fudaa.ebli.calque.BCalque; import org.fudaa.ebli.calque.ZCalqueAffichageDonnees; import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; +import org.fudaa.ebli.calque.ZCalqueAffichageDonneesMulti; import org.fudaa.ebli.calque.ZEbliCalquesPanel; import org.fudaa.ebli.calque.ZModelGeometryListener; import org.fudaa.ebli.calque.ZModeleGeometry; import org.fudaa.ebli.calque.edition.ZCalqueEditable; import org.fudaa.ebli.calque.edition.ZCalqueEditionGroup; import org.fudaa.ebli.calque.edition.ZCalqueLigneBriseeEditable; +import org.fudaa.ebli.calque.edition.ZCalqueMultiPointEditable; import org.fudaa.ebli.calque.edition.ZEditorDefault; import org.fudaa.ebli.calque.edition.ZSceneEditor; import org.fudaa.ebli.commun.EbliActionSimple; @@ -224,7 +227,7 @@ } /** - * Une action pour joindre 2 polylignes. N'est pas dans les actions par defaut. + * Une action pour joindre 2 polylignes ou deux multipoint. N'est pas dans les actions par defaut. * @return L'action */ public EbliActionSimple getJoinAction() { @@ -334,7 +337,7 @@ protected JoinAction() { super(BuResource.BU.getString("Joindre"), /*BuResource.BU.getIcon("joindreligne")*/null, "GIS_JOIN"); - setDefaultToolTip(FudaaLib.getS("Joindre 2 polylignes")); + setDefaultToolTip(FudaaLib.getS("Joindre 2 polylignes ou 2 multipoint")); } public void actionPerformed(final ActionEvent _e) { @@ -345,43 +348,57 @@ if (Fu.DEBUG && FuLog.isDebug()) { FuLog.debug("FTR gis target= " + FSigEditor.this.getTarget()); } - - ZCalqueLigneBriseeEditable cq=null; - if (getSupport().getCalqueActif() instanceof ZCalqueLigneBriseeEditable) cq=(ZCalqueLigneBriseeEditable)getSupport().getCalqueActif(); - - boolean b=true; - // Uniquement si le calque est editable, en mode atomique, et si le nombre de sommets est 2. - b&=cq!=null && - FSigEditor.this.isEditable(cq) && !cq.isSelectionEmpty() && - cq.isAtomicMode() && - cq.getLayerSelectionMulti().getNbSelectedItem()==2; - - // Uniquement si les sommets sont sur 2 des objets distincts, que ces objets sont des polylignes - if (b) { - int[] idxLignes=cq.getLayerSelectionMulti().getIdxSelected(); - b&=idxLignes.length==2; + boolean b=false; + if (getSupport().getCalqueActif() instanceof ZCalqueLigneBriseeEditable) { + ZCalqueLigneBriseeEditable cq=(ZCalqueLigneBriseeEditable)getSupport().getCalqueActif(); + // Si le calque est editable, en mode atomique, et si le nombre de + // sommets est 2. + b=cq!=null&&FSigEditor.this.isEditable(cq)&&!cq.isSelectionEmpty()&&cq.isAtomicMode() + &&cq.getLayerSelectionMulti().getNbSelectedItem()==2; + // Si les sommets sont sur 2 des objets distincts, que ces objets sont + // des polylignes if (b) { - for (int i=0; i<idxLignes.length; i++) - b&=(((GISZoneCollectionLigneBrisee)cq.getModele().getGeomData()).getGeometry(idxLignes[i]) instanceof GISPolyligne); + int[] idxLignes=cq.getLayerSelectionMulti().getIdxSelected(); + b&=idxLignes.length==2; + if (b) { + for (int i=0; i<idxLignes.length; i++) + b&=(((GISZoneCollectionLigneBrisee)((ZModeleGeometry)cq.modeleDonnees()).getGeomData()).getGeometry(idxLignes[i]) instanceof GISPolyligne); + } } } - + // Ou si c'est deux semis de points qui sont selectionn\xE9s + else if (getSupport().getCalqueActif() instanceof ZCalqueMultiPointEditable) { + ZCalqueMultiPointEditable cq=(ZCalqueMultiPointEditable)getSupport().getCalqueActif(); + // Deux selections en mode sommet ou global + // Ces deux s\xE9lections doivent \xEAtre des semis de points + if (cq!=null&&FSigEditor.this.isEditable(cq)&&!cq.isSelectionEmpty() + &&(cq.getLayerSelectionMulti()!=null&&cq.getLayerSelectionMulti().getNbSelectedItem()==2||cq.getLayerSelection()!=null&&cq.getLayerSelection().getNbSelectedIndex()==2)) { + int[] idxGeom; + if (cq.getLayerSelectionMulti()!=null&&cq.getLayerSelectionMulti().getNbSelectedItem()!=0) + idxGeom=cq.getLayerSelectionMulti().getIdxSelected(); + else + idxGeom=cq.getLayerSelection().getSelectedIndex(); + b=true; + for (int i=0; i<idxGeom.length; i++) + b=b&&(cq.modeleDonnees().getObject(idxGeom[i]) instanceof GISMultiPoint); + } + } super.setEnabled(b); } public String getEnableCondition() { - return FudaaLib.getS("S\xE9lectionner les sommets extremit\xE9s de 2 polylignes"); + return FudaaLib.getS("S\xE9lectionner les sommets extremit\xE9s de 2 polylignes ou deux semis de points"); } } /** - * Joint 2 polylignes distinctes. + * Joint 2 polylignes distinctes ou deux semis de points. */ protected void joinSelectedGeometries() { - if (!(getSupport().getCalqueActif() instanceof ZCalqueLigneBriseeEditable)) return; - - ZCalqueLigneBriseeEditable cq=(ZCalqueLigneBriseeEditable)getSupport().getCalqueActif(); - cq.joinGeometries(getMng()); + if (getSupport().getCalqueActif() instanceof ZCalqueLigneBriseeEditable) + ((ZCalqueLigneBriseeEditable)getSupport().getCalqueActif()).joinGeometries(getMng()); + else if (getSupport().getCalqueActif() instanceof ZCalqueMultiPointEditable) + ((ZCalqueMultiPointEditable)getSupport().getCalqueActif()).joinGeometries(getMng()); } protected boolean canExportSelectedLayer() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |