From: <emm...@us...> - 2009-01-21 09:11:27
|
Revision: 4388 http://fudaa.svn.sourceforge.net/fudaa/?rev=4388&view=rev Author: emmanuel_martin Date: 2009-01-21 09:11:20 +0000 (Wed, 21 Jan 2009) Log Message: ----------- Tache 148 : "Ajouter une fonction "fusion de biefs"" Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java 2009-01-20 23:25:33 UTC (rev 4387) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java 2009-01-21 09:11:20 UTC (rev 4388) @@ -323,6 +323,13 @@ public String getID() { return "ATTRIBUTE_INTERSECTIONS_LIGNES_DIRECTRICES"; } + @Override + protected Object createGlobalValues(Object _initValues) { + if (_initValues instanceof GISAttributeModelIntegerList) + return _initValues; + else + return getDefaultValue(); + }; }; /** Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-01-20 23:25:33 UTC (rev 4387) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-01-21 09:11:20 UTC (rev 4388) @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.BitSet; import java.util.List; import javax.swing.DefaultListSelectionModel; @@ -17,17 +18,28 @@ import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluCommandManager; +import org.fudaa.ctulu.CtuluListSelection; +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; +import org.fudaa.ctulu.gis.GISPolyligne; +import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ebli.calque.BCalque; import org.fudaa.ebli.calque.ZModeleLigneBrisee; +import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; import org.fudaa.fudaa.commun.FudaaLib; import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefContainer; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefContainerAdapter; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSet; +import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsProfil1d; import org.fudaa.fudaa.modeleur.modeleur1d.view.VueBief; +import org.fudaa.fudaa.modeleur.modeleur1d.view.VueFusionBief; import org.fudaa.fudaa.modeleur.modeleur1d.view.VueModuleGestionBief; import org.fudaa.fudaa.sig.layer.FSigLayerLineEditable; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.CoordinateSequence; + /** * Controller permettant de g\xE9rer (cr\xE9er, modifier, supprimer, selectionner) les biefs. * @author Emmanuel MARTIN @@ -156,10 +168,176 @@ * Fusion de deux biefs. */ public void fusionnerBiefs(int _idxBief1, int _idxBief2){ - //TODO + // D\xE9termine le premier axe hydraulique et le second + double bief1BaseCurv; + double bief2BaseCurv; + { // Bloque r\xE9duisant artificiellement la port\xE9 des variables + String name1=biefSet_.getBiefName(_idxBief1); + String name2=biefSet_.getBiefName(_idxBief2); + Bief bief1=biefSet_.getBief(name1); + Bief bief2=biefSet_.getBief(name2); + GISZoneCollection zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); + bief1BaseCurv=(Double)zoneAxeHydrau1.getValue(zoneAxeHydrau1.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 0); + GISZoneCollection zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); + bief2BaseCurv=(Double)zoneAxeHydrau2.getValue(zoneAxeHydrau2.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 0); + + // Verifications + if(bief1==null||bief2==null) + throw new IllegalArgumentException(FudaaLib.getS("Au moins un des index ne correspond pas \xE0 un bief.")); + if(bief1.lignesDirectrices_.getNombre()!=bief2.lignesDirectrices_.getNombre()) + throw new IllegalArgumentException(FudaaLib.getS("Il doit y avoir le m\xEAme nombre de lignes directrices dans les deux biefs.")); + + // Inversion des biefs si n\xE9c\xE9ssaire + if (bief1BaseCurv>bief2BaseCurv) { + int idxTmp=_idxBief1; + _idxBief1=_idxBief2; + _idxBief2=idxTmp; + double valTmp=bief1BaseCurv; + bief1BaseCurv=bief2BaseCurv; + bief2BaseCurv=valTmp; + } + } + { // Bloque r\xE9duisant artificiellement la port\xE9 des variables + String name1=biefSet_.getBiefName(_idxBief1); + String name2=biefSet_.getBiefName(_idxBief2); + CoordinateSequence seqAxe1=biefSet_.getBief(name1).axeHydraulique_.getGeomData().getCoordinateSequence(0); + CoordinateSequence seqAxe2=biefSet_.getBief(name2).axeHydraulique_.getGeomData().getCoordinateSequence(0); + double bief1MaxCurvBrut=UtilsProfil1d.abscisseCurviligne(seqAxe1, seqAxe1.getCoordinate(seqAxe1.size()-1)); + double bief2MaxCurvBrut=UtilsProfil1d.abscisseCurviligne(seqAxe2, seqAxe2.getCoordinate(seqAxe2.size()-1)); + + if(bief1BaseCurv+bief1MaxCurvBrut>bief2BaseCurv) { + VueFusionBief vueFusionBief=new VueFusionBief(controller1d_.getFormater(), name1, bief1BaseCurv, bief1MaxCurvBrut, name2, bief2BaseCurv, bief2MaxCurvBrut); + if(!vueFusionBief.run()) + return; + bief1BaseCurv=vueFusionBief.getAbsCurvAxe1(); + bief2BaseCurv=vueFusionBief.getAbsCurvAxe2(); + } + + // Inversion des biefs si n\xE9c\xE9ssaire + if (bief1BaseCurv>bief2BaseCurv) { + int idxTmp=_idxBief1; + _idxBief1=_idxBief2; + _idxBief2=idxTmp; + double valTmp=bief1BaseCurv; + bief1BaseCurv=bief2BaseCurv; + bief2BaseCurv=valTmp; + } + } + + String name1=biefSet_.getBiefName(_idxBief1); + String name2=biefSet_.getBiefName(_idxBief2); + Bief bief1=biefSet_.getBief(name1); + Bief bief2=biefSet_.getBief(name2); + GISZoneCollection zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); + GISZoneCollection zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); + CoordinateSequence seqAxeHydraulique1=zoneAxeHydrau1.getCoordinateSequence(0); + CoordinateSequence seqAxeHydraulique2=zoneAxeHydrau2.getCoordinateSequence(0); + + Coordinate debutAxe2=UtilsProfil1d.getCoordinateXY(seqAxeHydraulique1, bief2BaseCurv-bief1BaseCurv); + Coordinate move=UtilsProfil1d.vec(seqAxeHydraulique2.getCoordinate(0), debutAxe2); + + // Construction du nouveau bief + Bief newBief=new Bief(); + String biefName=name1+"_"+name2; + int k=1; + while(biefSet_.getBief(biefName)!=null) + biefName=name1+"_"+name2+"#"+Integer.toString(++k); + // Racourcis + GISZoneCollection zoneAxeHydraulique=newBief.axeHydraulique_.getGeomData(); + GISZoneCollection zoneProfils=newBief.profils_.getGeomData(); + GISZoneCollection bief1ZoneProfil=bief1.profils_.getGeomData(); + GISZoneCollection bief2ZoneProfil=bief2.profils_.getGeomData(); + + // Ajout de g\xE9om\xE9tries au nouveau bief \\ + // Ajout des profils des biefs d'origines + for(int i=0;i<bief1.profils_.getNombre();i++) + zoneProfils.addGeometry(bief1ZoneProfil.getGeometry(i), UtilsProfil1d.getData(i, bief1ZoneProfil), null); + for(int i=0;i<bief2.profils_.getNombre();i++) + zoneProfils.addGeometry(bief2ZoneProfil.getGeometry(i), UtilsProfil1d.getData(i, bief2ZoneProfil), null); + // Ajout de l'axe hydraulique du second bief (utile pour la translation) + zoneAxeHydraulique.addGeometry(zoneAxeHydrau2.getGeometry(0), UtilsProfil1d.getData(0, zoneAxeHydrau2), null); + + // Translation du second bief \\ + // Cr\xE9ation d'une selection contenant le second axe hydraulique + BitSet bs=new BitSet(1); + bs.set(0); + CtuluListSelection selection=new CtuluListSelection(bs); + // Application de la translation sur le second axe hydraulique + ((ZModeleLigneBriseeEditable) newBief.axeHydraulique_).moveGlobal(selection, move.x, move.y, 0, null); + // Cr\xE9ation d'une selection contenant les profils du second axe hydraulique + bs=new BitSet(zoneProfils.getNbGeometries()); + bs.set(bief1.profils_.getNombre(), zoneProfils.getNbGeometries()); + selection=new CtuluListSelection(bs); + // Application de la translation sur les profils du second axe hydraulique + ((ZModeleLigneBriseeEditable) newBief.profils_).moveGlobal(selection, move.x, move.y, 0, null); + + // Fusion des deux axes Hydrauliques \\ + String newTitre=agregeTitres(0, zoneAxeHydrau1, zoneAxeHydrau2, -1, -1); + seqAxeHydraulique2=zoneAxeHydraulique.getCoordinateSequence(0); + Coordinate[] coords=new Coordinate[seqAxeHydraulique1.size()+seqAxeHydraulique2.size()]; + int i=0; + for(;i<seqAxeHydraulique1.size();i++) + coords[i]=seqAxeHydraulique1.getCoordinate(i); + for(;i<seqAxeHydraulique2.size()+seqAxeHydraulique1.size();i++) + coords[i]=seqAxeHydraulique2.getCoordinate(i-seqAxeHydraulique1.size()); + zoneAxeHydraulique.addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(coords)), null, null); + zoneAxeHydraulique.setAttributValue(zoneAxeHydraulique.getIndiceOf(GISAttributeConstants.TITRE), 1, newTitre, null); + zoneAxeHydraulique.setAttributValue(zoneAxeHydrau1.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 1, bief1BaseCurv, null); + // suppression de l'axe hydraulique 2 du nouveau bief + zoneAxeHydraulique.removeGeometries(new int[]{0}, null); + + // Traitement des g\xE9om\xE9tries volatiles \\ + // Rives + calculateData(bief1.rives_.getGeomData(), bief2.rives_.getGeomData(), newBief.rives_.getGeomData()); + // Limite de stockage + calculateData(bief1.limitesStockages_.getGeomData(), bief2.limitesStockages_.getGeomData(), newBief.limitesStockages_.getGeomData()); + // Lignes directrices + calculateData(bief1.lignesDirectrices_.getGeomData(), bief2.lignesDirectrices_.getGeomData(), newBief.lignesDirectrices_.getGeomData()); + + // Ajout du nouveau bief \\ + newBief.enableSynchroniser(); + biefSet_.addBief(biefName, newBief, getCommandManager()); } + + /** + * Extrait les valeurs de titre des g\xE9om\xE9tries et en cr\xE9e une nouvelle + * g\xE9om\xE9trie avec ce titre dans _zone3. La nouvelle g\xE9om\xE9trie n'a pas de + * sommets. + */ + private void calculateData(GISZoneCollection _zone1, GISZoneCollection _zone2, GISZoneCollection _zone3) { + int idxAttrZone1=_zone1.getIndiceOf(GISAttributeConstants.TITRE); + int idxAttrZone2=_zone2.getIndiceOf(GISAttributeConstants.TITRE); + int idxAttrZone3=_zone3.getIndiceOf(GISAttributeConstants.TITRE); + for(int i=0;i<_zone1.getNbGeometries();i++) { + String newTitre=agregeTitres(i, _zone1, _zone2, idxAttrZone1, idxAttrZone2); + // Cr\xE9ation de la gom\xE9trie (elle sera correctement g\xE9n\xE9r\xE9 par le synchronizer du bief) + int idxGeom=_zone3.addGeometry(new GISPolyligne(), null, null); + // Valuation de l'attribut nom + _zone3.setAttributValue(idxAttrZone3, idxGeom, newTitre, null); + } + } /** + * Agregation de deux titres. + * Si les _idxAttrX sont \xE0 -1 il seront d\xE9termin\xE9 par la m\xE9thode. + */ + private String agregeTitres(int _idxGeom, GISZoneCollection _zone1, GISZoneCollection _zone2, int _idxAttr1, int _idxAttr2) { + if(_idxAttr1==-1) + _idxAttr1=_zone1.getIndiceOf(GISAttributeConstants.TITRE); + if(_idxAttr2==-1) + _idxAttr2=_zone1.getIndiceOf(GISAttributeConstants.TITRE); + String titre1=(String) _zone1.getValue(_idxAttr1, _idxGeom); + String titre2=(String) _zone2.getValue(_idxAttr2, _idxGeom); + String newTitre; + // Calcule du nouveau nom + if(titre1.equals(titre2)) + newTitre=titre1; + else + newTitre=titre1+'_'+titre2; + return newTitre; + } + + /** * Duplique le bief selectionn\xE9. */ public void dupliquerSelectedBief() { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-20 23:25:33 UTC (rev 4387) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-21 09:11:20 UTC (rev 4388) @@ -52,9 +52,51 @@ /** Le synchroniser de gis. */ private GisZoneSynchroniser gisSynchroniser_=new GisZoneSynchroniser(); - public Bief(){} + /** + * Les models de bases sont instanci\xE9s, le synchronizer n'est pas lanc\xE9. + */ + public Bief(){ + axeHydraulique_=new MdlModel1dAxe(null); + normalizeAxeHydrauliqueAttributes(axeHydraulique_.getGeomData()); + profils_=new MdlModel2dProfile(null, null); + normalizeProfilAttributes(profils_.getGeomData()); + rives_=new MdlModel1dBank(null, null); + limitesStockages_=new MdlModel2dConstraintLine(null, null); + lignesDirectrices_=new MdlModel2dDirectionLine(null, null); + } + + /** + * Ce constructeur permet de construire un bief a partir des mod\xE8les pr\xE9sents + * dans _models. Le param\xE8tre _rawData permet d'indiquer le type de traitement + * effectu\xE9 sur ces mod\xE8les. Si _rawData est \xE0 true, les donn\xE9es dans les + * mod\xE8les sont import\xE9s en partant du princique qu'ils sont potentiellement + * erron\xE9s. De plus dans cette importation toutes les donn\xE9es 1d sont g\xE9n\xE9r\xE9es + * pendant cette construction, si des donn\xE9es 2d exitaient avant cette + * construction, elles seront \xE9cras\xE9es. si _rawData est mise \xE0 false, les + * model\xE8s pass\xE9s en param\xE8tres sont consid\xE9r\xE9s comme venant du 1d et fiable. + * Dans ce cas si les donn\xE9es sp\xE9cifiques au 1d ne sont pas \xE9cras\xE9s. Une des + * grosses diff\xE9rences de traitement entre _rawData vrai et faux, finalement, + * est que pour le vrai les donn\xE9es sp\xE9cifiques au 1d sont g\xE9n\xE9r\xE9es \xE0 partir + * des g\xE9om\xE9tries volatiles, pas pour le faut. Le faux peut donc se passer des + * g\xE9om\xE9tries volatils du moment qu'elles sont d\xE9finies dans les attributs 1d. + */ + public Bief(ZModeleLigneBrisee[] _models, boolean _rawData) { + if(_rawData) + buildWithUntrustData(_models); + else + buildWithTrustData(_models); + } + + /** + * Correspond au constructeur Bief(ZModeleLigneBrisee[] _models, boolean + * _rawData) avec _rawData \xE0 true. Void le docstring de + * Bief(ZModeleLigneBrisee[] _models, boolean _rawData) pour plus de d\xE9tails. + */ + public Bief(ZModeleLigneBrisee[] _models){ + buildWithUntrustData(_models); + } - public Bief(ZModeleLigneBrisee[] _models){ + private void testAndValuateModels(ZModeleLigneBrisee[] _models) { if (_models==null) throw new IllegalArgumentException("_models ne peut pas \xEAtre null."); for (int i=0; i<_models.length; i++) { @@ -110,6 +152,16 @@ limitesStockages_=new MdlModel2dConstraintLine(null, null); if (lignesDirectrices_==null) lignesDirectrices_=new MdlModel2dDirectionLine(null, null); + } + + private void buildWithTrustData(ZModeleLigneBrisee[] _models) { + testAndValuateModels(_models); + // Activation du synchroniser + gisSynchroniser_.enable(); + } + + private void buildWithUntrustData(ZModeleLigneBrisee[] _models) { + testAndValuateModels(_models); // Valuation des attributs sp\xE9cifiques au 1d pour les profils \\ GISZoneCollection zone=profils_.getGeomData(); normalizeProfilAttributes(zone); @@ -276,7 +328,7 @@ // Inversion des attributs atomiques for(int i=0;i<zone.getNbAttributes();i++) if(zone.getAttribute(i).isAtomicValue()) { - GISAttributeModel model=((GISAttributeModel)zone.getDataModel(i)); + GISAttributeModel model=(GISAttributeModel)zone.getDataModel(i).getObjectValueAt(_idxProfil); Object valueTmp=model.getObjectValueAt(l); model.setObject(l, model.getObjectValueAt(coords.length-1-l), null); model.setObject(l, valueTmp, null); @@ -573,11 +625,6 @@ private ZModeleLigneBrisee limitesStockagsesModified_; /** Le model de lignes directrices modifi\xE9. */ private ZModeleLigneBrisee lignesDirectricesModified_; - // Les index des g\xE9om\xE9tries. \\ - private int idxRiveGauche_=-1; - private int idxRiveDroite_=-1; - private int idxLimiteStockageGauche_=-1; - private int idxLimiteStockageDroite_=-1; // Les index des attributs \\ private int idxAttRiveGauche_=-1; private int idxAttRiveDroite_=-1; @@ -589,8 +636,9 @@ * Active/met \xE0 jour le synchroniser. */ public void enable() { - if(profilsListen_!=null&&profilsListen_!=profils_) - profilsListen_.removeModelListener(this); + // Met tout au propre + disable(); + // R\xE9g\xE9n\xE8re tout if(profils_!=null) { profils_.addModelListener(this); profilsListen_=profils_; @@ -602,67 +650,86 @@ idxAttlsGauche_=profilsListen_.getGeomData().getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE); idxAttlsDroite_=profilsListen_.getGeomData().getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE); idxAttlignesDirectrices_=profilsListen_.getGeomData().getIndiceOf(GISAttributeConstants.INTERSECTIONS_LIGNES_DIRECTRICES); - // D\xE9termination des index de g\xE9om\xE9tries + // Normalisation de la position des g\xE9om\xE9tries et cr\xE9ation des g\xE9om\xE9tries manquantes \\ + /* + * Dans les zones de rives et de limites de stockages, les g\xE9om\xE9tries gauches sont \xE0 la + * position 0 et les g\xE9om\xE9tries droites sont \xE0 la position 1. + */ // Rives - if(rivesModified_.getNombre()>0) { - if(isDroite(rivesModified_.getGeomData().getGeometry(0))) - idxRiveDroite_=0; - else - idxRiveGauche_=0; + if(rivesModified_.getNombre()==0) { + rivesModified_.getGeomData().addGeometry(new GISPolyligne(), null, null); + rivesModified_.getGeomData().addGeometry(new GISPolyligne(), null, null); } - if(rivesModified_.getNombre()>1) { - if(isDroite(rivesModified_.getGeomData().getGeometry(1))) - idxRiveDroite_=1; - else - idxRiveGauche_=1; + else if(rivesModified_.getNombre()==1) { + rivesModified_.getGeomData().addGeometry(new GISPolyligne(), null, null); + if(position(rivesModified_.getGeomData().getGeometry(0))==1) + rivesModified_.getGeomData().switchGeometries(0, 1, null); + } + else if (rivesModified_.getNombre()==2) { + int pos=position(rivesModified_.getGeomData().getGeometry(0)); + if(pos==0) + if(position(rivesModified_.getGeomData().getGeometry(1))==-1) + rivesModified_.getGeomData().switchGeometries(0, 1, null); + if(pos==1) + rivesModified_.getGeomData().switchGeometries(0, 1, null); } - if(rivesModified_.getNombre()>2) - throw new IllegalArgumentException("Le nombre de rives est sup\xE9rieur \xE0 deux."); + else + throw new IllegalArgumentException(FudaaLib.getS("Le nombre de rives est sup\xE9rieur \xE0 deux.")); // Limites de stockages - if(limitesStockagsesModified_.getNombre()>0) { - if(isDroite(limitesStockagsesModified_.getGeomData().getGeometry(0))) - idxLimiteStockageDroite_=0; - else - idxLimiteStockageGauche_=0; + if(limitesStockagsesModified_.getNombre()==0) { + limitesStockagsesModified_.getGeomData().addGeometry(new GISPolyligne(), null, null); + limitesStockagsesModified_.getGeomData().addGeometry(new GISPolyligne(), null, null); } - if(limitesStockagsesModified_.getNombre()>1) { - if(isDroite(limitesStockagsesModified_.getGeomData().getGeometry(1))) - idxLimiteStockageDroite_=1; - else - idxLimiteStockageGauche_=1; + else if(limitesStockagsesModified_.getNombre()==1) { + limitesStockagsesModified_.getGeomData().addGeometry(new GISPolyligne(), null, null); + if(position(limitesStockagsesModified_.getGeomData().getGeometry(0))==1) + limitesStockagsesModified_.getGeomData().switchGeometries(0, 1, null); + } + else if (limitesStockagsesModified_.getNombre()==2) { + int pos=position(limitesStockagsesModified_.getGeomData().getGeometry(0)); + if(pos==0) + if(position(limitesStockagsesModified_.getGeomData().getGeometry(1))==-1) + limitesStockagsesModified_.getGeomData().switchGeometries(0, 1, null); + if(pos==1) + limitesStockagsesModified_.getGeomData().switchGeometries(0, 1, null); } - if(limitesStockagsesModified_.getNombre()>2) - throw new IllegalArgumentException("Le nombre de limite de stockage est sup\xE9rieur \xE0 deux."); + else + throw new IllegalArgumentException(FudaaLib.getS("Le nombre de limite de stockage est sup\xE9rieur \xE0 deux.")); + regenerateAll(); } - regenerateAll(); } /** - * D\xE9termine si la courbe est \xE0 gauche de l'axe hydraulique. + * D\xE9termine la position de la courbe par rapport \xE0 l'axe hydraulique en se basant sur les profils. + * Retourne -1 si \xE0 gauche, 0 si ind\xE9terminable, 1 si \xE0 droite. */ - private boolean isDroite(Geometry _geom) { + private int position(Geometry _geom) { // Recherche d'intersection de _geom avec un profil boolean found=false; int i=-1; - Coordinate intersectionRive=null; + Coordinate coordIntersection=null; while(!found&&++i<profilsListen_.getNombre()) { Geometry inter=_geom.intersection((Geometry) profilsListen_.getObject(i)); if(inter.getNumPoints()==1) { found=true; - intersectionRive=inter.getCoordinate(); + coordIntersection=inter.getCoordinate(); } } + if(!found) + return 0; // Calcul de l'abscisse curviligne de l'axe hydraulique sur le profil. Geometry axeHydraulique=(Geometry) axeHydraulique_.getObject(0); Geometry intersection=((Geometry) profilsListen_.getObject(i)).intersection(axeHydraulique); - // D\xE9termination de la gauche - if(found&&intersection.getNumPoints()==1) { + // D\xE9termination de la droite + if(intersection.getNumPoints()==1) { CoordinateSequence seqProfil=profilsListen_.getGeomData().getCoordinateSequence(i); double abscisseCurvIntersectionAxe=UtilsProfil1d.abscisseCurviligne(seqProfil, intersection.getCoordinate()); - if(abscisseCurvIntersectionAxe>UtilsProfil1d.abscisseCurviligne(seqProfil, intersectionRive)) - return true; + if(abscisseCurvIntersectionAxe>UtilsProfil1d.abscisseCurviligne(seqProfil, coordIntersection)) + return 1; + else + return -1; } - return false; + return 0; } /** @@ -676,10 +743,6 @@ rivesModified_=null; limitesStockagsesModified_=null; lignesDirectricesModified_=null; - idxRiveGauche_=-1; - idxRiveDroite_=-1; - idxLimiteStockageGauche_=-1; - idxLimiteStockageDroite_=-1; idxAttRiveGauche_=-1; idxAttRiveDroite_=-1; idxAttlsGauche_=-1; @@ -694,27 +757,9 @@ private void destroyGeometries() { // Suppression des anciennes g\xE9om\xE9tries \\ // Rives - int[] idxRives=new int[0]; - if(idxRiveGauche_!=-1&&idxRiveDroite_!=-1) - idxRives=new int[]{idxRiveGauche_, idxRiveDroite_}; - else if(idxRiveGauche_!=-1) - idxRives=new int[]{idxRiveGauche_}; - else if(idxRiveDroite_!=-1) - idxRives=new int[]{idxRiveDroite_}; - rivesModified_.getGeomData().removeGeometries(idxRives, null); - idxRiveGauche_=-1; - idxRiveDroite_=-1; + rivesModified_.getGeomData().removeGeometries(new int[]{0, 1}, null); // Limites stockages - int[] idxLimiteStockages=new int[0]; - if(idxLimiteStockageGauche_!=-1&&idxLimiteStockageDroite_!=-1) - idxLimiteStockages=new int[]{idxLimiteStockageGauche_, idxLimiteStockageDroite_}; - else if(idxLimiteStockageGauche_!=-1) - idxLimiteStockages=new int[]{idxLimiteStockageGauche_}; - else if(idxLimiteStockageDroite_!=-1) - idxLimiteStockages=new int[]{idxLimiteStockageDroite_}; - limitesStockagsesModified_.getGeomData().removeGeometries(idxLimiteStockages, null); - idxLimiteStockageGauche_=-1; - idxLimiteStockageDroite_=-1; + limitesStockagsesModified_.getGeomData().removeGeometries(new int[]{0, 1}, null); // Lignes directrices int[] idx=new int[lignesDirectricesModified_.getNombre()]; for(int i=0;i<idx.length;i++) @@ -733,23 +778,23 @@ public void attributeValueChangeAction(Object _source, int att, GISAttributeInterface _att, int _idxGeom, Object value) { if(_att==GISAttributeConstants.INTERSECTION_RIVE_GAUCHE) - updateGeom(_idxGeom, rivesModified_, idxRiveGauche_, idxAttRiveGauche_); + updateGeom(_idxGeom, rivesModified_, 0, idxAttRiveGauche_); else if(_att==GISAttributeConstants.INTERSECTION_RIVE_DROITE) - updateGeom(_idxGeom, rivesModified_, idxRiveDroite_, idxAttRiveDroite_); + updateGeom(_idxGeom, rivesModified_, 1, idxAttRiveDroite_); else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE) - updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageGauche_, idxAttlsGauche_); + updateGeom(_idxGeom, limitesStockagsesModified_, 0, idxAttlsGauche_); else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE) - updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageDroite_, idxAttlsDroite_); + updateGeom(_idxGeom, limitesStockagsesModified_, 1, idxAttlsDroite_); else if(_att==GISAttributeConstants.INTERSECTIONS_LIGNES_DIRECTRICES) updateLd(_idxGeom); } public void geometryAction(Object _source, int _idxGeom, Geometry _geom, int _action) { if(_action==ZModelGeometryListener.GEOMETRY_ACTION_MODIFY) { - updateGeom(_idxGeom, rivesModified_, idxRiveGauche_, idxAttRiveGauche_); - updateGeom(_idxGeom, rivesModified_, idxRiveDroite_, idxAttRiveDroite_); - updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageGauche_, idxAttlsGauche_); - updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageDroite_, idxAttlsDroite_); + updateGeom(_idxGeom, rivesModified_, 0, idxAttRiveGauche_); + updateGeom(_idxGeom, rivesModified_, 1, idxAttRiveDroite_); + updateGeom(_idxGeom, limitesStockagsesModified_, 0, idxAttlsGauche_); + updateGeom(_idxGeom, limitesStockagsesModified_, 1, idxAttlsDroite_); updateLd(_idxGeom); } } @@ -786,50 +831,38 @@ // Ajout des nouvelles g\xE9o\xE9mtries \\ // Extraction des anciennes donn\xE9es - Object[] dataRiveGauche=getData(idxRiveGauche_, rivesModified_.getGeomData()); - Object[] dataRiveDroite=getData(idxRiveDroite_, rivesModified_.getGeomData()); - Object[] dataLsGauche=getData(idxLimiteStockageGauche_, rivesModified_.getGeomData()); - Object[] dataLsDroite=getData(idxLimiteStockageDroite_, rivesModified_.getGeomData()); + Object[] dataRiveGauche=UtilsProfil1d.getData(0, rivesModified_.getGeomData()); + Object[] dataRiveDroite=UtilsProfil1d.getData(1, rivesModified_.getGeomData()); + Object[] dataLsGauche=UtilsProfil1d.getData(0, rivesModified_.getGeomData()); + Object[] dataLsDroite=UtilsProfil1d.getData(1, rivesModified_.getGeomData()); Object[][] dataLignesDirectrices=new Object[lignesDirectricesModified_.getNombre()][]; for(int i=0;i<lignesDirectricesModified_.getNombre();i++) - dataLignesDirectrices[i]=getData(i, lignesDirectricesModified_.getGeomData()); + dataLignesDirectrices[i]=UtilsProfil1d.getData(i, lignesDirectricesModified_.getGeomData()); // Destruction des g\xE9om\xE9tries destroyGeometries(); // Ajout des geometries \\ // Rives - if (riveGauche.length>1&&riveGauche[0]!=null&&rivesModified_!=null) - idxRiveGauche_=rivesModified_.getGeomData().addGeometry( - new GISPolyligne(new GISCoordinateSequenceFactory().create(riveGauche)), dataRiveGauche, null); - if (riveDroite.length>1&&riveDroite[0]!=null&&rivesModified_!=null) - idxRiveDroite_=rivesModified_.getGeomData().addGeometry( - new GISPolyligne(new GISCoordinateSequenceFactory().create(riveDroite)), dataRiveDroite, null); + if (riveGauche.length>1&&riveGauche[0]!=null&&rivesModified_!=null&&riveDroite.length>1&&riveDroite[0]!=null + &&rivesModified_!=null) { + rivesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(riveGauche)), + dataRiveGauche, null); + rivesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(riveDroite)), + dataRiveDroite, null); + } // Limites de stockages - if (lsGauche.length>1&&lsGauche[0]!=null&&limitesStockagsesModified_!=null) - idxLimiteStockageGauche_=limitesStockagsesModified_.getGeomData().addGeometry( - new GISPolyligne(new GISCoordinateSequenceFactory().create(lsGauche)), dataLsGauche, null); - if (lsDroite.length>1&&lsDroite[0]!=null&&limitesStockagsesModified_!=null) - idxLimiteStockageDroite_=limitesStockagsesModified_.getGeomData().addGeometry( - new GISPolyligne(new GISCoordinateSequenceFactory().create(lsDroite)), dataLsDroite, null); + if (lsGauche.length>1&&lsGauche[0]!=null&&limitesStockagsesModified_!=null&&lsDroite.length>1&&lsDroite[0]!=null + &&limitesStockagsesModified_!=null) { + limitesStockagsesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(lsGauche)), + dataLsGauche, null); + limitesStockagsesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(lsDroite)), + dataLsDroite, null); + } // Lignes directrices for (int i=0; i<ld.length; i++) - lignesDirectricesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(ld[i])), + if(ld[i].length>1) + lignesDirectricesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(ld[i])), dataLignesDirectrices[i], null); } - - /** - * Retourne les donn\xE9es. - * retourne null si _idxGeom est invalide. - */ - private Object[] getData(int _idxGeom, GISZoneCollection _zone) { - Object[] data=null; - if (_idxGeom>=0&&_idxGeom<_zone.getNbGeometries()) { - GISAttributeModel[] models=_zone.getModels(); - data=new Object[models.length]; - for (int i=0; i<data.length; i++) - data[i]=models[i].getObjectValueAt(_idxGeom); - } - return data; - } /** * Met \xE0 jour la geometrie volatile indiqu\xE9. Le param\xE8tre pass\xE9 est l'index du point \xE0 Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-01-20 23:25:33 UTC (rev 4387) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-01-21 09:11:20 UTC (rev 4388) @@ -7,6 +7,7 @@ */ package org.fudaa.fudaa.modeleur.modeleur1d.model; +import org.fudaa.ctulu.gis.GISAttributeModel; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; import org.fudaa.ctulu.gis.GISGeometryFactory; @@ -422,4 +423,19 @@ found=_coll[i]==_in; return found; } + + /** + * Retourne les donn\xE9es de la g\xE9om\xE9tries de _zone. + * retourne null si _idxGeom est invalide. + */ + static public Object[] getData(int _idxGeom, GISZoneCollection _zone) { + Object[] data=null; + if (_idxGeom>=0&&_idxGeom<_zone.getNbGeometries()) { + GISAttributeModel[] models=_zone.getModels(); + data=new Object[models.length]; + for (int i=0; i<data.length; i++) + data[i]=models[i].getObjectValueAt(_idxGeom); + } + return data; + } } Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java 2009-01-21 09:11:20 UTC (rev 4388) @@ -0,0 +1,125 @@ +/* + * @creation 20 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.modeleur1d.view; + +import java.awt.Container; +import java.awt.GridLayout; + +import javax.swing.SwingUtilities; + +import org.fudaa.ctulu.CtuluLib; +import org.fudaa.ctulu.gui.CtuluDialogPanel; +import org.fudaa.ebli.commun.EbliFormatterInterface; +import org.fudaa.fudaa.commun.FudaaLib; + +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuCharValidator; +import com.memoire.bu.BuGridLayout; +import com.memoire.bu.BuLabel; +import com.memoire.bu.BuPanel; +import com.memoire.bu.BuTextField; + +/** + * Petite fen\xEAtre demandant des informations suppl\xE9mentaire \xE0 l'utilisateur + * concernant la fusion de deux biefs. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class VueFusionBief extends CtuluDialogPanel { + + /* Donn\xE9es de base */ + private String name1_; + private double absCurv1_; + private double length1_; + private String name2_; + private double absCurv2_; + private double length2_; + /* Donn\xE9es de l'interface */ + private BuTextField tfAbsCurv1_; + private BuTextField tfAbsCurv2_; + + public VueFusionBief(EbliFormatterInterface _formater, String _name1, double _absCurv1, double _length1, String _name2, double _absCurv2, double _length2) { + name1_=_name1; + absCurv1_=_absCurv1; + length1_=_length1; + name2_=_name2; + absCurv2_=_absCurv2; + length2_=_length2; + + // Construction de la fen\xEAtre \\ + setLayout(new BuBorderLayout()); + // Titres + Container head=new Container(); + head.setLayout(new BuGridLayout(1)); + BuLabel titre1=new BuLabel(FudaaLib.getS("Les deux axes hydrauliques se superposes.")); + titre1.setHorizontalAlignment(SwingUtilities.CENTER); + head.add(titre1); + BuLabel titre2=new BuLabel(FudaaLib.getS("D\xE9finissez de nouvelles valeurs d'abscisses curviligne pour corriger ce probl\xE8me.")); + titre2.setHorizontalAlignment(SwingUtilities.CENTER); + head.add(titre2); + add(head, BuBorderLayout.NORTH); + // Corps + BuPanel body=new BuPanel(); + body.setLayout(new GridLayout(3, 2, 2, 2)); + BuLabel name1=new BuLabel(name1_); + name1.setHorizontalAlignment(SwingUtilities.CENTER); + body.add(name1); + BuLabel name2=new BuLabel(name2_); + name2.setHorizontalAlignment(SwingUtilities.CENTER); + body.add(name2); + tfAbsCurv1_=new BuTextField(_formater.getXYFormatter().format(absCurv1_)); + tfAbsCurv1_.setCharValidator(BuCharValidator.DOUBLE); + tfAbsCurv2_=new BuTextField(_formater.getXYFormatter().format(absCurv2_)); + tfAbsCurv2_.setCharValidator(BuCharValidator.DOUBLE); + body.add(tfAbsCurv1_); + body.add(tfAbsCurv2_); + body.add(new BuLabel(FudaaLib.getS("taille : " + _formater.getXYFormatter().format(length1_)))); + body.add(new BuLabel(FudaaLib.getS("taille : " + _formater.getXYFormatter().format(length2_)))); + add(body, BuBorderLayout.CENTER); + } + + public boolean valide() { + absCurv1_=Double.parseDouble(tfAbsCurv1_.getText()); + absCurv2_=Double.parseDouble(tfAbsCurv2_.getText()); + if(absCurv1_<=absCurv2_&&absCurv1_+length1_>absCurv2_) { + setErrorText(CtuluLib.getS(name1_ + FudaaLib.getS(" est toujours chevauch\xE9 par ") + name2_ +".")); + return false; + } + else if(absCurv2_<absCurv1_&&absCurv2_+length2_>absCurv1_) { + setErrorText(CtuluLib.getS(name2_ + FudaaLib.getS(" est toujours chevauch\xE9 par ") + name1_ +".")); + return false; + } + return true; + } + + /** + * Lance l'exporter dans une fen\xEAtre modale et retourne vrai si l'utilisateur + * clic sur 'ok' \xE0 la fin, faux si il clic sur 'annuler'. + * + * @return + */ + public boolean run(){ + return CtuluDialogPanel.isOkResponse(afficheModale(this, FudaaLib.getS("Fusion de deux biefs"))); + } + + /** + * Retourne l'abscisse curviligne de l'axe 1. + */ + public double getAbsCurvAxe1() { + return absCurv1_; + } + + /** + * Retourne l'abscisse curviligne de l'axe 2. + */ + public double getAbsCurvAxe2() { + return absCurv2_; + } + +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java 2009-01-20 23:25:33 UTC (rev 4387) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java 2009-01-21 09:11:20 UTC (rev 4388) @@ -110,7 +110,7 @@ btFusionner_.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { ListSelectionModel sel=tableBiefs_.getSelectionModel(); - controllerBief_.fusionnerBiefs(sel.getMaxSelectionIndex(), sel.getMinSelectionIndex()); + controllerBief_.fusionnerBiefs(sel.getMinSelectionIndex(), sel.getMaxSelectionIndex()); } }); tableBiefs_.getSelectionModel().addListSelectionListener(new ListSelectionListener() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |