From: <emm...@us...> - 2009-01-30 15:11:58
|
Revision: 4429 http://fudaa.svn.sourceforge.net/fudaa/?rev=4429&view=rev Author: emmanuel_martin Date: 2009-01-30 15:11:50 +0000 (Fri, 30 Jan 2009) Log Message: ----------- Tache #176 : "Modifier la commande "rendre rectiligne des polylignes" pour qu'elle puisse rendre rectiligne des portions de segments." Modified Paths: -------------- 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/LibUtils.java Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/LibUtils.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/LibUtils.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/LibUtils.java 2009-01-30 15:11:50 UTC (rev 4429) @@ -0,0 +1,175 @@ +/* + * @creation 30 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; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.CtuluCommandContainer; +import org.fudaa.ctulu.collection.CtuluCollection; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISAttributeModel; +import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISPolyligne; +import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; +import org.fudaa.ebli.geometrie.GrPoint; +import org.fudaa.ebli.geometrie.GrVecteur; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Quelques m\xE9thodes utiles et ind\xE9dendantes. + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class LibUtils { + + /** + * Rend rectiligne un morceau d'une polyligne. + * _idxPoints doit contenir au moins deux index de point. + * + * Si plus de deux points sont selectionn\xE9s dans la g\xE9om\xE9trie (exemple idx : + * 0, 3 et 4), on iterre sur les points selectionn\xE9s deux \xE0 deux (donc 0 et 3 + * puis 3 et 4) pour chacune de ces it\xE9rations on projete sur le segment les + * points dont les indices sont entre les deux trait\xE9s (premi\xE8re it\xE9ration : + * projection du point 2, aucun pour la seconde). si la projection d'un point + * n'appartient pas au segment, il est ignor\xE9. + */ + @SuppressWarnings("unchecked") + static public void linearisePolyligne(GISZoneCollectionLigneBrisee _zone, int _idxGeom, int[] _idxPoints, CtuluCommandContainer _cmd) { + if(_zone==null||_idxPoints==null) + throw new IllegalArgumentException("_zone et _idxPoints ne doivent pas \xEAtre null."); + if(_idxGeom<0||_idxGeom>=_zone.getNbGeometries()) + throw new IllegalArgumentException("_idxGeom n'appartient pas \xE0 _zone."); + if(_idxPoints.length<2) + throw new IllegalArgumentException("Il doit y avoir au moins deux points selectionn\xE9s."); + for(int i=0;i<_idxPoints.length;i++) + if(_idxPoints[i]<0||_idxPoints[i]>=_zone.getGeometry(_idxGeom).getNumPoints()) + throw new IllegalArgumentException("Au moins un des index de _idxPoints est invalide."); + + /** Class contenant les infromations relatives \xE0 une coordonn\xE9s projet\xE9e. */ + class PointProj implements Comparable<PointProj> { + public Coordinate c; // Coordonn\xE9 projet\xE9e + public double indiceCurviligne; // Indice Curviligne (k tq k*VecDirecteur=Vec(PtOrigine, c)) + public List<Object> data=new ArrayList<Object>(); // valeur des attributs atomiques + /** M\xE9thode pour utiliser les alorithmes de tris fournis par java. */ + public int compareTo(PointProj o) { + if (indiceCurviligne<o.indiceCurviligne) + return -1; + else if (indiceCurviligne==o.indiceCurviligne) + return 0; + else + return 1; + } + } + CtuluCommandComposite cmd=new CtuluCommandComposite(); + // Pour chaque polyligne selectionn\xE9es + GISPolyligne polyligne=(GISPolyligne)_zone.getGeometry(_idxGeom); + List<Coordinate> newCoords=new ArrayList<Coordinate>(polyligne.getNumPoints()); + for (int j=0; j<polyligne.getNumPoints(); j++) + newCoords.add(polyligne.getCoordinateN(j)); + + // Tableau contenant les valeurs d'attributs de la g\xE9om\xE9trie (les atomiques + // sont dupliqu\xE9s) + Object[] newData=new Object[_zone.getNbAttributes()]; + for (int j=0; j<_zone.getNbAttributes(); j++) + if (_zone.getAttribute(j).isAtomicValue()) { + Object[] values=((GISAttributeModel)_zone.getDataModel(j).getObjectValueAt(_idxGeom)).getObjectValues(); + List<Object> lst=new ArrayList<Object>(values.length); + for (int k=0; k<values.length; k++) + lst.add(values[k]); + newData[j]=lst; + } + else + newData[j]=_zone.getDataModel(j).getObjectValueAt(_idxGeom); + /* + * Si plus d'un point est selectionn\xE9 dans la g\xE9om\xE9trie (exemple idx : + * 0, 3 et 4), on iterre sur les points selectionn\xE9s deux \xE0 deux (donc 0 + * et 3 puis 3 et 4) pour chacune de ces it\xE9rations on projete sur le + * segment les points dont les indices sont entre les deux trait\xE9s + * (premi\xE8re it\xE9ration : projection du point 2, aucun pour la seconde). + * si la projection d'un point n'appartient pas au segment, il est + * ignor\xE9. + * Sinon on utilise le premier et le dernier point de la + * polyligne comme destination de la projection. pt1 et pt2 sont ces + * deux points de r\xE9f\xE9rence. + */ + // Couples contients les couples d'indices \xE0 traiter. + Arrays.sort(_idxPoints); + int[][] couples; + couples=new int[_idxPoints.length-1][]; + for (int j=0; j<couples.length; j++) + couples[j]=new int[]{_idxPoints[j], _idxPoints[j+1]}; + // Iterration sur chacun des couples d'index + for (int j=couples.length-1; j>=0; j--) { + int idx1=couples[j][0]; + int idx2=couples[j][1]; + assert (idx1<idx2); + GrPoint pt1=new GrPoint(newCoords.get(idx1)); + GrPoint pt2=new GrPoint(newCoords.get(idx2)); + + // Vecteur de la droite de destination + GrVecteur vecP1P2=new GrVecteur(pt2.x_-pt1.x_, pt2.y_-pt1.y_, pt2.z_-pt1.z_); + // Construction de l'ensemble des points modifi\xE9s \\ + List<PointProj> lstNewPtsCurv=new ArrayList<PointProj>(); + for (int k=1; k<idx2-idx1; k++) { + GrPoint a=new GrPoint(polyligne.getCoordinateSequence().getCoordinate(k+idx1)); + // Projection + GrVecteur vecP1A=new GrVecteur(a.x_-pt1.x_, a.y_-pt1.y_, a.z_-pt1.z_); + GrPoint p=pt1.addition(vecP1A.projection(vecP1P2)); + Coordinate cp=new Coordinate(p.x_, p.y_, p.z_); + // Remplissage des informations relatives au point calcul\xE9 + PointProj pointProj=new PointProj(); + pointProj.c=cp; + pointProj.indiceCurviligne=new GrVecteur(cp.x-pt1.x_, cp.y-pt1.y_, cp.z-pt1.z_).division(vecP1P2); + if (pointProj.indiceCurviligne>=0&&pointProj.indiceCurviligne<=1) { + for (int l=0; l<_zone.getNbAttributes(); l++) + if (_zone.getAttribute(l).isAtomicValue()) + pointProj.data.add(((CtuluCollection)_zone.getValue(l, _idxGeom)).getObjectValueAt(k+idx1)); + lstNewPtsCurv.add(pointProj); + } + } + PointProj[] newPtsCurv=new PointProj[lstNewPtsCurv.size()]; + newPtsCurv=lstNewPtsCurv.toArray(newPtsCurv); + // Tri des points en fonction de leur abcisse curviligne \\ + Arrays.sort(newPtsCurv); + // Enregistrement des coordonn\xE9s et suppression des points disparus + for (int k=newPtsCurv.length-1; k>=0; k--) + newCoords.set(k+idx1+1, newPtsCurv[k].c); + for (int k=idx2-1; k>idx1+newPtsCurv.length; k--) + newCoords.remove(k); + // R\xE9cup\xE9ration des values des attributs atomiques + int nemeAttAtomique=0; + for (int k=0; k<_zone.getNbAttributes(); k++) + if (_zone.getAttribute(k).isAtomicValue()) { + List<Object> lst=(List<Object>)newData[k]; + for (int l=newPtsCurv.length-1; l>=0; l--) + lst.set(l+idx1+1, newPtsCurv[l].data.get(nemeAttAtomique)); + for (int l=idx2-1; l>idx1+newPtsCurv.length; l--) + lst.remove(l+idx1); + nemeAttAtomique++; + } + } + // Remplacement de l'ancienne g\xE9om\xE9trie \\ + _zone.setGeometry(_idxGeom, GISGeometryFactory.INSTANCE.createLineString(newCoords.toArray(new Coordinate[0])), cmd); + for (int j=0; j<_zone.getNbAttributes(); j++) { + GISAttributeInterface attr=_zone.getAttribute(j); + if (attr.isAtomicValue()) { + Object[] values=((List<Object>)newData[j]).toArray(); + _zone.setAttributValue(j, _idxGeom, attr.createDataForGeom(values, values.length), cmd); + } + else + _zone.setAttributValue(j, _idxGeom, newData[j], cmd); + } + // Mise \xE0 jour du undo/redo + if (_cmd!=null) + _cmd.addCmd(cmd.getSimplify()); + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/LibUtils.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native 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-30 10:28:57 UTC (rev 4428) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlSceneEditor.java 2009-01-30 15:11:50 UTC (rev 4429) @@ -17,7 +17,6 @@ import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluListSelection; import org.fudaa.ctulu.CtuluListSelectionInterface; -import org.fudaa.ctulu.collection.CtuluCollection; import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ctulu.gis.GISAttributeModelDoubleArray; @@ -31,6 +30,7 @@ import org.fudaa.ctulu.gis.GISPolyligne; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gis.GISZoneCollectionGeometry; +import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.ctulu.interpolation.InterpolationParameters; import org.fudaa.ctulu.interpolation.InterpolationResultsHolderI; import org.fudaa.ctulu.interpolation.InterpolationSupportGISAdapter; @@ -48,8 +48,6 @@ import org.fudaa.ebli.calque.edition.ZCalqueEditable; import org.fudaa.ebli.calque.edition.ZModeleEditable; import org.fudaa.ebli.calque.edition.ZSceneEditor; -import org.fudaa.ebli.geometrie.GrPoint; -import org.fudaa.ebli.geometrie.GrVecteur; import org.fudaa.fudaa.commun.FudaaLib; import org.fudaa.fudaa.modeleur.layer.MdlModel2dLine; import org.fudaa.fudaa.modeleur.layer.MdlModel2dMultiPoint; @@ -444,32 +442,8 @@ * Rend rectiligne une polyligne. */ public void linearisePolyligne() { - /** Class contenant les informations relativent \xE0 une polyligne. */ - class Poly { - public GISPolyligne poly; - public Object[] data; - public Poly(GISPolyligne _poly, Object[] _data) { - poly=_poly; - data=_data; - } - } - /** Class contenant les infromations relatives \xE0 une coordonn\xE9s projet\xE9e. */ - class PointProj implements Comparable<PointProj> { - public Coordinate c; // Coordonn\xE9 projet\xE9e - public double indiceCurviligne; // Indice Curviligne (k tq k*VecDirecteur=Vec(PtOrigine, c)) - public List<Object> data=new ArrayList<Object>(); // valeur des attributs atomiques - /** M\xE9thode pour utiliser les alorithmes de tris fournis par java. */ - public int compareTo(PointProj o) { - if (indiceCurviligne<o.indiceCurviligne) - return -1; - else if (indiceCurviligne==o.indiceCurviligne) - return 0; - else - return 1; - } - } + CtuluCommandComposite cmd=new CtuluCommandComposite(); int[] geoms=getScene().getSelectionHelper().getSelectedIndexes(); - Map<ZCalqueAffichageDonneesInterface, List<Poly>> newPoly=new HashMap<ZCalqueAffichageDonneesInterface, List<Poly>>(); // Verification de la selection \\ boolean selectionValid=true; int w=-1; @@ -478,87 +452,22 @@ if(selectionValid){ // Pour chaque polyligne selectionn\xE9es for (int i : geoms) { - GISPolyligne polyligne=((GISPolyligne)getScene().getObject(i)); + int idxGeom=getScene().sceneId2LayerId(i); + GISPolyligne polyligne=((GISPolyligne)getScene().getObject(idxGeom)); ZCalqueAffichageDonneesInterface calque=getScene().getLayerForId(i); - GISZoneCollection zone=((ZModeleEditable)calque.modeleDonnees()).getGeomData(); - /* - * Si deux points sont selectionn\xE9s dans cette polyligne, on les utilises - * comme destination de projection, sinon, ou si le nombre de point - * selectionn\xE9 n'est pas exactement deux, on utilise le premier et le - * dernier point de la polyligne comme destination de la projection. pt1 - * et pt2 sont ces deux points de r\xE9f\xE9rence. - */ - GrPoint pt1; - GrPoint pt2; - if (getScene().isAtomicMode()&&getScene().getLayerSelectionMulti().getSelection(i).getNbSelectedIndex()==2) { - pt1=new GrPoint(polyligne.getCoordinateSequence().getCoordinate(getScene().getLayerSelectionMulti().getSelection(i).getSelectedIndex()[0])); - pt2=new GrPoint(polyligne.getCoordinateSequence().getCoordinate(getScene().getLayerSelectionMulti().getSelection(i).getSelectedIndex()[1])); - } - else { - pt1=new GrPoint(polyligne.getCoordinateSequence().getCoordinate(0)); - pt2=new GrPoint(polyligne.getCoordinateSequence().getCoordinate(polyligne.getCoordinateSequence().size()-1)); - } - // Vecteur de la droite de destination - GrVecteur vecP1P2=new GrVecteur(pt2.x_-pt1.x_, pt2.y_-pt1.y_, pt2.z_-pt1.z_); - // Construction de l'ensemble des points composant la nouvelle polyligne \\ - PointProj[] newPtsCurv=new PointProj[polyligne.getCoordinateSequence().size()]; - for (int j=0; j<newPtsCurv.length; j++) { - GrPoint a=new GrPoint(polyligne.getCoordinateSequence().getCoordinate(j)); - // Projection - GrVecteur vecP1A=new GrVecteur(a.x_-pt1.x_, a.y_-pt1.y_, a.z_-pt1.z_); - GrPoint p=pt1.addition(vecP1A.projection(vecP1P2)); - Coordinate cp=new Coordinate(p.x_, p.y_, p.z_); - // Remplissage des informations relatives au point calcul\xE9 - newPtsCurv[j]=new PointProj(); - newPtsCurv[j].c=cp; - newPtsCurv[j].indiceCurviligne=new GrVecteur(cp.x-pt1.x_, cp.y-pt1.y_, cp.z-pt1.z_).division(vecP1P2); - for (int k=0; k<zone.getNbAttributes(); k++) - if (zone.getAttribute(k).isAtomicValue()) - newPtsCurv[j].data.add(((CtuluCollection)zone.getValue(k, getScene().sceneId2LayerId(i))).getObjectValueAt(j)); - } - // Tri des points en fonction de leur abcisse curviligne \\ - Arrays.sort(newPtsCurv); - // R\xE9cup\xE9ration des coordonn\xE9s - Coordinate[] newPts=new Coordinate[newPtsCurv.length]; - for (int j=0; j<newPts.length; j++) - newPts[j]=newPtsCurv[j].c; - // R\xE9cup\xE9ration des values des attributs atomiques - Object[] newData=new Object[zone.getNbAttributes()]; - int nemeAttAtomique=0; - for (int j=0; j<zone.getNbAttributes(); j++) { - if (zone.getAttribute(j).isAtomicValue()) { - Object[] values=new Object[newPtsCurv.length]; - for (int k=0; k<newPtsCurv.length; k++) - values[k]=newPtsCurv[k].data.get(nemeAttAtomique); - newData[j]=zone.getAttribute(j).createDataForGeom(values, newPtsCurv.length); - nemeAttAtomique++; - } - else - newData[j]=zone.getValue(j, getScene().sceneId2LayerId(i)); - } - // Ajout \xE0 la list des nouvelles polylignes \\ - if (!newPoly.containsKey(calque)) - newPoly.put(calque, new ArrayList<Poly>()); - newPoly.get(calque).add(new Poly(GISGeometryFactory.INSTANCE.createLineString(newPts), newData)); + GISZoneCollectionLigneBrisee zone=(GISZoneCollectionLigneBrisee) ((ZModeleEditable)calque.modeleDonnees()).getGeomData(); + + if (getScene().isAtomicMode()&&getScene().getLayerSelectionMulti().getSelection(i).getNbSelectedIndex()>1) + LibUtils.linearisePolyligne(zone, idxGeom, getScene().getLayerSelectionMulti().getSelection(i).getSelectedIndex(), cmd); + else + LibUtils.linearisePolyligne(zone, idxGeom, new int[]{0, polyligne.getNumPoints()-1}, cmd); } - CtuluCommandComposite cmd=new CtuluCommandComposite(); - // Destruction des anciennes polylignes - Arrays.sort(geoms); - for (int i=geoms.length-1; i>=0; i--) - ((ZModeleEditable)getScene().getLayerForId(geoms[i]).modeleDonnees()).getGeomData().removeGeometries(new int[]{getScene().sceneId2LayerId(geoms[i])}, cmd); - // Ajout des nouvelles polylignes - for (Map.Entry<ZCalqueAffichageDonneesInterface, List<Poly>> entry : newPoly.entrySet()) { - GISZoneCollection zone=((ZModeleEditable)((ZCalqueEditable)entry.getKey()).modeleDonnees()).getGeomData(); - List<Poly> polys=entry.getValue(); - for (int i=0; i<polys.size(); i++) - zone.addGeometry(polys.get(i).poly, polys.get(i).data, cmd); - } - // Mise \xE0 jour du undo/redo - if(mng_!=null) - mng_.addCmd(cmd.getSimplify()); - // Suppression de la selection - getScene().clearSelection(); } + // Mise \xE0 jour du undo/redo + if(mng_!=null) + mng_.addCmd(cmd.getSimplify()); + // Suppression de la selection + getScene().clearSelection(); } /** 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-30 10:28:57 UTC (rev 4428) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneLinearisePolyligneAction.java 2009-01-30 15:11:50 UTC (rev 4429) @@ -38,13 +38,13 @@ 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)."); + .getS("<p>En mode sommet, s\xE9lectionner au moins 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(); // 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 + // atomique, deux sommets au moins doivent \xEAtre selectionn\xE9s pour chacune d'entre // elles. int[] geomSelected=scn.getSelectionHelper().getSelectedIndexes(); boolean b=geomSelected.length>0; @@ -52,7 +52,7 @@ while (b&&i<geomSelected.length) { b=scn.getObject(geomSelected[i]) instanceof GISPolyligne; if (scn.isAtomicMode()) - b=b&&scn.getLayerSelectionMulti()!=null&&scn.getLayerSelectionMulti().getSelection(geomSelected[i]).getNbSelectedIndex()==2; + b=b&&scn.getLayerSelectionMulti()!=null&&scn.getLayerSelectionMulti().getSelection(geomSelected[i]).getNbSelectedIndex()>=2; i++; } setEnabled(b); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |