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. |