From: <bma...@us...> - 2008-09-16 11:05:29
|
Revision: 3928 http://fudaa.svn.sourceforge.net/fudaa/?rev=3928&view=rev Author: bmarchan Date: 2008-09-16 11:05:38 +0000 (Tue, 16 Sep 2008) Log Message: ----------- Optimisation de la vitesse de traitement lors de la suppression d'un multipoint Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneAttributeFactory.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionGeometry.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionLigneBrisee.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionMultiPoint.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttibutesContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttributesDataI.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleMultiPointEditable.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneAttributeFactory.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneAttributeFactory.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneAttributeFactory.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -9,7 +9,6 @@ import java.util.Arrays; -import com.sun.j3d.loaders.vrml97.impl.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; @@ -31,7 +30,7 @@ * @return l'interpolateur 1d */ public static GISReprojectInterpolateurI create1DInterpolateur(final GISAttributeInterface _att, - final LineString _src, final LineString _target, final GISAttributeModel _model) { + final GISCoordinateSequenceContainerInterface _src, final GISCoordinateSequenceContainerInterface _target, final GISAttributeModel _model) { final Class clazz = _att.getDataClass(); if (clazz == Integer.class) { return new GISReprojectInterpolateur1DInteger(_src.getCoordinateSequence(), _target.getCoordinateSequence(), @@ -49,40 +48,6 @@ } - /** - * @param _att l'attribut - * @param _src la liste des points source - * @param _target la liste des points cible - * @param _model le model initial - * @return l'interpolateur 1d - */ - public static GISReprojectInterpolateurI create1DInterpolateur(final GISAttributeInterface _att, - final Geometry _src, final Geometry _target, final GISAttributeModel _model) { - final Class clazz = _att.getDataClass(); - if (clazz == Integer.class) { - return new GISReprojectInterpolateur1DInteger( - new GISCoordinateSequence(_src.getCoordinates()), - new GISCoordinateSequence(_target.getCoordinates()), - (GISAttributeModelIntegerInterface) _model); - } else if (clazz == Double.class) { - return new GISReprojectInterpolateur1DDouble( - new GISCoordinateSequence(_src.getCoordinates()), - new GISCoordinateSequence(_target.getCoordinates()), - (GISAttributeModelDoubleInterface) _model); - } else if (clazz == Boolean.class) { - return new GISReprojectInterpolateur1DBoolean( - new GISCoordinateSequence(_src.getCoordinates()), - new GISCoordinateSequence(_target.getCoordinates()), - (GISAttributeModelBooleanInterface) _model); - } else { - return new GISReprojectInterpolateur1DObject( - new GISCoordinateSequence(_src.getCoordinates()), - new GISCoordinateSequence(_target.getCoordinates()), - (GISAttributeModelObjectInterface) _model); - } - - } - public static GISAttributeModel createModelList(final GISAttributeInterface _att, final Object _valatt, final int _capacity, final GISAttributeListener _listener, final int _initValuesNb) { final GISAttributeModelListener resfinal = _att.createListModel(_capacity); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionGeometry.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionGeometry.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionGeometry.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -129,7 +129,7 @@ } geom = GISGeometryFactory.INSTANCE.createGeometry(geom.getClass(),cs); - setValue(_ligneIdx,geom, _cmd); + setGeometry(_ligneIdx,geom, _cmd); } /** @@ -137,7 +137,7 @@ * @param _geom la nouvelle ligne * @param _cmd le receveur de commande */ - public void setValue(final int _idx, final Geometry _geom, final CtuluCommandContainer _cmd) { + public void setGeometry(final int _idx, final Geometry _geom, final CtuluCommandContainer _cmd) { if (!isGeomModifiable_) { return; } @@ -150,8 +150,9 @@ final GISAttributeInterface att = getAttribute(i); if (att.isAtomicValue()) { final GISAttributeModel m = (GISAttributeModel) (getModelListener(i).getObjectValueAt(_idx)); - final GISReprojectInterpolateurI interpolateur = GISZoneAttributeFactory.create1DInterpolateur(att, old, - _geom, m); + final GISReprojectInterpolateurI interpolateur = GISZoneAttributeFactory.create1DInterpolateur(att, + (GISCoordinateSequenceContainerInterface)old, + (GISCoordinateSequenceContainerInterface)_geom, m); getModelListener(i).setObject(_idx, m.deriveNewModel(_geom.getNumPoints(), interpolateur), cmp); } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionLigneBrisee.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionLigneBrisee.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionLigneBrisee.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -94,8 +94,9 @@ final GISAttributeInterface att = getAttribute(i); if (att.isAtomicValue()) { final GISAttributeModel m = (GISAttributeModel) (getModelListener(i).getObjectValueAt(_idx)); - final GISReprojectInterpolateurI interpolateur = GISZoneAttributeFactory.create1DInterpolateur(att, old, - _newLine, m); + final GISReprojectInterpolateurI interpolateur = GISZoneAttributeFactory.create1DInterpolateur(att, + (GISCoordinateSequenceContainerInterface)old, + (GISCoordinateSequenceContainerInterface)_newLine, m); getModelListener(i).setObject(_idx, m.deriveNewModel(_newLine.getNumPoints(), interpolateur), cmp); } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionMultiPoint.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionMultiPoint.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISZoneCollectionMultiPoint.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -190,9 +190,7 @@ } return true; } - /** - * @todo Les poly de niveau sont mal trait\xE9es - */ + public void addAtomic(final int _ligneIdx, final int _idxBefore, final double _x, final double _y, final CtuluCommandContainer _cmd) { if (!isGeomModifiable_) { @@ -211,33 +209,34 @@ } geom = GISGeometryFactory.INSTANCE.createMultiPoint(cs); - setValue(_ligneIdx,geom, _cmd); + setGeometry(_ligneIdx,geom, _cmd); } /** - * @param _idx l'indice de la ligne a changer - * @param _geom la nouvelle ligne + * @param _idxGeom l'indice de la g\xE9om\xE9trie a remplacer + * @param _geom la nouvelle g\xE9ometrie * @param _cmd le receveur de commande */ - public void setValue(final int _idx, final Geometry _geom, final CtuluCommandContainer _cmd) { + public void setGeometry(final int _idxGeom, final Geometry _geom, final CtuluCommandContainer _cmd) { if (!isGeomModifiable_) { return; } - final Geometry old = (Geometry) super.geometry_.getValueAt(_idx); + final Geometry old = (Geometry) super.geometry_.getValueAt(_idxGeom); if (old.getNumPoints() == _geom.getNumPoints() || !containsAtomicAttribute()) { - super.geometry_.setObject(_idx, _geom, _cmd); + super.geometry_.setObject(_idxGeom, _geom, _cmd); } else { final CtuluCommandComposite cmp = new CtuluCommandComposite(); for (int i = getNbAttributes() - 1; i >= 0; i--) { final GISAttributeInterface att = getAttribute(i); if (att.isAtomicValue()) { - final GISAttributeModel m = (GISAttributeModel) (getModelListener(i).getObjectValueAt(_idx)); - final GISReprojectInterpolateurI interpolateur = GISZoneAttributeFactory.create1DInterpolateur(att, old, - _geom, m); - getModelListener(i).setObject(_idx, m.deriveNewModel(_geom.getNumPoints(), interpolateur), cmp); + final GISAttributeModel m = (GISAttributeModel) (getModelListener(i).getObjectValueAt(_idxGeom)); + final GISReprojectInterpolateurI interpolateur = GISZoneAttributeFactory.create1DInterpolateur(att, + (GISCoordinateSequenceContainerInterface)old, + (GISCoordinateSequenceContainerInterface)_geom, m); + getModelListener(i).setObject(_idxGeom, m.deriveNewModel(_geom.getNumPoints(), interpolateur), cmp); } } - super.geometry_.setObject(_idx, _geom, cmp); + super.geometry_.setObject(_idxGeom, _geom, cmp); if (_cmd != null) { _cmd.addCmd(cmp.getSimplify()); } @@ -387,34 +386,14 @@ return false; } -// /** -// * @return true si contient au moins un polygone (ligne brisee fermee). -// */ -// public boolean containsPolygone() { -// final GISVisitorChooser chooser = new GISVisitorChooser(); -// for (int i = getNumGeometries() - 1; i >= 0; i--) { -// ((GISGeometry) getGeometry(i)).accept(chooser); -// if (chooser.isPolygone()) { -// return true; -// } -// } -// return false; -// } -// -// /** -// * @return true si contient au moins un polygone (ligne brisee fermee). -// */ -// public boolean containsPolyligne() { -// final GISVisitorChooser chooser = new GISVisitorChooser(); -// for (int i = getNumGeometries() - 1; i >= 0; i--) { -// ((GISGeometry) getGeometry(i)).accept(chooser); -// if (chooser.isPolyligne()) { -// return true; -// } -// } -// return false; -// } -// + /** + * Supprime des sommets sur une g\xE9om\xE9trie. + * @param _idxGeom L'indice de la g\xE9om\xE9trie. + * @param _sel La liste des sommets s\xE9lectionn\xE9s. + * @param _ui L'interface utilisateur. + * @param _cmd Le manager de commandes. + * @return true si tout s'est bien pass\xE9. + */ public boolean removeAtomics(final int _idxGeom, final CtuluListSelectionInterface _sel, final CtuluUI _ui, final CtuluCommandContainer _cmd) { if (_sel == null || _sel.isEmpty()) { @@ -423,11 +402,19 @@ boolean r = true; final Geometry old = (Geometry) getGeometry(_idxGeom); int nbPt = old.getNumPoints(); + + // Raccourci si tous les sommets sont s\xE9lectionn\xE9s. + int nbSel=_sel.getNbSelectedIndex(); + if (nbSel==nbPt) { + removeGeometries(new int[]{_idxGeom}, _cmd); + return true; + } + // les nouvelles coordonnees. - final Coordinate[] newCs = new Coordinate[nbPt]; + final Coordinate[] newCs = new Coordinate[nbPt-nbSel]; // cette liste contient les indice a enlever : creee que si necessaire // si des attribute atomics existent - final TIntArrayList idxToRemove = containsAtomicAttribute() ? new TIntArrayList(nbPt) : null; + final TIntArrayList idxToRemove = containsAtomicAttribute() ? new TIntArrayList(nbPt-nbSel) : null; // compteur tempo int count = 0; @@ -437,69 +424,27 @@ idxToRemove.add(idxPt); } } else { - newCs[count++] = (Coordinate)old.getCoordinates()[idxPt].clone(); + newCs[count++] = ((GISCoordinateSequenceContainerInterface)old).getCoordinateSequence().getCoordinate(idxPt); } } - GISMultiPoint newGeom = null; - -// // Un polygone -// if (line/*.isClosed()*/ instanceof GISPolygone) { -// if (count < 3) { -// r = false; -// if (_ui != null) { -// _ui.error(null, CtuluLib.getS("La ligne brisee doit contenir {0} points au moins", CtuluLibString.TROIS), -// false); -// } -// -// } else { -// newCs[count++] = newCs[0]; -// final Coordinate[] coord = new Coordinate[count]; -// System.arraycopy(newCs, 0, coord, 0, coord.length); -// newString = GISGeometryFactory.INSTANCE.createLinearRing(coord); -// newString.setUserData(line.getUserData()); -// } -// } -// -// // Une polyligne -// else if (line instanceof GISPolyligne && ((GISPolyligne)line).isReliee()) { -// if (count < 2) { -// r = false; -// if (_ui != null) { -// _ui.error(null, CtuluLib.getS("La ligne brisee doit contenir {0} points au moins", CtuluLibString.DEUX), -// false); -// } -// if (FuLog.isTrace()) { -// FuLog.trace("EBLI: polylignes: not enough points"); -// // message -// } -// } else { -// final Coordinate[] coord = new Coordinate[count]; -// System.arraycopy(newCs, 0, coord, 0, coord.length); -// newString = GISGeometryFactory.INSTANCE.createLineString(coord); -// newString.setUserData(line.getUserData()); -// } -// } - - // Une polyligne non reliee -// else if (line instanceof GISPolyligne && !((GISPolyligne)line).isReliee()) { - if (count < 1) { - r = false; - if (_ui != null) { - _ui.error(null, CtuluLib.getS("La ligne non reliee doit contenir {0} points au moins", CtuluLibString.UN), - false); - } - if (FuLog.isTrace()) { - FuLog.trace("EBLI: polylignes: not enough points"); - // message - } - } else { - final Coordinate[] coord = new Coordinate[count]; - System.arraycopy(newCs, 0, coord, 0, coord.length); - newGeom = (GISMultiPoint)GISGeometryFactory.INSTANCE.createMultiPoint(coord); -// ((GISPolyligne)newString).setReliee(false); - newGeom.setUserData(old.getUserData()); + GISMultiPoint newGeom=null; + if (count<1) { + r=false; + if (_ui!=null) { + _ui.error(null, CtuluLib.getS("La ligne non reliee doit contenir {0} points au moins", CtuluLibString.UN), false); } -// } + if (FuLog.isTrace()) { + FuLog.trace("EBLI: polylignes: not enough points"); + // message + } + } + else { +// final Coordinate[] coord=new Coordinate[count]; +// System.arraycopy(newCs, 0, coord, 0, coord.length); + newGeom=(GISMultiPoint)GISGeometryFactory.INSTANCE.createMultiPoint(newCs); + newGeom.setUserData(old.getUserData()); + } + if (r) { super.geometry_.setObject(_idxGeom, newGeom, _cmd); // si des attributs atomics sont concerne Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttibutesContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttibutesContainer.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttibutesContainer.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -94,11 +94,11 @@ nbGeom_++; } - public int getNumGeometry() { + public int getNbVertex() { return nbGeom_; } - public int getNumValues() { + public int getNbValues() { return name_.length; } @@ -169,11 +169,11 @@ } } - public int getNumGeometry() { + public int getNbVertex() { return 1; } - public int getNumValues() { + public int getNbValues() { return name_.length; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttributesDataI.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttributesDataI.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttributesDataI.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -18,12 +18,12 @@ /** * @return Nombre de sommets de la g\xE9om\xE9trie en cours. */ - public abstract int getNumGeometry(); + public abstract int getNbVertex(); /** * @return Le nombre de valeurs d'attribut par sommet. */ - public abstract int getNumValues(); + public abstract int getNbValues(); /** * @param _i L'index d'attribut [0,getNbValues()] @@ -32,20 +32,22 @@ public abstract GISAttributeInterface getAttribute(int _i); /** - * Retourne la valeur pour l'attribut et le sommet. + * Retourne la valeur pour l'attribut et le sommet. Si l'attribut est global, le num\xE9ro de sommet + * n'a pas d'importance. + * * @param _attr La definition d'attribut - * @param _numGeometry Le sommet. + * @param _idxVertex Le sommet. * @return La valeur atomique pour le sommet. */ - public abstract Object getValue(GISAttributeInterface _attr,int _numGeometry); + public abstract Object getValue(GISAttributeInterface _attr,int _idxVertex); /** * Definit la valeur pour l'attribut et le sommet. * @param _attr La definition d'attribut - * @param _numGeometry Le sommet. + * @param _idxVertex Le sommet. * @param _val La valeur atomique. */ - public abstract void setValue(GISAttributeInterface _attr,int _numGeometry,Object _val); + public abstract void setValue(GISAttributeInterface _attr,int _idxVertex, Object _val); /** * Ajout d'un sommet, et cr\xE9ation des valeurs d'attributs en consequence. Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java 2008-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -61,7 +61,7 @@ for (int i = r.length - 1; i >= 0; i--) { final GISAttributeInterface att = geometries_.getAttribute(i); if (att.isAtomicValue()) { - final Object[] ri = new Object[_d.getNumGeometry()]; + final Object[] ri = new Object[_d.getNbVertex()]; for (int gi = ri.length - 1; gi >= 0; gi--) { ri[gi] = _d.getValue(att, gi); if (FuLog.isTrace()) { 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-09-16 07:47:06 UTC (rev 3927) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleMultiPointEditable.java 2008-09-16 11:05:38 UTC (rev 3928) @@ -402,9 +402,17 @@ } } - public void addAtomic(final int _ligneIdx,final int _idxBefore,final double _x,final double _y,final CtuluCommandContainer _cmd){ + /** + * Ajoute un sommet X,Y \xE0 la g\xE9om\xE9trie donn\xE9e. Les valeurs des attributs sont interpol\xE9es \xE9ventuellement. + * @param _idxGeom La g\xE9om\xE9trie modifi\xE9e. + * @param _idxBefore Le sommet qui sera le pr\xE9cedent de celui ajout\xE9. + * @param _x La coordonn\xE9e X du point. + * @param _y La coordonn\xE9e Y du point. + * @param _cmd Le manager de commandes. + */ + public void addAtomic(final int _idxGeom,final int _idxBefore,final double _x,final double _y,final CtuluCommandContainer _cmd){ if (geometries_ == null) return; - geometries_.addAtomic(_ligneIdx, _idxBefore, _x, _y, _cmd); + geometries_.addAtomic(_idxGeom, _idxBefore, _x, _y, _cmd); } protected GISZoneCollectionMultiPoint createCollection(){ @@ -456,7 +464,7 @@ for (int i = r.length - 1; i >= 0; i--) { final GISAttributeInterface att = geometries_.getAttribute(i); if (att.isAtomicValue()) { - final Object[] ri = new Object[_d.getNumGeometry()]; + final Object[] ri = new Object[_d.getNbVertex()]; for (int gi = ri.length - 1; gi >= 0; gi--) { ri[gi] = _d.getValue(att, gi); if (FuLog.isTrace()) { @@ -523,7 +531,7 @@ } final GISMultiPoint geo = (GISMultiPoint) GISGeometryFactory.INSTANCE.createMultiPoint(newSeq); - geometries_.setValue(i, geo, cmp); + geometries_.setGeometry(i, geo, cmp); } } if (_cmd != null) { @@ -667,7 +675,7 @@ } return false; } - geometries_.setValue(idx, geo, cmp); + geometries_.setGeometry(idx, geo, cmp); if (newvals!=null) getGeomData().getModel(zAtt).setObject(idx, newvals, cmp); @@ -740,7 +748,7 @@ newSeq[j].y=dynew+_yreel0; } final GISMultiPoint poly = (GISMultiPoint) GISGeometryFactory.INSTANCE.createMultiPoint(newSeq); - geometries_.setValue(i, poly, cmp); + geometries_.setGeometry(i, poly, cmp); } } @@ -794,7 +802,7 @@ } return false; } - geometries_.setValue(idx, geo, cmp); + geometries_.setGeometry(idx, geo, cmp); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |