From: <emm...@us...> - 2009-01-22 15:22:29
|
Revision: 4393 http://fudaa.svn.sourceforge.net/fudaa/?rev=4393&view=rev Author: emmanuel_martin Date: 2009-01-22 15:22:26 +0000 (Thu, 22 Jan 2009) Log Message: ----------- Tache #135 : "Ordonner les sommets d'une g?\195?\169om?\195?\169trie, suivant X ou Y." Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneLinearisePolyligneAction.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneOrganizePoint.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2009-01-22 13:43:18 UTC (rev 4392) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2009-01-22 15:22:26 UTC (rev 4393) @@ -32,9 +32,10 @@ import org.fudaa.fudaa.modeleur.action.SceneDecimationAction; import org.fudaa.fudaa.modeleur.action.SceneInterpolationAction; import org.fudaa.fudaa.modeleur.action.SceneInvertAction; +import org.fudaa.fudaa.modeleur.action.SceneLinearisePolyligneAction; import org.fudaa.fudaa.modeleur.action.SceneMoveInLayerAction; +import org.fudaa.fudaa.modeleur.action.SceneOrganizePoint; import org.fudaa.fudaa.modeleur.action.SceneProfilInterpolation; -import org.fudaa.fudaa.modeleur.action.SceneLinearisePolyligneAction; import org.fudaa.fudaa.modeleur.action.SceneProjectionAction; import org.fudaa.fudaa.modeleur.action.SceneRefinementAction; import org.fudaa.fudaa.sig.layer.FSigEditor; @@ -85,6 +86,8 @@ acts.add(new SceneProjectionAction((MdlSceneEditor)sceneEditor_)); acts.add(new SceneProfilInterpolation((MdlSceneEditor)sceneEditor_)); acts.add(new SceneLinearisePolyligneAction((MdlSceneEditor) sceneEditor_)); + acts.add(new SceneOrganizePoint((MdlSceneEditor) sceneEditor_, "x")); + acts.add(new SceneOrganizePoint((MdlSceneEditor) sceneEditor_, "y")); acts.add(null); acts.add(new SceneAbscisseCurviligneAction(this)); acts.add(null); 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-22 13:43:18 UTC (rev 4392) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2009-01-22 15:22:26 UTC (rev 4393) @@ -7,21 +7,12 @@ */ package org.fudaa.fudaa.modeleur; -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JPanel; - import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluListSelection; @@ -31,6 +22,7 @@ import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ctulu.gis.GISAttributeModelDoubleArray; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; +import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; import org.fudaa.ctulu.gis.GISDataModel; import org.fudaa.ctulu.gis.GISGeometryFactory; import org.fudaa.ctulu.gis.GISLib; @@ -62,8 +54,6 @@ import org.fudaa.fudaa.modeleur.layer.MdlModel2dLine; import org.fudaa.fudaa.modeleur.layer.MdlModel2dMultiPoint; -import com.memoire.bu.BuBorderLayout; -import com.memoire.bu.BuLabel; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; import com.vividsolutions.jts.geom.Geometry; @@ -393,6 +383,64 @@ } /** + * Sort the points of selected polylignes. This sorting is done on the + * _criterion. It can be 'x' or 'y'. + */ + public void organizePoint(String _criterion) { + /** This class contain needed data to sort points. */ + class DataPoint implements Comparable<DataPoint>{ + public Coordinate c; + private String criterion_; + public DataPoint(Coordinate coord, String _criterion) { + if(!_criterion.equals("x")&&!_criterion.equals("y")) + throw new IllegalArgumentException(FudaaLib.getS("Le crit\xE8re n'a pas \xE9t\xE9 reconnu.")); + criterion_=_criterion; + c=coord; + } + /** M\xE9thode pour utiliser les alorithmes de tris fournis par java. */ + public int compareTo(DataPoint o) { + if(criterion_.equals("x")) + return compareX(o); + else + return compareY(o); + } + public int compareX(DataPoint o) { + if (c.x<o.c.x) return -1; + else if (c.x==o.c.x) return 0; + else return 1; + } + public int compareY(DataPoint o) { + if (c.y<o.c.y) return -1; + else if (c.y==o.c.y) return 0; + else return 1; + } + } + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("R\xE9organisation de la g\xE9om\xE9trie")); + int[] geoms=getScene().getSelectionHelper().getSelectedIndexes(); + for (int i=0; i<geoms.length; i++) { + // Data retrieval + int idxGeom=getScene().sceneId2LayerId(geoms[i]); + ZCalqueAffichageDonneesInterface calque=getScene().getLayerForId(geoms[i]); + if (calque.modeleDonnees() instanceof ZModeleGeometry) { + GISZoneCollection zone=((ZModeleGeometry)calque.modeleDonnees()).getGeomData(); + CoordinateSequence seq=zone.getCoordinateSequence(idxGeom); + // Construction de la structure de tri + DataPoint[] points=new DataPoint[seq.size()]; + for(int j=0;j<points.length;j++) + points[j]=new DataPoint(seq.getCoordinate(j), _criterion); + Arrays.sort(points); + // R\xE9percution du tri + Coordinate[] coords=new Coordinate[points.length]; + for(int j=0;j<points.length;j++) + coords[j]=new Coordinate(points[j].c); + zone.setCoordinateSequence(idxGeom, new GISCoordinateSequenceFactory().create(coords), cmd); + } + } + if(getMng()!=null) + getMng().addCmd(cmd.getSimplify()); + } + + /** * Rend rectiligne une polyligne. */ public void linearisePolyligne() { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneLinearisePolyligneAction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneLinearisePolyligneAction.java 2009-01-22 13:43:18 UTC (rev 4392) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneLinearisePolyligneAction.java 2009-01-22 15:22:26 UTC (rev 4393) @@ -10,15 +10,10 @@ import java.awt.event.ActionEvent; import org.fudaa.ctulu.CtuluLib; -import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISPolyligne; -import org.fudaa.ctulu.gis.GISZoneCollection; -import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; -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.ZScene.SceneSelectionHelper; import org.fudaa.ebli.commun.EbliActionSimple; import org.fudaa.fudaa.modeleur.MdlSceneEditor; import org.fudaa.fudaa.ressource.FudaaResource; @@ -33,7 +28,6 @@ public SceneLinearisePolyligneAction(MdlSceneEditor _sceneEditor) { super(FudaaResource.FUDAA.getString("Rendre rectiligne des polylignes"), null, "RECTILIGNE_POLYLIGNE"); -// setDefaultToolTip(FudaaResource.FUDAA.getString("Rend rectiligne une ou plusieurs polyligne(s)")); sceneEditor_=_sceneEditor; sceneEditor_.getScene().addSelectionListener(this); } @@ -42,32 +36,25 @@ sceneEditor_.linearisePolyligne(); } - public void updateForSelectionChanged() { + public String getEnableCondition() { + return CtuluLib + .getS("<p>En mode sommet, s\xE9lectionner deux points pour chaque polyligne<p>En mode global, s\xE9lectionner une ou plusieurs polyligne(s)."); + } + + public void selectionChanged(ZSelectionEvent _evt) { ZScene scn=sceneEditor_.getScene(); - SceneSelectionHelper hlp=sceneEditor_.getScene().getSelectionHelper(); // Au moins une et seulement des polylignes de selectionn\xE9es. Et si en mode // atomique, deux sommets doivent \xEAtre selectionn\xE9s pour chacune d'entre // elles. int[] geomSelected=scn.getSelectionHelper().getSelectedIndexes(); boolean b=geomSelected.length>0; int i=0; - while(b&&i<geomSelected.length){ + while (b&&i<geomSelected.length) { b=scn.getObject(geomSelected[i]) instanceof GISPolyligne; - if(scn.isAtomicMode()) + if (scn.isAtomicMode()) b=b&&scn.getLayerSelectionMulti()!=null&&scn.getLayerSelectionMulti().getSelection(geomSelected[i]).getNbSelectedIndex()==2; i++; } setEnabled(b); } - - public String getEnableCondition() { - return CtuluLib.getS("<p>En mode sommet, s\xE9lectionner deux points pour chaque polyligne<p>En mode global, s\xE9lectionner une ou plusieurs polyligne(s)."); - } - - /* (non-Javadoc) - * @see org.fudaa.ebli.calque.ZSelectionListener#selectionChanged(org.fudaa.ebli.calque.ZSelectionEvent) - */ - public void selectionChanged(ZSelectionEvent _evt) { - updateForSelectionChanged(); - } } Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneOrganizePoint.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneOrganizePoint.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneOrganizePoint.java 2009-01-22 15:22:26 UTC (rev 4393) @@ -0,0 +1,61 @@ +/* + * @creation 22 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.action; + +import java.awt.event.ActionEvent; + +import org.fudaa.ctulu.CtuluLib; +import org.fudaa.ebli.calque.ZSelectionEvent; +import org.fudaa.ebli.calque.ZSelectionListener; +import org.fudaa.ebli.commun.EbliActionSimple; +import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.MdlSceneEditor; + +/** + * Allow to reorganize geometries with criterion. The criterions can be x or y. + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class SceneOrganizePoint extends EbliActionSimple implements ZSelectionListener { + + public static final String x="x"; + public static final String y="y"; + + /** The criterion used */ + protected String criterion_; + protected MdlSceneEditor sceneEditor_; + + /** + * @param _sceneEditor + * @param _criterion + * the criterion, can be x or y. Put directly the string "x" or + * SceneOrganizePoint.x. As you want. + */ + public SceneOrganizePoint(MdlSceneEditor _sceneEditor, String _criterion) { + super(FudaaLib.getS("R\xE9organisation sur ")+(_criterion==null?"":_criterion), null, "REORGANIZE_POLYLIGNE"); + sceneEditor_=_sceneEditor; + criterion_=_criterion; + if(sceneEditor_==null||criterion_==null) + throw new IllegalArgumentException(FudaaLib.getS("Les param\xE8tres ne doivent pas \xEAtre null")); + if(!criterion_.equals(x)&&!criterion_.equals(y)) + throw new IllegalArgumentException(FudaaLib.getS("Le crit\xE8re n'a pas \xE9t\xE9 reconnu.")); + sceneEditor_.getScene().addSelectionListener(this); + } + + public void selectionChanged(ZSelectionEvent _evt) { + setEnabled(!sceneEditor_.getScene().isSelectionEmpty()); + } + + public String getEnableCondition() { + return CtuluLib.getS("<p>S\xE9lectionner une ou plusieurs g\xE9om\xE9trie(s)."); + } + + public void actionPerformed(final ActionEvent _e) { + sceneEditor_.organizePoint(criterion_); + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneOrganizePoint.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. |