|
From: <bma...@us...> - 2008-06-11 07:59:18
|
Revision: 3636
http://fudaa.svn.sourceforge.net/fudaa/?rev=3636&view=rev
Author: bmarchan
Date: 2008-06-11 00:59:25 -0700 (Wed, 11 Jun 2008)
Log Message:
-----------
Mise en place fonctionnalite de rafinement de polyligne, Z interpol?\195?\169 a partir des points polyligne.
Modified Paths:
--------------
branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java
branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java
branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dLine.java
Added Paths:
-----------
branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneRefinementAction.java
Modified: branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java
===================================================================
--- branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2008-06-11 07:58:11 UTC (rev 3635)
+++ branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2008-06-11 07:59:25 UTC (rev 3636)
@@ -17,6 +17,7 @@
import org.fudaa.fudaa.modeleur.action.SceneDecimationAction;
import org.fudaa.fudaa.modeleur.action.SceneInterpolationAction;
import org.fudaa.fudaa.modeleur.action.SceneMoveInLayerAction;
+import org.fudaa.fudaa.modeleur.action.SceneRefinementAction;
import org.fudaa.fudaa.sig.layer.FSigEditor;
import org.fudaa.fudaa.sig.layer.FSigVisuPanel;
@@ -48,6 +49,7 @@
acts.add(new SceneInterpolationAction((MdlSceneEditor)getSceneEditor()));
acts.add(new SceneMoveInLayerAction((MdlSceneEditor)getSceneEditor()));
acts.add(new SceneDecimationAction((MdlSceneEditor)getSceneEditor()));
+ acts.add(new SceneRefinementAction((MdlSceneEditor)getSceneEditor()));
getSceneEditor().getScene().setActions(acts.toArray(new EbliActionAbstract[0]));
}
Modified: branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java
===================================================================
--- branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2008-06-11 07:58:11 UTC (rev 3635)
+++ branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2008-06-11 07:59:25 UTC (rev 3636)
@@ -47,6 +47,8 @@
MdlDecimationPanel pnDecimation_=null;
// Pour conserver les valeurs IHM d'un appel a un autre.
MdlInterpolationPanel pnInterpolation_=null;
+ // Pour conserver les valeurs IHM d'un appel a un autre.
+ MdlRefinementPanel pnRaffinement_=null;
public MdlSceneEditor(MdlVisuPanel _pn, ZScene _scene) {
super(_scene);
@@ -188,4 +190,44 @@
super.getScene().clearSelection();
}
}
+
+ /**
+ * Raffine la g\xE9om\xE9trie ou entre 2 sommmets de la g\xE9om\xE9trie s\xE9lectionn\xE9e.
+ */
+ public void refineSelectedGeometries() {
+ if (pnRaffinement_==null)
+ pnRaffinement_=new MdlRefinementPanel();
+
+ String title;
+ if (getScene().isAtomicMode())
+ title=MdlResource.MDL.getString("Raffinement entre 2 sommets");
+ else
+ title=MdlResource.MDL.getString("Raffinement sur une polyligne");
+
+ if (pnRaffinement_.afficheModaleOk(pn_.getFrame(), title)) {
+ // La g\xE9om\xE9trie.
+ int idxGeom=getScene().getSelectionHelper().getUniqueSelectedIdx();
+ Geometry geom=(Geometry)getScene().getObject(idxGeom);
+ int idxdeb;
+ int idxfin;
+ if (getScene().isAtomicMode()) {
+ int[] idxa=getScene().getLayerSelectionMulti().getSelection(idxGeom).getSelectedIndex();
+ idxdeb=idxa[0];
+ idxfin=idxa[1];
+ }
+ else {
+ idxdeb=0;
+ idxfin=geom.getNumPoints()-1;
+ }
+
+ ZModeleDonnees mdld=getScene().getLayerForId(idxGeom).modeleDonnees();
+ if (mdld instanceof MdlModel2dLine) {
+ MdlModel2dLine mdl=(MdlModel2dLine)mdld;
+ mdl.refine(getScene().sceneId2LayerId(idxGeom),idxdeb,idxfin,pnRaffinement_.isNbPtsGiven()?0:1,
+ pnRaffinement_.getNbPts(),pnRaffinement_.getDistance(),getMng());
+ }
+
+ super.getScene().clearSelection();
+ }
+ }
}
Added: branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneRefinementAction.java
===================================================================
--- branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneRefinementAction.java (rev 0)
+++ branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneRefinementAction.java 2008-06-11 07:59:25 UTC (rev 3636)
@@ -0,0 +1,82 @@
+/*
+ * @creation 1 avr. 2005
+ * @modification $Date: 2008-05-13 12:10:55 $
+ * @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.action;
+
+import java.awt.event.ActionEvent;
+
+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.ebli.ressource.EbliResource;
+import org.fudaa.fudaa.modeleur.MdlSceneEditor;
+import org.fudaa.fudaa.modeleur.layer.MdlLayer2dLine;
+import org.fudaa.fudaa.modeleur.layer.MdlLayer2dMultiPoint;
+
+/**
+ * Une action pour raffiner entre 2 sommets ou la totalit\xE9 d'un objets GIS.
+ * @author Bertrand Marchand
+ * @version $Id: SceneInterpolationAction.java,v 1.1.2.1 2008-05-13 12:10:55 bmarchan Exp $
+ */
+public class SceneRefinementAction extends EbliActionSimple implements ZSelectionListener {
+
+ MdlSceneEditor sceneEditor_;
+
+ /**
+ * @param _m l'arbre des calques
+ */
+ public SceneRefinementAction(MdlSceneEditor _sceneEditor) {
+ super(EbliResource.EBLI.getString("Raffiner"), null, "RAFFINER");
+ setSceneEditor(_sceneEditor);
+ sceneEditor_.getScene().addSelectionListener(this);
+ }
+
+ public void actionPerformed(final ActionEvent _e) {
+ sceneEditor_.refineSelectedGeometries();
+ }
+
+ /**
+ * @param _editor l'editeur
+ */
+ private void setSceneEditor(final MdlSceneEditor _sceneEditor) {
+ sceneEditor_ = _sceneEditor;
+ }
+
+ /**
+ * Autoris\xE9 si 2 sommets d'un m\xEAme bloc sont selectionn\xE9s ou 1 g\xE9om\xE9trie compl\xE8te.
+ */
+ public void updateForSelectionChanged() {
+ ZScene scn=sceneEditor_.getScene();
+ SceneSelectionHelper hlp=sceneEditor_.getScene().getSelectionHelper();
+ int idGeom=-1;
+
+ boolean b=true;
+ // Si selection n'est pas vide.
+ b&=!scn.isSelectionEmpty();
+ // Si le nombre d'atomiques est de 2 sur le m\xEAme bloc
+ b&=!scn.isAtomicMode() || (hlp.getNbAtomicSelected()==2 && (idGeom=hlp.getUniqueSelectedIdx())!=-1);
+ // Si le nombre de selectionn\xE9s est de 1 en mode global
+ b&=scn.isAtomicMode() || (idGeom=hlp.getUniqueSelectedIdx())!=-1;
+ // Si la g\xE9om\xE9trie appartient a un calque polylignes.
+ b&=scn.getLayerForId(idGeom) instanceof MdlLayer2dLine;
+
+ super.setEnabled(b);
+ }
+
+ public String getEnableCondition() {
+ return EbliResource.EBLI.getString("<p>En mode sommet, s\xE9lectionner 2 sommets d'un m\xEAme objet<p>En mode global, un objet");
+ }
+
+ /* (non-Javadoc)
+ * @see org.fudaa.ebli.calque.ZSelectionListener#selectionChanged(org.fudaa.ebli.calque.ZSelectionEvent)
+ */
+ public void selectionChanged(ZSelectionEvent _evt) {
+ updateForSelectionChanged();
+ }
+}
Property changes on: branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneRefinementAction.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dLine.java
===================================================================
--- branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dLine.java 2008-06-11 07:58:11 UTC (rev 3635)
+++ branches/Br_FudaaModeleur_TF/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel2dLine.java 2008-06-11 07:59:25 UTC (rev 3636)
@@ -72,6 +72,51 @@
}
/**
+ * Retourne le tableau des coordonn\xE9es de points r\xE9partis uniform\xE9ments entre 2 points.
+ * @param _coords Les coordonn\xE9es des 2 points extr\xE9mit\xE9s
+ * @param _nbpts La distance entre 2 points.
+ * @return Les coordonn\xE9es des points r\xE9partis entre les 2 points extr\xE9mit\xE9s.
+ */
+ private Coordinate[] interpolateCoordinates(Coordinate[] _coords, double _dist) {
+ double distTot=
+ Math.sqrt((_coords[1].x-_coords[0].x)*(_coords[1].x-_coords[0].x)+(_coords[1].y-_coords[0].y)*(_coords[1].y-_coords[0].y));
+ int nbpts=(int)Math.round(distTot/_dist)-1;
+
+ Coordinate[] coords=new Coordinate[nbpts];
+ for (int i=0; i<coords.length; i++) {
+ Coordinate c=new Coordinate();
+ c.x=_coords[0].x+(_coords[1].x-_coords[0].x)*(i+1)*_dist/distTot;
+ c.y=_coords[0].y+(_coords[1].y-_coords[0].y)*(i+1)*_dist/distTot;
+ c.z=_coords[0].z+(_coords[1].z-_coords[0].z)*(i+1)*_dist/distTot;
+ coords[i]=c;
+ }
+
+ return coords;
+ }
+
+ /**
+ * Retourne le tableau des coordonn\xE9es de points r\xE9partis uniform\xE9ments entre 2 points.
+ * @param _coords Les coordonn\xE9es des 2 points extr\xE9mit\xE9s
+ * @param _nbpts Le nombre de points a calculer.
+ * @return Les coordonn\xE9es des points r\xE9partis entre les 2 points extr\xE9mit\xE9s.
+ */
+ private Coordinate[] interpolateNCoordinates(Coordinate[] _coords, int _nbpts) {
+ double distTot=
+ Math.sqrt((_coords[1].x-_coords[0].x)*(_coords[1].x-_coords[0].x)+(_coords[1].y-_coords[0].y)*(_coords[1].y-_coords[0].y));
+
+ Coordinate[] coords=new Coordinate[_nbpts];
+ for (int i=0; i<coords.length; i++) {
+ Coordinate c=new Coordinate();
+ c.x=_coords[0].x+(_coords[1].x-_coords[0].x)*(i+1)/(_nbpts+1.);
+ c.y=_coords[0].y+(_coords[1].y-_coords[0].y)*(i+1)/(_nbpts+1.);
+ c.z=_coords[0].z+(_coords[1].z-_coords[0].z)*(i+1)/(_nbpts+1.);
+ coords[i]=c;
+ }
+
+ return coords;
+ }
+
+ /**
* Decime une ligne. La m\xE9thode utilis\xE9e pour d\xE9cimer peut \xEAtre :<p>
* 0 : Suivant un nombre de points a supprimer entre 2 points conserv\xE9s.<br>
* 1 : Suivant une distance minimale.
@@ -79,31 +124,30 @@
* @param _idxdeb L'indice de d\xE9but de d\xE9cimation.
* @param _idxfin L'indice de fin de d\xE9cimation.
* @param _meth La m\xE9thode.
- * @param _nbPts Le nombre de points.
+ * @param _nbpts Le nombre de points.
* @param _dstmin La distance minimale.
* @param _cmd Le container de commandes.
* @return true si modif ok.
*/
- public boolean decimate(int _idxGeom, int _idxdeb,int _idxfin,int _meth,int _nbPts, double _dstmin, CtuluCommandContainer _cmd) {
+ public boolean decimate(int _idxGeom, int _idxdeb,int _idxfin,int _meth,int _nbpts, double _dstmin, CtuluCommandContainer _cmd) {
TIntArrayList list=new TIntArrayList();
// Methode par nombre de points.
if (_meth==0) {
- int idx=_idxdeb+1+_nbPts;
+ int idx=_idxdeb+1+_nbpts;
for (int i=_idxdeb+1; i<=_idxfin-1; i++) {
if (i<idx) {
list.add(i);
}
else {
- idx=i+1+_nbPts;
+ idx=i+1+_nbpts;
}
}
}
- // Methode par nombre de points.
+ // Methode par distance mini.
else if (_meth==1) {
LineString geom=(LineString)geometries_.getGeometry(_idxGeom);
CoordinateSequence seq=geom.getCoordinateSequence();
-// int idx=_idxdeb;
double dst=0;
for (int i=_idxdeb+1; i<=_idxfin-1; i++) {
dst+=Math.sqrt((seq.getX(i)-seq.getX(i-1))*(seq.getX(i)-seq.getX(i-1))+
@@ -113,7 +157,6 @@
}
else {
dst=0;
-// idx=i;
}
}
}
@@ -122,4 +165,64 @@
geometries_.removeAtomicValue(_idxGeom, ids, null, _cmd); // L'UI est null, le cas ou moins de 2 points ne peut pas arriver.
return true;
}
+
+ /**
+ * Raffine une ligne. La m\xE9thode utilis\xE9e pour raffiner peut \xEAtre :<p>
+ * 0 : Suivant un nombre de points a ajouter entre 2 points.<br>
+ * 1 : Suivant une distance maximale.
+ * @param _idxGeom La g\xE9om\xE9trie a raffiner.
+ * @param _idxdeb L'indice de d\xE9but de raffinement.
+ * @param _idxfin L'indice de fin de raffinement.
+ * @param _meth La m\xE9thode.
+ * @param _nbpts Le nombre de points.
+ * @param _dstmin La distance maximale.
+ * @param _cmd Le container de commandes.
+ * @return true si modif ok.
+ */
+ public boolean refine(int _idxGeom, int _idxdeb,int _idxfin,int _meth,int _nbpts, double _dstmax, CtuluCommandContainer _cmd) {
+ LineString geom=(LineString)geometries_.getGeometry(_idxGeom);
+ CoordinateSequence seq=geom.getCoordinateSequence();
+
+ ArrayList coords=new ArrayList(seq.size());
+
+ for (int i=0; i<_idxdeb; i++) {
+ coords.add(seq.getCoordinate(i).clone());
+ }
+
+ Coordinate[] cexts=new Coordinate[2];
+ // Methode par nombre de points.
+ if (_meth==0) {
+ for (int i=_idxdeb; i<_idxfin; i++) {
+ cexts[0]=seq.getCoordinate(i);
+ cexts[1]=seq.getCoordinate(i+1);
+ Coordinate[] cints=interpolateNCoordinates(cexts,_nbpts);
+ coords.add(cexts[0].clone());
+ for (int j=0; j<cints.length; j++)
+ coords.add(cints[j]);
+ }
+ }
+ // Methode par distance maxi.
+ else if (_meth==1) {
+ for (int i=_idxdeb; i<_idxfin; i++) {
+ double dst=Math.sqrt((seq.getX(i+1)-seq.getX(i))*(seq.getX(i+1)-seq.getX(i))+
+ (seq.getY(i+1)-seq.getY(i))*(seq.getY(i+1)-seq.getY(i)));
+ int nbpts=(int)(dst/_dstmax);
+ if (dst/_dstmax==(int)(dst/_dstmax)) nbpts--;
+ cexts[0]=seq.getCoordinate(i);
+ cexts[1]=seq.getCoordinate(i+1);
+ Coordinate[] cints=interpolateNCoordinates(cexts, nbpts);
+ coords.add(cexts[0].clone());
+ for (int j=0; j<cints.length; j++)
+ coords.add(cints[j]);
+ }
+ }
+
+ for (int i=_idxfin; i<seq.size(); i++) {
+ coords.add(seq.getCoordinate(i).clone());
+ }
+
+ GISPolyligne newgeom=(GISPolyligne)GISGeometryFactory.INSTANCE.createLineString((Coordinate[])coords.toArray(new Coordinate[0]));
+ geometries_.setValue(_idxGeom, newgeom, _cmd);
+ return true;
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|