From: <emm...@us...> - 2008-12-31 12:30:50
|
Revision: 4319 http://fudaa.svn.sourceforge.net/fudaa/?rev=4319&view=rev Author: emmanuel_martin Date: 2008-12-31 12:30:46 +0000 (Wed, 31 Dec 2008) Log Message: ----------- Ajout de la visualisation des intersections rive et limites de stockage via les labels. Quelques autres modifications mineures. Modified Paths: -------------- 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/ProfilContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.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/VueCourbe.java 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 2008-12-31 12:16:36 UTC (rev 4318) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2008-12-31 12:30:46 UTC (rev 4319) @@ -84,9 +84,11 @@ // Ajout du bief biefSet_.addBief(calqueBief.getTitle(), modelsDuFutureBief.toArray(new ZModeleLigneBrisee[0]), null); } - // Selection d'office du premier Bief si il y en a un - if(biefSet_.getNbBief()>0&&selectedValue!=-1) + // Ajout d'une selection + if(biefSet_.getNbBief()>selectedValue&&selectedValue!=-1) biefSelectionModel_.addSelectionInterval(selectedValue, selectedValue); + else if(biefSet_.getNbBief()>0&&selectedValue==-1) + biefSelectionModel_.addSelectionInterval(0, 0); } /** 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 2008-12-31 12:16:36 UTC (rev 4318) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2008-12-31 12:30:46 UTC (rev 4319) @@ -153,7 +153,7 @@ throw new IllegalArgumentException("Au moins un des profils est coup\xE9 plusieurs fois ou jamais."); idxAbsCurv[j]=new Object[]{j, UtilsProfil1d.abscisseCurviligne(seqAxeHydraulique, intersection.getCoordinate())}; } - // Tri en fonctino des abcsisses curvilignes + // Tri en fonction des abcsisses curvilignes Arrays.sort((Object[])idxAbsCurv, new Comparator<Object>(){ public int compare(Object o1, Object o2) { double absCurvO1=(Double)((Object[])o1)[1]; Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2008-12-31 12:16:36 UTC (rev 4318) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2008-12-31 12:30:46 UTC (rev 4319) @@ -44,6 +44,18 @@ /** Retourne la valeur minimal de z. */ public double getZMin(); + /** Retourne l'abscisse curviligne de l'intersection avec la rive gauche. -1 si inexistant. */ + public double getAbsCurvRiveGauche(); + + /** Retourne l'abscisse curviligne de l'intersection avec la rive droite. -1 si inexistant. */ + public double getAbsCurvRiveDroite(); + + /** Retourne l'abscisse curviligne de l'intersection avec la limite de stockage gauche. -1 si inexistant. */ + public double getAbsCurvLimiteStockageGauche(); + + /** Retourne l'abscisse curviligne de l'intersection avec la limite de stockage droite. -1 si inexistant. */ + public double getAbsCurvLimiteStockageDroite(); + /** * Enregistre l'abcisse curviligne du point indiqu\xE9 en param\xE8tre. * Ce changement d'abscisse curviligne fonctionne sur tout les points. Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2008-12-31 12:16:36 UTC (rev 4318) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2008-12-31 12:30:46 UTC (rev 4319) @@ -16,6 +16,8 @@ import org.fudaa.ctulu.CtuluListSelection; import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.collection.CtuluCollection; +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISGeometryFactory; import org.fudaa.ctulu.gis.GISPolyligne; @@ -324,6 +326,40 @@ return biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_).getNumPoints(); } + private Coordinate getValueOf(GISAttributeInterface attr_) { + int idxAtt=biefContainer_.getZoneProfils().getIndiceOf(attr_); + return (Coordinate) biefContainer_.getZoneProfils().getValue(idxAtt, idxProfilSelected_); + } + + private CoordinateSequence getCoordSeq() { + return ((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)) + .getCoordinateSequence(); + } + + public double getAbsCurvRiveGauche() { + if(idxProfilSelected_==-1) + return -1; + return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getValueOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE)); + } + + public double getAbsCurvRiveDroite() { + if(idxProfilSelected_==-1) + return -1; + return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getValueOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE)); + } + + public double getAbsCurvLimiteStockageGauche() { + if(idxProfilSelected_==-1) + return -1; + return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE)); + } + + public double getAbsCurvLimiteStockageDroite() { + if(idxProfilSelected_==-1) + return -1; + return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE)); + } + public double getCurv(int _idxPoint) { if(curv_==null||_idxPoint<0||_idxPoint>=curv_.size()) throw new IllegalArgumentException("Cet index n'existe pas."); 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 2008-12-31 12:16:36 UTC (rev 4318) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2008-12-31 12:30:46 UTC (rev 4319) @@ -162,7 +162,7 @@ * Retourne -2 si la coordonn\xE9e n'appartient pas \xE0 la g\xE9om\xE9trie. */ static public int getPreviousIndex(CoordinateSequence _geom, Coordinate _point) { - if(_geom.size()>0&&_point.equals(_geom.getCoordinate(0))) + if(_point==null||_geom.size()<=0||_point.equals(_geom.getCoordinate(0))) return -1; boolean fini=false; int i=-1; @@ -182,7 +182,7 @@ * Retourne -2 si la coordonn\xE9e n'appartient pas \xE0 la g\xE9om\xE9trie. */ static public int getNextIndex(CoordinateSequence _geom, Coordinate _point) { - if(_geom.size()>0&&_point.equals(_geom.getCoordinate(_geom.size()-1))) + if(_point==null||_geom.size()<=0||_point.equals(_geom.getCoordinate(_geom.size()-1))) return -1; boolean fini=false; int i=_geom.size()-1; Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java 2008-12-31 12:16:36 UTC (rev 4318) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java 2008-12-31 12:30:46 UTC (rev 4319) @@ -82,11 +82,33 @@ data_.addProfilContainerListener(this); } + private void updateLabels() { + courbe_.removeLabels(); + // Rive gauche + double absCurv=data_.getAbsCurvRiveGauche(); + if(absCurv!=-1) + courbe_.addLabel(absCurv, "RG"); + // Rive droite + absCurv=data_.getAbsCurvRiveDroite(); + if(absCurv!=-1) + courbe_.addLabel(absCurv, "RD"); + // Limite stockage gauche + absCurv=data_.getAbsCurvLimiteStockageGauche(); + if(absCurv!=-1) + courbe_.addLabel(absCurv, "LG"); + // Limite stockage droite + absCurv=data_.getAbsCurvLimiteStockageDroite(); + if(absCurv!=-1) + courbe_.addLabel(absCurv, "LD"); + } + public void profilContainerDataModified() { + updateLabels(); grapheVue_.structureChanged(); } public void profilContainerSelectedChanged(int _idxOldProfil, int _idxNewProfil){ + updateLabels(); grapheVue_.structureChanged(); grapheVue_.restore(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-05 15:05:44
|
Revision: 4321 http://fudaa.svn.sourceforge.net/fudaa/?rev=4321&view=rev Author: emmanuel_martin Date: 2009-01-05 15:05:39 +0000 (Mon, 05 Jan 2009) Log Message: ----------- Lors de l'export 1d le radioBox correspondant ?\195?\160 l'extension ?\195?\169crite est automatiquement selectionn?\195?\169e. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-05 12:46:28 UTC (rev 4320) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-05 15:05:39 UTC (rev 4321) @@ -306,6 +306,8 @@ MascaretWriter mascaretWriter=new MascaretWriter(); mascaretWriter.setFile(vueExport.getFile()); Bief bief=controllerBief_.getSelectedBief(); + if(bief==null) + return; Object[] zones=new Object[]{bief.axeHydraulique_.getGeomData(), bief.lignesDirectrices_.getGeomData(), bief.limitesStockages_.getGeomData(), bief.profils_.getGeomData(), bief.rives_.getGeomData()}; MascaretWriter.FunctorSelectProfil functorSelectProfil=new MascaretWriter.FunctorSelectProfil() { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java 2009-01-05 12:46:28 UTC (rev 4320) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java 2009-01-05 15:05:39 UTC (rev 4321) @@ -12,6 +12,8 @@ import javax.swing.ButtonGroup; import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import org.fudaa.ctulu.CtuluLib; import org.fudaa.ctulu.CtuluLibFile; @@ -28,31 +30,46 @@ import com.memoire.bu.BuVerticalLayout; /** - * GUI de l'exporteur des donn\xE9es 1d. Il se contante de faire apparaitre un + * GUI de l'exporteur des donn\xE9es 1d. Il se contente de faire apparaitre une * fen\xEAtre modale (via la m\xE9thode 'run') puis met \xE0 disposition les * informations. Il ne fait aucun traitement par lui m\xEAme. * * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class VueExport extends CtuluDialogPanel { private CtuluFileChooserPanel fileChooser_; - private BuFileFilter[] filters_; private BuRadioButton mascaret1d_; private BuRadioButton mascaret2d_; private CtuluUI ui_; + private BuFileFilter filtre1d_; + private BuFileFilter filtre2d_; public VueExport(CtuluUI _ui) { ui_=_ui; - filters_=new BuFileFilter[]{new BuFileFilter("georef", FSigLib.getS("Fichier Mascaret"))}; + filtre1d_=new BuFileFilter("geo", FSigLib.getS("Fichier Mascaret 1d")); + filtre2d_=new BuFileFilter("georef", FSigLib.getS("Fichier Mascaret 2d")); setLayout(new BuVerticalLayout(5, true, true)); final String title=FSigLib.getS("Fichier d'exportation"); fileChooser_=new CtuluFileChooserPanel(title); fileChooser_.setAllFileFilter(false); fileChooser_.setWriteMode(true); - fileChooser_.setFilter(filters_); + fileChooser_.setFilter(new BuFileFilter[]{filtre1d_, filtre2d_}); + fileChooser_.getTf().getDocument().addDocumentListener(new DocumentListener(){ + private void updateRb() { + // Selection automatique du checkbox correspondant \xE0 l'extension + String name=fileChooser_.getTf().getText(); + if(filtre1d_.accept(name)) + mascaret1d_.setSelected(true); + else if(filtre2d_.accept(name)) + mascaret2d_.setSelected(true); + } + public void changedUpdate(DocumentEvent e) {updateRb();} + public void insertUpdate(DocumentEvent e) {updateRb();} + public void removeUpdate(DocumentEvent e) {updateRb();} + }); BuLabel lbFile=new BuLabel(title); JPanel pnFile=new JPanel(); @@ -93,14 +110,12 @@ setErrorText(CtuluLib.getS("Donnez un nom au fichier d'exportation")); return false; } - boolean bextok=false; - for (int i=0; i<filters_.length; i++) - if (filters_[i].accept(f)) - bextok=true; - if (!bextok) { + // Verification de l'extension + if(!filtre1d_.accept(f)&&!filtre2d_.accept(f)) { setErrorText(TrResource.getS("Le fichier choisi a une extension inconnue")); return false; } + // Verification de l'\xE9crasement if(f.exists()&&!ui_.question(CtuluLib.getS("Attention"), CtuluLib.getS("Le fichier {0} existe d\xE9j\xE0. Voulez-vous l'\xE9craser?", CtuluLibFile.getSansExtension(f.getName())))) return false; if (CtuluLibFile.getExtension(CtuluLibFile.getSansExtension(f.getName()))!=null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-05 15:46:54
|
Revision: 4322 http://fudaa.svn.sourceforge.net/fudaa/?rev=4322&view=rev Author: emmanuel_martin Date: 2009-01-05 15:46:50 +0000 (Mon, 05 Jan 2009) Log Message: ----------- Ajout de la visualisation de l'abscisse curviligne du profil sur l'axe hydraulique. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.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/VueTableau.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-05 15:05:39 UTC (rev 4321) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-05 15:46:50 UTC (rev 4322) @@ -306,8 +306,10 @@ MascaretWriter mascaretWriter=new MascaretWriter(); mascaretWriter.setFile(vueExport.getFile()); Bief bief=controllerBief_.getSelectedBief(); - if(bief==null) + if(bief==null) { + appli_.warn(FudaaLib.getS("Attention"), FudaaLib.getS("Il n'y a pas de bief \xE0 exporter.")); return; + } Object[] zones=new Object[]{bief.axeHydraulique_.getGeomData(), bief.lignesDirectrices_.getGeomData(), bief.limitesStockages_.getGeomData(), bief.profils_.getGeomData(), bief.rives_.getGeomData()}; MascaretWriter.FunctorSelectProfil functorSelectProfil=new MascaretWriter.FunctorSelectProfil() { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-05 15:05:39 UTC (rev 4321) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-05 15:46:50 UTC (rev 4322) @@ -76,4 +76,7 @@ /** Supprime le point indiqu\xE9 en param\xE8tre. */ public void remove(int _idxPoint, CtuluCommandContainer _cmd) throws ProfilContainerException; + + /** Retourne l'abscisse curviligne du profil sur l'axe hydraulique. -1 si inexistant. */ + public double getAbsCurvProfilOnAxeHydraulique(); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-05 15:05:39 UTC (rev 4321) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-05 15:46:50 UTC (rev 4322) @@ -360,6 +360,13 @@ return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE)); } + public double getAbsCurvProfilOnAxeHydraulique() { + if(idxProfilSelected_==-1||biefContainer_.getZoneAxeHydraulique().getNbGeometries()==0) + return -1; + return UtilsProfil1d.abscisseCurviligne(((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique().getGeometry(0)) + .getCoordinateSequence(), getCoordSeq()); + } + public double getCurv(int _idxPoint) { if(curv_==null||_idxPoint<0||_idxPoint>=curv_.size()) throw new IllegalArgumentException("Cet index n'existe pas."); @@ -760,4 +767,5 @@ for(ProfilContainerListener listener:listeners_) listener.profilContainerSelectedChanged(_idxOldProfil, _idxNewProfil); } + } 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-05 15:05:39 UTC (rev 4321) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-01-05 15:46:50 UTC (rev 4322) @@ -214,4 +214,16 @@ valueCurviligne+=_geom.getCoordinate(i).distance(_point); return valueCurviligne; } + + /** + * Retourne l'abscisse curviligne sur geom1 du croisement entre geom1 et geom2. + * Si les geometries ne se croisent pas ou se croisent en plusieurs endroits, -1 est retourn\xE9. + */ + static public double abscisseCurviligne(CoordinateSequence _geom1, CoordinateSequence _geom2){ + Geometry intersection=GISGeometryFactory.INSTANCE.createLineString(_geom1).intersection(GISGeometryFactory.INSTANCE.createLineString(_geom2)); + if(intersection.getNumPoints()!=1) + return -1; + else + return abscisseCurviligne(_geom1, intersection.getCoordinate()); + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 2009-01-05 15:05:39 UTC (rev 4321) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 2009-01-05 15:46:50 UTC (rev 4322) @@ -9,6 +9,8 @@ import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.BoxLayout; import javax.swing.JTable; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; @@ -22,6 +24,7 @@ import org.fudaa.fudaa.modeleur.modeleur1d.model.ProfilContainerListener; import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuLabel; import com.memoire.bu.BuPanel; import com.memoire.bu.BuScrollPane; @@ -53,12 +56,25 @@ data_.addProfilContainerListener(this); } + /** + * Met \xE0 jour l'affichage de l'abscisse curviligne d + */ + private void updateAbscisseCurvAxeHydraulique() { + double abscCurv=data_.getAbsCurvProfilOnAxeHydraulique(); + if(abscCurv==-1) + lblAxeHydraulique_.setText(" - "); + else + lblAxeHydraulique_.setText(formater_.getXYFormatter().format(abscCurv)); + } + public void profilContainerDataModified() { fireTableDataChanged(); + updateAbscisseCurvAxeHydraulique(); } public void profilContainerSelectedChanged(int _idxOldProfil, int _idxNewProfil){ fireTableDataChanged(); + updateAbscisseCurvAxeHydraulique(); } public Class<?> getColumnClass(int columnIndex) { @@ -105,13 +121,22 @@ private JTable table_; /** Le model du tableau affich\xE9 par le panel. */ private DefaultTableModel modelTable_; + /** L'abscisse curviligne du profil sur l'axe hydraulique. */ + private BuLabel lblAxeHydraulique_=new BuLabel(); public VueTableau(Controller1d _controller, ProfilContainer _data){ controller_=_controller; setLayout(new BuBorderLayout(2, 2)); + // Tableau modelTable_=new TableGeomModel(_data, controller_.getFormater()); table_=new CtuluTable(modelTable_); - add(new BuScrollPane(table_)); + add(new BuScrollPane(table_), BuBorderLayout.CENTER); + // Abscisse curviligne du profil sur l'axe hydraulique + Box absCurv=new Box(BoxLayout.X_AXIS); + absCurv.add(new BuLabel(FudaaLib.getS("Abscisse Curviligne : "))); + absCurv.add(lblAxeHydraulique_); + add(absCurv, BuBorderLayout.SOUTH); + // Taille setPreferredSize(new Dimension(200, 200)); setSize(getPreferredSize()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-08 15:58:22
|
Revision: 4336 http://fudaa.svn.sourceforge.net/fudaa/?rev=4336&view=rev Author: emmanuel_martin Date: 2009-01-08 15:58:18 +0000 (Thu, 08 Jan 2009) Log Message: ----------- Les donn?\195?\169es des attributs des g?\195?\169om?\195?\169tries volatiles (rives, limites de stockages...) sont concerv?\195?\169s dans le temps. Modified Paths: -------------- 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/view/VueCourbe.java 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-08 13:57:00 UTC (rev 4335) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-01-08 15:58:18 UTC (rev 4336) @@ -67,7 +67,7 @@ public void disableSynchronisers() { String[] names=biefSet_.getBiefNames(); for(int i=0;i<names.length;i++) - biefSet_.getBief(names[i]).disableSynchroniser(false); + biefSet_.getBief(names[i]).disableSynchroniser(); } /** 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-08 13:57:00 UTC (rev 4335) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-08 15:58:18 UTC (rev 4336) @@ -18,6 +18,7 @@ import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISAttributeModel; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; import org.fudaa.ctulu.gis.GISPolyligne; @@ -26,7 +27,6 @@ import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.ebli.calque.ZModelGeometryListener; import org.fudaa.ebli.calque.ZModeleLigneBrisee; -import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; import org.fudaa.fudaa.commun.FudaaLib; import org.fudaa.fudaa.modeleur.layer.MdlModel1dAxe; import org.fudaa.fudaa.modeleur.layer.MdlModel1dBank; @@ -194,7 +194,7 @@ seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); } double abscisseCurvIntersectionAxe=UtilsProfil1d.abscisseCurviligne(seqProfil, interAxeProfil); - // Ajout des points au profil si n\xE9c\xE9ssaire pour les intersections \\ + // Ajout des points au profil si n\xE9c\xE9ssaire pour les intersections \\ // Rives for (int l=0; l<rives_.getNombre(); l++) createPointIfNeeded(k, (GISPolyligne) rives_.getObject(l)); @@ -217,15 +217,6 @@ valuateProfilIntersection(k, (Geometry) limitesStockages_.getObject(l), idxAttlsGauche, idxAttlsDroite, abscisseCurvIntersectionAxe); } } - // Suppression des anciennes g\xE9om\xE9tries de rives, limites de stockage et lignes directrices \\ - int[] idxRives=new int[rives_.getNombre()]; - for(int i=0;i<rives_.getNombre();i++) - idxRives[i]=i; - ((ZModeleLigneBriseeEditable) rives_).removeLigneBrisee(idxRives, null); - int[] idxLimiteStockage=new int[limitesStockages_.getNombre()]; - for(int i=0;i<limitesStockages_.getNombre();i++) - idxLimiteStockage[i]=i; - limitesStockages_.getGeomData().removeGeometries(idxLimiteStockage, null); // Activation du synchroniser gisSynchroniser_.enable(); } @@ -327,7 +318,7 @@ public void redo() { boolean synchroniserEnable=isSynchroniserActived(); if(synchroniserEnable) - gisSynchroniser_.disable(true); + gisSynchroniser_.disable(); cmd_.redo(); if(synchroniserEnable) gisSynchroniser_.enable(); @@ -335,7 +326,7 @@ public void undo() { boolean synchroniserEnable=isSynchroniserActived(); if(synchroniserEnable) - gisSynchroniser_.disable(true); + gisSynchroniser_.disable(); cmd_.undo(); if(synchroniserEnable) gisSynchroniser_.enable(); @@ -347,7 +338,7 @@ CtuluCommandComposite cmd=new CtuluCommandComposite("R\xE9ordonnancement des profils"); boolean synchroniserEnable=isSynchroniserActived(); if(synchroniserEnable) - gisSynchroniser_.disable(true); + gisSynchroniser_.disable(); Geometry axeHydraulique=(Geometry)axeHydraulique_.getObject(0); CoordinateSequence seqAxeHydraulique=((GISCoordinateSequenceContainerInterface)axeHydraulique).getCoordinateSequence(); // R\xE9ordonnancement des profils selon leur placement sur l'axe hydaulique (abs curv) \\ @@ -412,13 +403,9 @@ /** * D\xE9sactive le synchroniser. - * - * @param _removeGeom - * si \xE0 vrai les g\xE9om\xE9tries g\xE9n\xE9r\xE9es par le synchroniser seront - * d\xE9ruites dans l'op\xE9ration. */ - public void disableSynchroniser(boolean _removeGeom) { - gisSynchroniser_.disable(_removeGeom); + public void disableSynchroniser() { + gisSynchroniser_.disable(); } /** @@ -427,7 +414,7 @@ * Note : * Une fois activ\xE9 le synchroniser met automatiquement \xE0 jour les gis. Cette * m\xE9thode n'est utile que si les instances des models ont \xE9t\xE9 manuellement - * chang\xE9, auquel cas le synchroniser continuea sa synchronisation sur les + * chang\xE9, sinon le synchroniser continuea sa synchronisation sur les * anciens models. */ public void updateSynchroniser() { @@ -458,7 +445,6 @@ private int idxAttRiveDroite_=-1; private int idxAttlsGauche_=-1; private int idxAttlsDroite_=-1; - // TODO lignes directrices /** * Active/met \xE0 jour le synchroniser. @@ -476,18 +462,74 @@ idxAttRiveDroite_=profilsListen_.getGeomData().getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE); idxAttlsGauche_=profilsListen_.getGeomData().getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE); idxAttlsDroite_=profilsListen_.getGeomData().getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE); - // TODO lignes directrices + // D\xE9termination des index de g\xE9om\xE9tries + // Rives + if(rivesModified_.getNombre()>0) { + if(isDroite(rivesModified_.getGeomData().getGeometry(0))) + idxRiveDroite_=0; + else + idxRiveGauche_=0; + } + if(rivesModified_.getNombre()>1) { + if(isDroite(rivesModified_.getGeomData().getGeometry(1))) + idxRiveDroite_=1; + else + idxRiveGauche_=1; + } + if(rivesModified_.getNombre()>2) + throw new IllegalArgumentException("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()>1) { + if(isDroite(limitesStockagsesModified_.getGeomData().getGeometry(1))) + idxLimiteStockageDroite_=1; + else + idxLimiteStockageGauche_=1; + } + if(limitesStockagsesModified_.getNombre()>2) + throw new IllegalArgumentException("Le nombre de limite de stockage est sup\xE9rieur \xE0 deux."); } regenerateAll(); } /** + * D\xE9termine si la courbe est \xE0 gauche de l'axe hydraulique. + */ + private boolean isDroite(Geometry _geom) { + // Recherche d'intersection de _geom avec un profil + boolean found=false; + int i=-1; + Coordinate intersectionRive=null; + while(!found&&++i<profilsListen_.getNombre()) { + Geometry inter=_geom.intersection((Geometry) profilsListen_.getObject(i)); + if(inter.getNumPoints()==1) { + found=true; + intersectionRive=inter.getCoordinate(); + } + } + // 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) { + CoordinateSequence seqProfil=profilsListen_.getGeomData().getCoordinateSequence(i); + double abscisseCurvIntersectionAxe=UtilsProfil1d.abscisseCurviligne(seqProfil, intersection.getCoordinate()); + if(abscisseCurvIntersectionAxe>UtilsProfil1d.abscisseCurviligne(seqProfil, intersectionRive)) + return true; + } + return false; + } + + /** * D\xE9active le synchroniser. * @param indique si les g\xE9om\xE9tries volatiles doivent \xEAtre d\xE9truites */ - public void disable(boolean _destroyGeometries) { - if(_destroyGeometries) - destroyGeometries(); + public void disable() { if(profilsListen_!=null) { profilsListen_.removeModelListener(this); profilsListen_=null; @@ -503,7 +545,6 @@ idxAttRiveDroite_=-1; idxAttlsGauche_=-1; idxAttlsDroite_=-1; - // TODO lignes directrices } } @@ -562,7 +603,6 @@ updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageGauche_, idxAttlsGauche_); else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE) updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageDroite_, idxAttlsDroite_); - // TODO lignes directrices } public void geometryAction(Object _source, int _idxGeom, Geometry _geom, int _action) { @@ -571,7 +611,6 @@ updateGeom(_idxGeom, rivesModified_, idxRiveDroite_, idxAttRiveDroite_); updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageGauche_, idxAttlsGauche_); updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageDroite_, idxAttlsDroite_); - // TODO lignes directrices } } @@ -580,8 +619,6 @@ */ private void regenerateAll() { GISZoneCollection zone=profilsListen_.getGeomData(); - // Suppression des anciennes g\xE9om\xE9tries \\ - destroyGeometries(); // Cr\xE9ation des nouvelles g\xE9om\xE9tries \\ // Rives Coordinate[] riveGauche=new Coordinate[profilsListen_.getNombre()]; @@ -597,26 +634,44 @@ lsGauche[i]=zone.getCoordinateSequence(i).getCoordinate((Integer)zone.getValue(idxAttlsGauche_, i)); lsDroite[i]=zone.getCoordinateSequence(i).getCoordinate((Integer)zone.getValue(idxAttlsDroite_, i)); } - // Lignes directrices - //TODO // Ajout des nouvelles g\xE9o\xE9mtries \\ - //Rives + // 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()); + // Destruction des g\xE9om\xE9tries + destroyGeometries(); + // Ajout des geometries if (riveGauche.length>1&&riveGauche[0]!=null&&rivesModified_!=null) - idxRiveGauche_=rivesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(riveGauche)), null, 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)), null, null); + idxRiveDroite_=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)), null, null); + 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)), null, null); - // Lignes directrices - // TODO + new GISPolyligne(new GISCoordinateSequenceFactory().create(lsDroite)), dataLsDroite, 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 * mettre \xE0 jour (qui correspond \xE9galement \xE0 la g\xE9om\xE9trie modifi\xE9). */ Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java 2009-01-08 13:57:00 UTC (rev 4335) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java 2009-01-08 15:58:18 UTC (rev 4336) @@ -95,11 +95,11 @@ // Limite stockage gauche absCurv=data_.getAbsCurvLimiteStockageGauche(); if(absCurv!=-1) - courbe_.addLabel(absCurv, "LG"); + courbe_.addLabel(absCurv, "SG"); // Limite stockage droite absCurv=data_.getAbsCurvLimiteStockageDroite(); if(absCurv!=-1) - courbe_.addLabel(absCurv, "LD"); + courbe_.addLabel(absCurv, "SD"); } public void profilContainerDataModified() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-08 09:22:56
|
Revision: 4331 http://fudaa.svn.sourceforge.net/fudaa/?rev=4331&view=rev Author: emmanuel_martin Date: 2009-01-08 09:22:51 +0000 (Thu, 08 Jan 2009) Log Message: ----------- Les profils sont maintenant d?\195?\169pla?\195?\167ables sur l'axe hydraulique en indiquant leur abscisse curviligne. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.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/controller/ControllerProfil.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/BiefContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.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/VueTableau.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -265,6 +265,7 @@ // public void run() { // Taille des vues try { + @SuppressWarnings("unused") int w=Integer.parseInt(_props.getProperty("viewBief.width")); int h=Integer.parseInt(_props.getProperty("viewBief.height")); ((JSplitPane)controller_.getVueBief().getParent()).setDividerLocation(h); @@ -272,6 +273,7 @@ catch (NumberFormatException _exc) {} try { int w=Integer.parseInt(_props.getProperty("viewTableau.width")); + @SuppressWarnings("unused") int h=Integer.parseInt(_props.getProperty("viewTableau.height")); ((JSplitPane)controller_.getVueTableau().getParent()).setDividerLocation(w); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -24,10 +24,14 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import org.fudaa.ctulu.CtuluCommand; +import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluCommandManager; import org.fudaa.ctulu.CtuluIOOperationSynthese; import org.fudaa.ctulu.CtuluListSelectionEvent; import org.fudaa.ctulu.CtuluListSelectionListener; +import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.dodico.mascaret.io.MascaretWriter; @@ -123,10 +127,10 @@ // Vue Bief controllerBief_.getVueBief().getScene().addSelectionListener(this); // Vue tableau - vueTableau_=new VueTableau(this, controllerProfil_.getDataGeometry()); + vueTableau_=new VueTableau(this, controllerProfil_.getProfilContainer()); vueTableau_.addSelectionListener(this); // Vue courbe - vueCourbe_=new VueCourbe(this, controllerProfil_.getDataGeometry()); + vueCourbe_=new VueCourbe(this, controllerProfil_.getProfilContainer()); vueCourbe_.addSelectionListener(this); // Vue error vueError_.setForeground(Color.RED); @@ -134,6 +138,45 @@ clearError(); } + // Op\xE9rations sp\xE9ciales n\xE9c\xE9ssitant l'intervention de plusieurs controller \\ + + /** + * R\xE9ordonne les profils du bief selectionn\xE9. La selection est mise \xE0 jour. + */ + public void orderProfils(CtuluCommandContainer _cmd) { + // Gestion de l'undo/Redo sur la profil selectionn\xE9 + class UndoRedoChangeSelectionProfil implements CtuluCommand, CtuluNamedCommand { + int oldIdx_; + int newIdx_; + CtuluCommandComposite cmd_; + public UndoRedoChangeSelectionProfil(int _oldIdx, int _newIdx, CtuluCommandComposite _cmd) { + oldIdx_=_oldIdx; + newIdx_=_newIdx; + cmd_=_cmd; + } + public void redo() { + controllerProfil_.getProfilSelectionModel().setSelectedProfil(-1); + cmd_.redo(); + controllerProfil_.getProfilSelectionModel().setSelectedProfil(newIdx_); + } + public void undo() { + controllerProfil_.getProfilSelectionModel().setSelectedProfil(-1); + cmd_.undo(); + controllerProfil_.getProfilSelectionModel().setSelectedProfil(oldIdx_); + } + public String getName() { + return FudaaLib.getS("R\xE9ordonnancement des profils"); + } + } + CtuluCommandComposite cmd=new CtuluCommandComposite(); + int oldIdxProfil=controllerProfil_.getProfilSelectionModel().getSelectedProfil(); + controllerProfil_.getProfilSelectionModel().setSelectedProfil(-1); + int newIdxProfil=controllerBief_.orderProfils(controllerProfil_.getProfilSelectionModel().getSelectedProfil(), cmd); + controllerProfil_.getProfilSelectionModel().setSelectedProfil(newIdxProfil); + if(_cmd!=null) + _cmd.addCmd(new UndoRedoChangeSelectionProfil(oldIdxProfil, newIdxProfil, cmd)); + } + // Getters des vues \\ public VueBief getVueBief(){ 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-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -13,6 +13,7 @@ import javax.swing.DefaultListSelectionModel; import javax.swing.event.ListSelectionListener; +import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ebli.calque.BCalque; import org.fudaa.ebli.calque.ZModeleLigneBrisee; import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; @@ -66,8 +67,16 @@ public void disableSynchronisers() { String[] names=biefSet_.getBiefNames(); for(int i=0;i<names.length;i++) - biefSet_.getBief(names[i]).enableSynchroniser(false); + biefSet_.getBief(names[i]).disableSynchroniser(false); } + + /** + * R\xE9ordonne les profils du bief selectionn\xE9. retourne le nouvel indice de + * l'indice pass\xE9 en param\xE8tre (-1 si inutilis\xE9). + */ + public int orderProfils(int _idx, CtuluCommandContainer _cmd) { + return biefSet_.getBief(biefSelectionModel_.getSelectedName()).orderProfils(_idx, _cmd); + } /** * Importe les biefs du 2d vers le 1d. Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerProfil.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerProfil.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerProfil.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -44,7 +44,7 @@ vueModuleGestionProfil_=new VueModuleGestionProfil(this); } - public ProfilContainer getDataGeometry(){ + public ProfilContainer getProfilContainer(){ return profilContainerAdapter_; } 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-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -12,6 +12,10 @@ import java.util.Comparator; import java.util.List; +import org.fudaa.ctulu.CtuluCommand; +import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.CtuluCommandContainer; +import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; @@ -23,6 +27,7 @@ import org.fudaa.ebli.calque.ZModelGeometryListener; import org.fudaa.ebli.calque.ZModeleLigneBrisee; import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; +import org.fudaa.fudaa.commun.FudaaLib; import org.fudaa.fudaa.modeleur.layer.MdlModel1dAxe; import org.fudaa.fudaa.modeleur.layer.MdlModel1dBank; import org.fudaa.fudaa.modeleur.layer.MdlModel2dConstraintLine; @@ -152,40 +157,7 @@ if (axeHydraulique_.getNombre()==1) { Geometry axeHydraulique=(Geometry)axeHydraulique_.getObject(0); CoordinateSequence seqAxeHydraulique=((GISCoordinateSequenceContainerInterface)axeHydraulique).getCoordinateSequence(); - // R\xE9ordonnancement des profils selon leur placement sur l'axe hydaulique (abs curv) \\ - // Calcul des abscisses curvilignes - Object[][] idxAbsCurv=new Object[profils_.getNombre()][]; - for(int j=0;j<profils_.getNombre();j++) { - Geometry intersection=axeHydraulique.intersection((Geometry) profils_.getObject(j)); - if(intersection.getNumPoints()!=1) - throw new IllegalArgumentException("Au moins un des profils est coup\xE9 plusieurs fois ou jamais."); - idxAbsCurv[j]=new Object[]{j, UtilsProfil1d.abscisseCurviligne(seqAxeHydraulique, intersection.getCoordinate())}; - } - // Tri en fonction des abcsisses curvilignes - Arrays.sort((Object[])idxAbsCurv, new Comparator<Object>(){ - public int compare(Object o1, Object o2) { - double absCurvO1=(Double)((Object[])o1)[1]; - double absCurvO2=(Double)((Object[])o2)[1]; - if(absCurvO1<absCurvO2) return -1; - if(absCurvO1==absCurvO2) return 0; - else return 1; - } - }); - // R\xE9odonnancement en fonction du nouvel ordre - for (int i=0; i<idxAbsCurv.length; i++) { - if(i!=(Integer)idxAbsCurv[i][0]) { - // Mise \xE0 jour de la table de correspondance - boolean found=false; - int k=i; - while(!found&&++k<idxAbsCurv.length) - found=(Integer) idxAbsCurv[k][0]==i; - if(found) - idxAbsCurv[k][0]=idxAbsCurv[i][0]; - // Mise \xE0 jour de la gis - profils_.getGeomData().switchGeometries((Integer) idxAbsCurv[i][0], i, null); - - } - } + orderProfils(-1, null); // Construction des rives et limites de stockages \\ for (int k=0; k<profils_.getNombre(); k++) { Geometry profil=zone.getGeometry(k); @@ -342,17 +314,114 @@ } /** - * Active ou d\xE9active la synchronisation des gis. (G\xE9n\xE9ration et r\xE9g\xE9n\xE9ration - * des g\xE9om\xE9tries volatiles du type rives, limites et lignes directrices). + * R\xE9ordonne les profils du bief. Retourne le nouvel indice de l'indice pass\xE9 + * en param\xE8tre (-1 si inutilis\xE9). */ - public void enableSynchroniser(boolean _bool) { - if(_bool) + public int orderProfils(int _idx, CtuluCommandContainer _cmd) { + // Gestion de l'undo/Redo pour le r\xE9ordonnancement de profils + class UndoRedoReorderProfils implements CtuluCommand, CtuluNamedCommand { + CtuluCommandComposite cmd_; + public UndoRedoReorderProfils(CtuluCommandComposite _cmd) { + cmd_=_cmd; + } + public void redo() { + boolean synchroniserEnable=isSynchroniserActived(); + if(synchroniserEnable) + gisSynchroniser_.disable(true); + cmd_.redo(); + if(synchroniserEnable) + gisSynchroniser_.enable(); + } + public void undo() { + boolean synchroniserEnable=isSynchroniserActived(); + if(synchroniserEnable) + gisSynchroniser_.disable(true); + cmd_.undo(); + if(synchroniserEnable) + gisSynchroniser_.enable(); + } + public String getName() { + return FudaaLib.getS("R\xE9ordonnancement des profils"); + } + } + CtuluCommandComposite cmd=new CtuluCommandComposite("R\xE9ordonnancement des profils"); + boolean synchroniserEnable=isSynchroniserActived(); + if(synchroniserEnable) + gisSynchroniser_.disable(true); + Geometry axeHydraulique=(Geometry)axeHydraulique_.getObject(0); + CoordinateSequence seqAxeHydraulique=((GISCoordinateSequenceContainerInterface)axeHydraulique).getCoordinateSequence(); + // R\xE9ordonnancement des profils selon leur placement sur l'axe hydaulique (abs curv) \\ + // Calcul des abscisses curvilignes + Object[][] idxAbsCurv=new Object[profils_.getNombre()][]; + for(int j=0;j<profils_.getNombre();j++) { + Geometry intersection=axeHydraulique.intersection((Geometry) profils_.getObject(j)); + if(intersection.getNumPoints()!=1) + throw new IllegalArgumentException("Au moins un des profils est coup\xE9 plusieurs fois ou jamais."); + idxAbsCurv[j]=new Object[]{j, UtilsProfil1d.abscisseCurviligne(seqAxeHydraulique, intersection.getCoordinate())}; + } + // Tri en fonction des abcsisses curvilignes + Arrays.sort((Object[])idxAbsCurv, new Comparator<Object>(){ + public int compare(Object o1, Object o2) { + double absCurvO1=(Double)((Object[])o1)[1]; + double absCurvO2=(Double)((Object[])o2)[1]; + if(absCurvO1<absCurvO2) return -1; + if(absCurvO1==absCurvO2) return 0; + else return 1; + } + }); + int newIdx=_idx; + // R\xE9odonnancement en fonction du nouvel ordre + for (int i=0; i<idxAbsCurv.length; i++) { + if(i!=(Integer)idxAbsCurv[i][0]) { + // Mise \xE0 jour de la table de correspondance + boolean found=false; + int k=i; + while(!found&&++k<idxAbsCurv.length) + found=(Integer) idxAbsCurv[k][0]==i; + if(found) + idxAbsCurv[k][0]=idxAbsCurv[i][0]; + // Mise \xE0 jour de newIdx + if(newIdx==(Integer) idxAbsCurv[i][0]) + newIdx=i; + else if(newIdx==i) + newIdx=(Integer) idxAbsCurv[i][0]; + // Mise \xE0 jour de la gis + profils_.getGeomData().switchGeometries((Integer) idxAbsCurv[i][0], i, cmd); + } + } + if(synchroniserEnable) gisSynchroniser_.enable(); - else - gisSynchroniser_.disable(); + if(_cmd!=null) + _cmd.addCmd(new UndoRedoReorderProfils(cmd)); + return newIdx; } + + /** + * Retourne vrai si le synchroniser est activ\xE9. + */ + public boolean isSynchroniserActived() { + return gisSynchroniser_.isActived(); + } + + /** + * Active le synchroniser. + */ + public void enableSynchroniser() { + gisSynchroniser_.enable(); + } /** + * D\xE9sactive le synchroniser. + * + * @param _removeGeom + * si \xE0 vrai les g\xE9om\xE9tries g\xE9n\xE9r\xE9es par le synchroniser seront + * d\xE9ruites dans l'op\xE9ration. + */ + public void disableSynchroniser(boolean _removeGeom) { + gisSynchroniser_.disable(_removeGeom); + } + + /** * Indique au synchroniser que les models du bief ont potentiellement chang\xE9. * L'appelle \xE0 cette m\xE9thode active automatiquement le synchroniser. * Note : @@ -414,8 +483,11 @@ /** * D\xE9active le synchroniser. + * @param indique si les g\xE9om\xE9tries volatiles doivent \xEAtre d\xE9truites */ - public void disable() { + public void disable(boolean _destroyGeometries) { + if(_destroyGeometries) + destroyGeometries(); if(profilsListen_!=null) { profilsListen_.removeModelListener(this); profilsListen_=null; @@ -435,35 +507,10 @@ } } - public void attributeAction(Object _source, int att, GISAttributeInterface _att, int _action) {} - - public void attributeValueChangeAction(Object _source, int att, GISAttributeInterface _att, int _idxGeom, Object value) { - if(_att==GISAttributeConstants.INTERSECTION_RIVE_GAUCHE) - updateGeom(_idxGeom, rivesModified_, idxRiveGauche_, idxAttRiveGauche_); - else if(_att==GISAttributeConstants.INTERSECTION_RIVE_DROITE) - updateGeom(_idxGeom, rivesModified_, idxRiveDroite_, idxAttRiveDroite_); - else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE) - updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageGauche_, idxAttlsGauche_); - else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE) - updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageDroite_, idxAttlsDroite_); - // TODO lignes directrices - } - - 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_); - // TODO lignes directrices - } - } - /** - * R\xE9g\xE9n\xE8re toutes les g\xE9om\xE9tries volatiles. + * D\xE9truit les g\xE9om\xE9tries volatiles */ - private void regenerateAll() { - GISZoneCollection zone=profilsListen_.getGeomData(); + private void destroyGeometries() { // Suppression des anciennes g\xE9om\xE9tries \\ // Rives int[] idxRives=new int[0]; @@ -495,6 +542,46 @@ lignesDirectricesModified_.getGeomData().removeGeometries(idxLD, null); idxLignesDirectrices_.clear(); } + } + + /** + * Retourne vrai si activ\xE9. + */ + public boolean isActived() { + return profilsListen_!=null; + } + + public void attributeAction(Object _source, int att, GISAttributeInterface _att, int _action) {} + + public void attributeValueChangeAction(Object _source, int att, GISAttributeInterface _att, int _idxGeom, Object value) { + if(_att==GISAttributeConstants.INTERSECTION_RIVE_GAUCHE) + updateGeom(_idxGeom, rivesModified_, idxRiveGauche_, idxAttRiveGauche_); + else if(_att==GISAttributeConstants.INTERSECTION_RIVE_DROITE) + updateGeom(_idxGeom, rivesModified_, idxRiveDroite_, idxAttRiveDroite_); + else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE) + updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageGauche_, idxAttlsGauche_); + else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE) + updateGeom(_idxGeom, limitesStockagsesModified_, idxLimiteStockageDroite_, idxAttlsDroite_); + // TODO lignes directrices + } + + 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_); + // TODO lignes directrices + } + } + + /** + * R\xE9g\xE9n\xE8re toutes les g\xE9om\xE9tries volatiles. + */ + private void regenerateAll() { + GISZoneCollection zone=profilsListen_.getGeomData(); + // Suppression des anciennes g\xE9om\xE9tries \\ + destroyGeometries(); // Cr\xE9ation des nouvelles g\xE9om\xE9tries \\ // Rives Coordinate[] riveGauche=new Coordinate[profilsListen_.getNombre()]; @@ -519,10 +606,10 @@ if (riveDroite.length>1&&riveDroite[0]!=null&&rivesModified_!=null) idxRiveDroite_=rivesModified_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(riveDroite)), null, null); // Limites de stockages - if (lsGauche.length>0&&lsGauche[0]!=null&&limitesStockagsesModified_!=null) + if (lsGauche.length>1&&lsGauche[0]!=null&&limitesStockagsesModified_!=null) idxLimiteStockageGauche_=limitesStockagsesModified_.getGeomData().addGeometry( new GISPolyligne(new GISCoordinateSequenceFactory().create(lsGauche)), null, null); - if (lsDroite.length>0&&lsDroite[0]!=null&&limitesStockagsesModified_!=null) + if (lsDroite.length>1&&lsDroite[0]!=null&&limitesStockagsesModified_!=null) idxLimiteStockageDroite_=limitesStockagsesModified_.getGeomData().addGeometry( new GISPolyligne(new GISCoordinateSequenceFactory().create(lsDroite)), null, null); // Lignes directrices Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -9,12 +9,13 @@ import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; +import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; /** * Une interface permettant d'acc\xE9der aux informations du bief selectionn\xE9. * * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public interface BiefContainer { @@ -36,6 +37,9 @@ /** Retourne la zone contenant les profils. */ public GISZoneCollectionLigneBrisee getZoneProfils(); + /** Retourne le model contenant les profils. */ + public ZModeleLigneBriseeEditable getModelProfils(); + /** Retourne la zone contenant les rives. */ public GISZoneCollectionLigneBrisee getZoneRives(); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -16,6 +16,7 @@ import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; +import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; import org.fudaa.fudaa.commun.FudaaLib; /** @@ -23,7 +24,7 @@ * simplement. Il n'affiche que le bief selectionn\xE9. * * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class BiefContainerAdapter implements BiefContainer, BiefSetListener { @@ -82,6 +83,12 @@ return (GISZoneCollectionLigneBrisee)biefSet_.getBief(nomBiefSelected_).profils_.getGeomData(); } + public ZModeleLigneBriseeEditable getModelProfils() { + if(nomBiefSelected_==null) + return null; + return (ZModeleLigneBriseeEditable)biefSet_.getBief(nomBiefSelected_).profils_; + } + public GISZoneCollectionLigneBrisee getZoneRives() { if(nomBiefSelected_==null) return null; Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -56,6 +56,9 @@ /** Retourne l'abscisse curviligne de l'intersection avec la limite de stockage droite. -1 si inexistant. */ public double getAbsCurvLimiteStockageDroite(); + /** Retourne l'abscisse curviligne de l'axe sur le profil (ne pas confondre avec getAbsCurvProfilOnAxeHydraulique). -1 si inexistant. */ + public double getAbsCurvAxeHydrauliqueOnProfil(); + /** * Enregistre l'abcisse curviligne du point indiqu\xE9 en param\xE8tre. * Ce changement d'abscisse curviligne fonctionne sur tout les points. @@ -79,4 +82,14 @@ /** Retourne l'abscisse curviligne du profil sur l'axe hydraulique. -1 si inexistant. */ public double getAbsCurvProfilOnAxeHydraulique(); + + /** + * Met l'abscisse curviligne du profil sur l'axe hydraulique \xE0 _value. + * Retourne vrai il est n\xE9c\xE9ssaire d'effectuer une r\xE9ordonnancement des + * profils sur l'axe hydraulique. + * _value ne peut \xEAtre ni n\xE9gatif ni sup\xE9rieur \xE0 l'abscisse curviligne total + * de l'axe, dans ces cas une exception de type + * {@link IllegalArgumentException} est lev\xE9e. + */ + public boolean setAbsCurvProfilOnAxeHydraulique(double _value, CtuluCommandContainer _cmd) throws ProfilContainerException; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -8,6 +8,7 @@ package org.fudaa.fudaa.modeleur.modeleur1d.model; import java.util.ArrayList; +import java.util.BitSet; import java.util.List; import org.fudaa.ctulu.CtuluCommand; @@ -370,6 +371,137 @@ .getCoordinateSequence(), getCoordSeq()); } + public double getAbsCurvAxeHydrauliqueOnProfil() { + Geometry intersection=biefContainer_.getZoneAxeHydraulique().getGeometry(0).intersection( + biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)); + if (intersection.getNumPoints()!=1) + return -1; + return UtilsProfil1d.abscisseCurviligne(((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique() + .getGeometry(0)).getCoordinateSequence(), intersection.getCoordinate()); + } + + public boolean setAbsCurvProfilOnAxeHydraulique(double _value, CtuluCommandContainer _cmd) throws ProfilContainerException { + CoordinateSequence axeHydrau=((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique().getGeometry(0)) + .getCoordinateSequence(); + Geometry geomAxeHydrau=biefContainer_.getZoneAxeHydraulique().getGeometry(0); + if (_value<0||_value>UtilsProfil1d.abscisseCurviligne(axeHydrau, axeHydrau.getCoordinate(axeHydrau.size()-1))) + throw new IllegalArgumentException(FudaaLib.getS("L'abscisse curviligne doit \xEAtre entre 0 et " + +UtilsProfil1d.abscisseCurviligne(axeHydrau, axeHydrau.getCoordinate(axeHydrau.size()-1))+" inclus.")); + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("D\xE9placement d'un profil")); + // Calcul de la coordonn\xE9e actuelle de croisement entre l'axe et le profil + Geometry intersection=geomAxeHydrau.intersection( + biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)); + if (intersection.getNumPoints()!=1) + throw new ProfilContainerException(FudaaLib + .getS("Soit il n'y a pas de croisement avec l'axe hydraulique, soit il y en a plusieurs.")); + // Point de croisement actuel entre l'axe et le profil + Coordinate oldCoordCroisement=intersection.getCoordinate(); + double oldAbscisseCurviligne=UtilsProfil1d.abscisseCurviligne(axeHydrau, oldCoordCroisement); + if (!UtilsProfil1d.egal(_value, oldAbscisseCurviligne)) { + // Cr\xE9ation d'une selection contenant la g\xE9om\xE9trie \xE0 modifier + BitSet bs=new BitSet(biefContainer_.getZoneProfils().getNbGeometries()); + bs.set(idxProfilSelected_); + CtuluListSelection selection=new CtuluListSelection(bs); + // Calcul du future point de croisement entre l'axe et le profil + Coordinate newCoordCroisement=UtilsProfil1d.getCoordinateXY(axeHydrau, _value); + // Application de la translation + Coordinate move=UtilsProfil1d.vec(oldCoordCroisement, newCoordCroisement); + biefContainer_.getModelProfils().moveGlobal(selection, move.x, move.y, 0, cmd); + // Somme de tous les angles de l'axe entre les deux points de translation + int oldNextIdx=UtilsProfil1d.getNextIndex(axeHydrau, oldCoordCroisement); + if (oldNextIdx==-1) + oldNextIdx=axeHydrau.size()-1; + double oldAngle=0; + for (int i=0; i+2<=oldNextIdx; i++) + oldAngle+=Math.PI + -UtilsProfil1d.getAngle(axeHydrau.getCoordinate(i), axeHydrau.getCoordinate(i+1), axeHydrau.getCoordinate(i+2)); + int newNextIdx=UtilsProfil1d.getNextIndex(axeHydrau, newCoordCroisement); + if (newNextIdx==-1) + newNextIdx=axeHydrau.size()-1; + double newAngle=0; + for (int i=0; i+2<=newNextIdx; i++) + newAngle+=Math.PI + -UtilsProfil1d.getAngle(axeHydrau.getCoordinate(i), axeHydrau.getCoordinate(i+1), axeHydrau.getCoordinate(i+2)); + // Application de la rotation + biefContainer_.getModelProfils().rotateGlobal(selection, newAngle-oldAngle, newCoordCroisement.x, newCoordCroisement.y, cmd); + if (_cmd!=null) + _cmd.addCmd(cmd.getSimplify()); + // Retourne vrai si il faut r\xE9ordonnancer les profils + int oldPreviousIdx=UtilsProfil1d.getPreviousIndex(axeHydrau, oldCoordCroisement); + if (oldPreviousIdx==-1) + oldPreviousIdx=0; + if(idxProfilSelected_==0) { + if(biefContainer_.getNbProfil()>1) { + Geometry intersect=geomAxeHydrau.intersection(biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_+1)); + if(intersect.getNumPoints()!=1) + throw new ProfilContainerException(FudaaLib.getS("Au moins un profil n'a pas de croisement avec l'axe hydraulique ou en a plusieurs.")); + if (_value>UtilsProfil1d.abscisseCurviligne(axeHydrau, intersect.getCoordinate())) + return true; + } + } + else if (idxProfilSelected_==biefContainer_.getNbProfil()-1) { + if(biefContainer_.getNbProfil()>1) { + Geometry intersect=geomAxeHydrau.intersection(biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_-1)); + if(intersect.getNumPoints()!=1) + throw new ProfilContainerException(FudaaLib.getS("Au moins un profil n'a pas de croisement avec l'axe hydraulique ou en a plusieurs.")); + if (_value<UtilsProfil1d.abscisseCurviligne(axeHydrau, intersect.getCoordinate())) + return true; + } + } + else { + Geometry intersect1=geomAxeHydrau.intersection(biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_+1)); + Geometry intersect2=geomAxeHydrau.intersection(biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_-1)); + if(intersect1.getNumPoints()!=1||intersect2.getNumPoints()!=1) + throw new ProfilContainerException(FudaaLib.getS("Au moins un profil n'a pas de croisement avec l'axe hydraulique ou en a plusieurs.")); + double abscCurvProfilPrecedent=UtilsProfil1d.abscisseCurviligne(axeHydrau, intersect2.getCoordinate()); + double abscCurvProfilSuivant=UtilsProfil1d.abscisseCurviligne(axeHydrau, intersect1.getCoordinate()); + if (_value<abscCurvProfilPrecedent||_value>abscCurvProfilSuivant) + return true; + } + } + return false; + } + + /** + * Retourne l'angle entre l'axe hydraulique et le profil + * @throws ProfilContainerException + */ + @SuppressWarnings("unused") + private double getAngleAxeHydrauProfil() throws ProfilContainerException { + CoordinateSequence axeHydraulique=((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique().getGeometry( + 0)).getCoordinateSequence(); + // Calcul de la coordonn\xE9e de croisement entre l'axe et le profil + Geometry intersection=biefContainer_.getZoneAxeHydraulique().getGeometry(0).intersection( + biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)); + if (intersection.getNumPoints()!=1) + throw new ProfilContainerException(FudaaLib + .getS("Soit il n'y a pas de croisement avec l'axe hydraulique, soit il y en a plusieurs.")); + Coordinate coordCroisement=intersection.getCoordinate(); + // Recherche du point pr\xE9c\xE9dent le croisement sur l'axe hydraulique + Coordinate previousPointAH; + int idxPointPreviousAH=UtilsProfil1d.getPreviousIndex(axeHydraulique, coordCroisement); + if (idxPointPreviousAH!=-1) + previousPointAH=axeHydraulique.getCoordinate(idxPointPreviousAH); + else + // Cr\xE9ation d'un nouveau point en faisant la sym\xE9trie du second par + // rapport au premier. + previousPointAH=new Coordinate(axeHydraulique.getCoordinate(0).x*2-axeHydraulique.getCoordinate(1).x, axeHydraulique + .getCoordinate(0).y*2-axeHydraulique.getCoordinate(1).y, 0); + // Recherche du point suivant le croisement sur le profil + Coordinate previousPointP; + int idxPointPreviousP=UtilsProfil1d.getPreviousIndex(getCoordSeq(), coordCroisement); + if (idxPointPreviousP!=-1) + previousPointP=getCoordSeq().getCoordinate(idxPointPreviousAH); + else { + CoordinateSequence seq=getCoordSeq(); + // Cr\xE9ation d'un nouveau point en faisant la sym\xE9trie du second par + // rapport au premier. + previousPointP=new Coordinate(seq.getCoordinate(seq.size()-1).x*2-seq.getCoordinate(seq.size()-2).x, seq.getCoordinate(seq + .size()-1).y*2-seq.getCoordinate(seq.size()-2).y, 0); + } + return UtilsProfil1d.getAngle(previousPointAH, coordCroisement, previousPointP); + } + public double getCurv(int _idxPoint) { if(curv_==null||_idxPoint<0||_idxPoint>=curv_.size()) throw new IllegalArgumentException("Cet index n'existe pas."); @@ -391,10 +523,10 @@ /* * A propos de coords : le tableau retourn\xE9 est r\xE9f\xE9renc\xE9 (via une weak * reference) par le cache de la coordinate sequence dont il est issu. Donc, - * pour \xE9viter des probl\xE8mes de point fantome, il faut le clon\xE9. Cependant - * les coordinantes qu'il contient doivent \xE9galement \xEAtre clon\xE9 sinon \xE7a ne - * sert a rien. Pour ne pas trop perdre en performance, seul les coordonn\xE9es - * modifi\xE9es sont clon\xE9es. + * pour \xE9viter des probl\xE8mes de point fantome, il faut le cloner. Cependant + * les coordinantes qu'il contient doivent \xE9galement \xEAtre clon\xE9es pour la + * m\xEAme raison. Pour ne pas trop perdre en performance, seuls les + * coordonn\xE9es modifi\xE9es sont clon\xE9es. */ // Les nouvelles valeurs du points \xE0 d\xE9placer double newX; @@ -410,35 +542,9 @@ if (_idxPoint!=idxRupture1_&&_idxPoint!=idxRupture2_) { // Le point reste encadr\xE9 par les deux m\xEAme points => le signe de xa-xb et // de ya-yb ne change pas - // D\xE9termination des deux index \xE0 utiliser - int idx1; - int idx2; - double valCurv; - if (_idxPoint>0) { // Le premier point n'est pas selectionn\xE9 - idx1=_idxPoint-1; - idx2=_idxPoint; - valCurv=_value-curv_.get(idx1); - } - else { - idx1=_idxPoint+1; - idx2=_idxPoint; - valCurv=Math.abs(_value-curv_.get(idx1)); - } - // Calcul des nouvelles coordonn\xE9es - if (Math.abs(seq.getX(idx2)-seq.getX(idx1))>tolerance) { - // Extraction du signe de xa-xb - double sign=Math.signum(seq.getX(idx2)-seq.getX(idx1)); - double coefDirecteur=(seq.getY(idx2)-seq.getY(idx1))/(seq.getX(idx2)-seq.getX(idx1)); - newX=seq.getX(idx1)+sign*valCurv/Math.sqrt(1+coefDirecteur*coefDirecteur); - newY=seq.getY(idx1)+coefDirecteur*(newX-seq.getX(idx1)); - } - else { // Cas du bout de profil vertical - // Extraction du signe de ya-yb - double sign=Math.signum(seq.getY(idx2)-seq.getY(idx1)); - newX=seq.getX(idx1); - newY=seq.getY(idx1)+sign*valCurv; - } - coords[_idxPoint]=new Coordinate(newX, newY, coords[_idxPoint].z); + Coordinate newCoord=UtilsProfil1d.getCoordinateXY(seq, _value); + newCoord.z=coords[_idxPoint].z; + coords[_idxPoint]=newCoord; // Mise a jour de la table des valeurs curvilignes if (_idxPoint==0) for (int i=1; i<curv_.size(); i++) @@ -505,7 +611,7 @@ * Derni\xE8re petite note pour la fin, le cas dit 'simple' pr\xE9c\xE9dent * (d\xE9placement d'un point qui n'est pas un point de rupture) n'est qu'un * cas particulier de la r\xE9solution ci dessus (la solution de l'\xE9quation - * du second degr\xE9 serait unique). On pourrait donc l'enlever, je pense que + * du second degr\xE9 serait unique). On pourrait donc l'enlever, mais je pense que * s\xE9parer ces deux cas ne fait pas de mal pour une \xE9ventuelle relecture * et/ou modification de ce code. */ 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-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -11,13 +11,14 @@ import org.fudaa.ctulu.gis.GISGeometryFactory; import org.fudaa.ctulu.gis.GISPoint; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; +import org.fudaa.fudaa.commun.FudaaLib; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; import com.vividsolutions.jts.geom.Geometry; /** - * Quelques fonctions aidant pour la manipulation des profils en 1d. + * Quelques fonctions utilis\xE9es dans le module modeleur1d. * @author Emmanuel MARTIN * @version $Id$ */ @@ -190,6 +191,20 @@ } /** + * Retourne la tol\xE9rance utilis\xE9e par defaut dans cette classe. + */ + static public double getTolerance() { + return tolerance_; + } + + /** + * Retourne vrai si les deux param\xE8tres sont \xE9gaux \xE0 une tol\xE9rance pr\xE8s. + */ + static public boolean egal(double _d1, double _d2) { + return Math.abs(_d1-_d2)<tolerance_; + } + + /** * Retourne l'index du point pr\xE9c\xE9dent la coordonn\xE9e indiqu\xE9e sur la coordinateSequence donn\xE9e. * Retourne -1 si la coordonn\xE9e donn\xE9e correspond \xE0 l'index 0. * Retourne -2 si la coordonn\xE9e n'appartient pas \xE0 la g\xE9om\xE9trie. @@ -275,4 +290,117 @@ else return abscisseCurviligne(_geom1, intersection.getCoordinate()); } + + /** + * Retourne la coordonn\xE9e correspondant \xE0 'abscisseCurv' sur '_geom'. La + * valeur de z est mise \xE0 0. _abscisseCurv peut \xEAtre n\xE9gatif : le point + * retourn\xE9 sera avec le premier ou sup\xE9rieur au max. + */ + static public Coordinate getCoordinateXY(CoordinateSequence _geom, double _abscisseCurv) { + // Recherche du point pr\xE9c\xE9dent '_abscisseCurv' + int i=0; + double oldAbsCurv=0; + double currentAbsCurv=0; + while(currentAbsCurv<=_abscisseCurv&&++i<_geom.size()) { + oldAbsCurv=currentAbsCurv; + currentAbsCurv+=_geom.getCoordinate(i-1).distance(_geom.getCoordinate(i)); + } + // Index du point pr\xE9c\xE9dent _abscisseCurv + if(i>0) + i--; + // Calcul de la coordonn\xE9e \\ + int idx1; + int idx2; + double valCurv; + double newX; + double newY; + if(i==0) { // Premier point + idx1=i+1; + idx2=i; + valCurv=Math.abs(_abscisseCurv-abscisseCurviligne(_geom, _geom.getCoordinate(idx1))); + } + else if (i+1<_geom.size()) { // Point au milieu + idx1=i; + idx2=i+1; + valCurv=_abscisseCurv-oldAbsCurv; + } + else { // Dernier point + idx1=i-1; + idx2=i; + valCurv=_abscisseCurv-oldAbsCurv; + } + if(idx1>=_geom.size()||idx2>=_geom.size()) + System.out.println("zz"); + if(valCurv<tolerance_) + return _geom.getCoordinate(i); + // Calcul des nouvelles coordonn\xE9es + if (Math.abs(_geom.getX(idx2)-_geom.getX(idx1))>tolerance_) { + // Extraction du signe de xa-xb + double sign=Math.signum(_geom.getX(idx2)-_geom.getX(idx1)); + double coefDirecteur=(_geom.getY(idx2)-_geom.getY(idx1))/(_geom.getX(idx2)-_geom.getX(idx1)); + newX=_geom.getX(idx1)+sign*valCurv/Math.sqrt(1+coefDirecteur*coefDirecteur); + newY=_geom.getY(idx1)+coefDirecteur*(newX-_geom.getX(idx1)); + } + else { // Cas du bout de profil vertical + // Extraction du signe de ya-yb + double sign=Math.signum(_geom.getY(idx2)-_geom.getY(idx1)); + newX=_geom.getX(idx1); + newY=_geom.getY(idx1)+sign*valCurv; + } + return new Coordinate(newX, newY, 0); + } + + /** + * Retourne l'angle form\xE9 par les segments _a_b et _b_c. _a, _b et _c doivent + * \xEAtre non confondus sous peine d'avoir un {@link IllegalArgumentException}. + * L'angle est toujours positif. + * L'ordonn\xE9 z n'est pas prise en compte. + * L'angle retourn\xE9 est en radian. + */ + static public double getAngle(Coordinate _a, Coordinate _b, Coordinate _c) { + Coordinate a=new Coordinate(_a.x, _a.y, 0); + Coordinate b=new Coordinate(_b.x, _b.y, 0); + Coordinate c=new Coordinate(_c.x, _c.y, 0); + if(egal(a, b)||egal(b, c)||egal(a, c)) + throw new IllegalArgumentException(FudaaLib.getS("Les trois points doivent \xEAtre non confonus.")); + // Projection de b sur ac + Coordinate b2=proj(b, a, c); + // Calcul des angles interm\xE9diaires + double angleCBB2=Math.asin(b2.distance(c)/c.distance(b)); + double angleB2BA=Math.asin(b2.distance(a)/a.distance(b)); + if(angleCBB2==Double.NaN||angleB2BA==Double.NaN) + return Math.PI; + // Selon que B2 appartient ou non \xE0 ac, la d\xE9termination de l'angle final diff\xE8re. + double angle; + int position=getPositionXY(b2, a, c); + if(position==-1) + angle=angleCBB2-angleB2BA; + else if(position==1) + angle=angleB2BA-angleCBB2; + else + angle=angleCBB2+angleB2BA; + return angle; + } + + /** + * Soit _a, _b, _c align\xE9s et non confondus. Retourne -1 si _a avant _b_c, 0 + * si _a est entre _b_c (inclu), +1 sinon. Si _a, _b et _c ne sont pas + * align\xE9s, {@link IllegalArgumentException} est lev\xE9. + */ + static public int getPositionXY(Coordinate _a, Coordinate _b, Coordinate _c) { + if(!egal(proj(_a, _b, _c), _a)||egal(_a, _b)||egal(_b, _c)||egal(_a, _c)) + throw new IllegalArgumentException(FudaaLib.getS("Les trois points doivent \xEAtre align\xE9s et non confonus.")); + Coordinate vecBC=vec(_b, _c); + double k; + if(vecBC.x!=0) + k=(_a.x-_b.x)/vecBC.x; + else + k=(_a.y-_b.y)/vecBC.y; + if(k<0) + return -1; + else if(k>1) + return 1; + else + return 0; + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 2009-01-07 18:22:13 UTC (rev 4330) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 2009-01-08 09:22:51 UTC (rev 4331) @@ -8,13 +8,17 @@ package org.fudaa.fudaa.modeleur.modeleur1d.view; import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JTable; +import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; +import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.gui.CtuluTable; import org.fudaa.ebli.commun.EbliFormatterInterface; import org.fudaa.fudaa.commun.FudaaLib; @@ -27,6 +31,7 @@ import com.memoire.bu.BuLabel; import com.memoire.bu.BuPanel; import com.memoire.bu.BuScrollPane; +import com.memoire.bu.BuTextField; /** * Cette classe permet le visionnage des informations sous forme d'un tableau. @@ -62,11 +67,34 @@ private void updateAbscisseCurvAxeHydraulique() { double abscCurv=data_.getAbsCurvProfilOnAxeHydraulique(); if(abscCurv==-1) - lblAxeHydraulique_.setText(" - "); + tfAxeHydraulique_.setText(" - "); else - lblAxeHydraulique_.setText(formater_.getXYFormatter().format(abscCurv)); + tfAxeHydraulique_.setText(formater_.getXYFormatter().format(abscCurv)); } + + /** + * Retourne la valeur de l'abscisse curviligne du profil sur l'axe + * hydraulique. + */ + public double getAbsCurvProfilOnAxeHydraulique() { + return data_.getAbsCurvProfilOnAxeHydraulique(); + } + /** + * Met l'abscisse curviligne du profil sur l'axe hydraulique \xE0 _value. + * _value ne peut \xEAtre ni n\xE9gatif ni sup\xE9rieur \xE0 l'abscisse curviligne total + * de l'axe, dans ces cas une exception de type + * {@link IllegalArgumentException} est lev\xE9e. + * @throws ProfilContainerException + */ + public void setAbsCurvProfilOnAxeHydraulique(double _value) throws ProfilContainerException { + CtuluCommandComposite cmd=new CtuluCommandComposite("R\xE9ordonnancement des profils"); + boolean result=data_.setAbsCurvProfilOnAxeHydraulique(_value, cmd); + if(result) + controller_.orderProfils(cmd); + controller_.getCommandManager().addCmd(cmd.getSimplify()); + } + public void profilContainerDataModified() { fireTableDataChanged(); updateAbscisseCurvAxeHydraulique(); @@ -120,9 +148,9 @@ /** La vue du tableau. */ private JTable table_; /** Le model du tableau affich\xE9 par le panel. */ - private DefaultTableModel modelTable_; + private TableGeomModel modelTable_; /** L'abscisse curviligne du profil sur l'axe hydraulique. */ - private BuLabel lblAxeHydraulique_=new BuLabel(); + private BuTextField tfAxeHydraulique_=BuTextField.createDoubleField(); public VueTableau(Controller1d _controller, ProfilContainer _data){ controller_=_controller; @@ -132,9 +160,27 @@ table_=new CtuluTable(modelTable_); add(new BuScrollPane(table_), BuBorderLayout.CENTER); // Abscisse curviligne du profil sur l'axe hydraulique + tfAxeHydraulique_.setHorizontalAlignment(SwingUtilities.CENTER); + tfAxeHydraulique_.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + double oldValue=modelTable_.getAbsCurvProfilOnAxeHydraulique(); + try { + modelTable_.setAbsCurvProfilOnAxeHydraulique(Double.parseDouble(tfAxeHydraulique_.getText())); + } + catch(NumberFormatException _exc) { + tfAxeHydraulique_.setText(controller_.getFormater().getXYFormatter().format(oldValue)); + } + catch(IllegalArgumentException _exc) { + controller_.showError(_exc.getMessage()); + } + catch (ProfilContainerException _exc) { + controller_.showError(_exc.getMessage()); + } + } + }); Box absCurv=new Box(BoxLayout.X_AXIS); absCurv.add(new BuLabel(FudaaLib.getS("Abscisse Curviligne : "))); - absCurv.add(lblAxeHydraulique_); + absCurv.add(tfAxeHydraulique_); add(absCurv, BuBorderLayout.SOUTH); // Taille setPreferredSize(new Dimension(200, 200)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-09 10:31:58
|
Revision: 4338 http://fudaa.svn.sourceforge.net/fudaa/?rev=4338&view=rev Author: emmanuel_martin Date: 2009-01-09 10:31:50 +0000 (Fri, 09 Jan 2009) Log Message: ----------- L'orientation des profils ?\195?\160 ?\195?\169t?\195?\169 invers?\195?\169e ; les labels peuvent ?\195?\170tre chang?\195?\169s de point ; correction d'une regression dans le changement d'abscisse curviligne d'un point. Modified Paths: -------------- 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/ProfilContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.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/VueCourbe.java 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-08 16:45:23 UTC (rev 4337) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-09 10:31:50 UTC (rev 4338) @@ -182,7 +182,7 @@ vProfilH=new Coordinate(seqProfil.getCoordinate(idxNext).x-interAxeProfil.x, seqProfil.getCoordinate(idxNext).y-interAxeProfil.y, 0); // Inversion du sens du profil si besoin double produitVectorielCoordZ=vAxeH.x*vProfilH.y-vAxeH.y*vProfilH.x; - if (produitVectorielCoordZ<0) { + if (produitVectorielCoordZ>0) { Coordinate[] coords=((Geometry)profil).getCoordinates(); for (int l=0; l<coords.length/2; l++) { Coordinate tmp=coords[l]; @@ -205,14 +205,14 @@ seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); // Valuation des attributs avec les index des points des intersections \\ // Rives - zone.setAttributValue(idxAttRiveGauche, k, seqProfil.size()-1, null); - zone.setAttributValue(idxAttRiveDroite, k, 0, null); + zone.setAttributValue(idxAttRiveGauche, k, 0, null); + zone.setAttributValue(idxAttRiveDroite, k, seqProfil.size()-1, null); for (int l=0; l<rives_.getNombre(); l++) valuateProfilIntersection(k, (Geometry) rives_.getObject(l), idxAttRiveGauche, idxAttRiveDroite, abscisseCurvIntersectionAxe); // D\xE9tection des croisements zones de stockages droite et gauche \\ // Limites de stockages - zone.setAttributValue(idxAttlsGauche, k, seqProfil.size()-1, null); - zone.setAttributValue(idxAttlsDroite, k, 0, null); + zone.setAttributValue(idxAttlsGauche, k, 0, null); + zone.setAttributValue(idxAttlsDroite, k, seqProfil.size()-1, null); for (int l=0; l<limitesStockages_.getNombre(); l++) valuateProfilIntersection(k, (Geometry) limitesStockages_.getObject(l), idxAttlsGauche, idxAttlsDroite, abscisseCurvIntersectionAxe); } @@ -236,7 +236,7 @@ if (inter.getNumPoints()==1) { Coordinate coord= inter.getCoordinate(); int idxIntersection=UtilsProfil1d.getIndex(profils_.getGeomData().getCoordinateSequence(_idxProfil), coord); - if (_absCurvAxeHydrau>UtilsProfil1d.abscisseCurviligne(profils_.getGeomData().getCoordinateSequence(_idxProfil), coord)) + if (_absCurvAxeHydrau<UtilsProfil1d.abscisseCurviligne(profils_.getGeomData().getCoordinateSequence(_idxProfil), coord)) profils_.getGeomData().setAttributValue(_idxAttrDroite, _idxProfil, idxIntersection, null); else profils_.getGeomData().setAttributValue(_idxAttrGauche, _idxProfil, idxIntersection, null); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-08 16:45:23 UTC (rev 4337) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-09 10:31:50 UTC (rev 4338) @@ -92,4 +92,16 @@ * {@link IllegalArgumentException} est lev\xE9e. */ public boolean setAbsCurvProfilOnAxeHydraulique(double _value, CtuluCommandContainer _cmd) throws ProfilContainerException; + + /** Place l'intersection du profil avec la limite de stockage gauche \xE0 l'index _idx. */ + public void setLimiteGauche(int _idx, CtuluCommandContainer _cmd); + + /** Place l'intersection du profil avec la limite de stockage droite \xE0 l'index _idx. */ + public void setLimiteDroite(int _idx, CtuluCommandContainer _cmd); + + /** Place l'intersection du profil avec la rive gauche \xE0 l'index _idx. */ + public void setRiveGauche(int _idx, CtuluCommandContainer _cmd); + + /** Place l'intersection du profil avec la rive droite \xE0 l'index _idx. */ + public void setRiveDroite(int _idx, CtuluCommandContainer _cmd); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-08 16:45:23 UTC (rev 4337) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-09 10:31:50 UTC (rev 4338) @@ -343,25 +343,25 @@ public double getAbsCurvRiveGauche() { if(idxProfilSelected_==-1) return -1; - return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getCoordSeq().getCoordinate(getValueOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE))); + return getCurv(getValueOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE)); } public double getAbsCurvRiveDroite() { if(idxProfilSelected_==-1) return -1; - return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getCoordSeq().getCoordinate(getValueOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE))); + return getCurv(getValueOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE)); } public double getAbsCurvLimiteStockageGauche() { if(idxProfilSelected_==-1) return -1; - return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getCoordSeq().getCoordinate(getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE))); + return getCurv(getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE)); } public double getAbsCurvLimiteStockageDroite() { if(idxProfilSelected_==-1) return -1; - return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), getCoordSeq().getCoordinate(getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE))); + return getCurv(getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE)); } public double getAbsCurvProfilOnAxeHydraulique() { @@ -372,14 +372,80 @@ } public double getAbsCurvAxeHydrauliqueOnProfil() { + if(idxProfilSelected_==-1||biefContainer_.getZoneAxeHydraulique().getNbGeometries()==0) + return -1; Geometry intersection=biefContainer_.getZoneAxeHydraulique().getGeometry(0).intersection( biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)); if (intersection.getNumPoints()!=1) return -1; - return UtilsProfil1d.abscisseCurviligne(((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique() - .getGeometry(0)).getCoordinateSequence(), intersection.getCoordinate()); + return UtilsProfil1d.abscisseCurviligne(getCoordSeq(), intersection.getCoordinate()); } + public void setLimiteGauche(int _idx, CtuluCommandContainer _cmd) { + int idxRiveGauche=getValueOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE); + if(_idx>=idxRiveGauche) + setIndexIn(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE, _idx, _cmd); + else + throw new IllegalArgumentException(FudaaLib.getS("La limite gauche doit rester \xE0 gauche de la rive gauche.")); + } + + public void setLimiteDroite(int _idx, CtuluCommandContainer _cmd) { + int idxRiveDroite=getValueOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE); + if(-_idx<=idxRiveDroite) + setIndexIn(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE, _idx, _cmd); + else + throw new IllegalArgumentException(FudaaLib.getS("La limite droite doit rester \xE0 droite de la rive droite.")); + } + + public void setRiveGauche(int _idx, CtuluCommandContainer _cmd) { + int idxLimiteGauche=getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE); + int idxRiveDroite=getValueOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE); + if(_idx<=idxLimiteGauche&&_idx>idxRiveDroite) + setIndexIn(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE, _idx, _cmd); + else + throw new IllegalArgumentException(FudaaLib.getS("La rive gauche doit rester entre la limite gauche et la rive droite.")); + } + + public void setRiveDroite(int _idx, CtuluCommandContainer _cmd) { + int idxLimiteDroite=getValueOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE); + int idxRiveGauche=getValueOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE); + if(_idx>=idxLimiteDroite&&_idx<idxRiveGauche) + setIndexIn(GISAttributeConstants.INTERSECTION_RIVE_DROITE, _idx, _cmd); + else + throw new IllegalArgumentException(FudaaLib.getS("La rive droite doit rester entre la limite droite et la rive gauche.")); + } + + private void setIndexIn(GISAttributeInterface _attr, int _idx, CtuluCommandContainer _cmd) { + if(idxProfilSelected_==-1||_idx<0||_idx>=getNbPoint()) + throw new IllegalArgumentException("Cet index n'existe pas"); + class UndoRedoSetIndexIn implements CtuluCommand, CtuluNamedCommand { + GISAttributeInterface attr_; + CtuluCommandComposite cmd_; + public UndoRedoSetIndexIn(GISAttributeInterface _attr, CtuluCommandComposite _cmd) { + attr_=_attr; + cmd_=_cmd; + } + public String getName() { + return FudaaLib.getS("Changement de "+attr_.getName()); + } + public void redo() { + cmd_.redo(); + fireProfilContainerDataModified(); + } + public void undo() { + cmd_.undo(); + fireProfilContainerDataModified(); + } + } + int idxAttr=biefContainer_.getZoneProfils().getIndiceOf(_attr); + CtuluCommandComposite cmd=new CtuluCommandComposite(); + if(_idx!=(Integer) biefContainer_.getZoneProfils().getValue(idxAttr, idxProfilSelected_)) + biefContainer_.getZoneProfils().setAttributValue(idxAttr, idxProfilSelected_, _idx, cmd); + if(_cmd!=null) + _cmd.addCmd(new UndoRedoSetIndexIn(_attr, cmd)); + fireProfilContainerDataModified(); + } + public boolean setAbsCurvProfilOnAxeHydraulique(double _value, CtuluCommandContainer _cmd) throws ProfilContainerException { CoordinateSequence axeHydrau=((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique().getGeometry(0)) .getCoordinateSequence(); @@ -742,16 +808,17 @@ if (Math.abs(coords[idxFin].x-coords[idxDeb].x)>tolerance) { double sign=Math.signum(coords[idxFin].x-coords[idxDeb].x); double newCoefDirecteur=(coords[idxFin].y-coords[idxDeb].y)/(coords[idxFin].x-coords[idxDeb].x); - for (int i=idxDeb+1; i<idxFin; i++) - coords[i]=new Coordinate(coords[idxDeb].x+sign*(curv_.get(i)-curv_.get(idxDeb)) - /Math.sqrt(1+newCoefDirecteur*newCoefDirecteur), coords[i].y=coords[idxDeb].y+newCoefDirecteur*(coords[i].x-coords[idxDeb].x), coords[i].z); + for (int i=idxDeb+1; i<idxFin; i++) { + coords[i]=new Coordinate(0, 0, coords[i].z); + coords[i].x=coords[idxDeb].x+sign*(curv_.get(i)-curv_.get(idxDeb))/Math.sqrt(1+newCoefDirecteur*newCoefDirecteur); + coords[i].y=coords[idxDeb].y+newCoefDirecteur*(coords[i].x-coords[idxDeb].x); + } } else { // Cas du bout de profil vertical double sign=Math.signum(coords[idxFin].y-coords[idxDeb].y); for (int i=idxDeb+1; i<idxFin; i++) - coords[i]=new Coordinate(coords[idxDeb].x, coords[i].y=coords[idxDeb].y+sign*(curv_.get(i)-curv_.get(idxDeb)), + coords[i]=new Coordinate(coords[idxDeb].x, coords[idxDeb].y+sign*(curv_.get(i)-curv_.get(idxDeb)), coords[i].z); - } } } @@ -768,7 +835,6 @@ public void setZ(int _idxPoint, double _value, CtuluCommandContainer _cmd) { if (z_==null||_idxPoint<0||_idxPoint>=z_.getSize()) throw new IllegalArgumentException("Cet index n'existe pas."); - CtuluCommandComposite cmd=new CtuluCommandComposite("Changement z"); // Mise \xE0 jour du z \\ z_.setObject(_idxPoint, _value, cmd); 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-08 16:45:23 UTC (rev 4337) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-01-09 10:31:50 UTC (rev 4338) @@ -8,6 +8,7 @@ package org.fudaa.fudaa.modeleur.modeleur1d.model; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; +import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; import org.fudaa.ctulu.gis.GISGeometryFactory; import org.fudaa.ctulu.gis.GISPoint; import org.fudaa.ctulu.gis.GISZoneCollection; @@ -329,8 +330,6 @@ idx2=i; valCurv=_abscisseCurv-oldAbsCurv; } - if(idx1>=_geom.size()||idx2>=_geom.size()) - System.out.println("zz"); if(valCurv<tolerance_) return _geom.getCoordinate(i); // Calcul des nouvelles coordonn\xE9es @@ -349,6 +348,15 @@ } return new Coordinate(newX, newY, 0); } + + /** + * Retourne la coordonn\xE9e correspondant \xE0 'abscisseCurv' sur '_geom'. La + * valeur de z est mise \xE0 0. _abscisseCurv peut \xEAtre n\xE9gatif : le point + * retourn\xE9 sera avec le premier ou sup\xE9rieur au max. + */ + static public Coordinate getCoordinateXY(Coordinate[] _geom, double _abscisseCurv) { + return getCoordinateXY(new GISCoordinateSequenceFactory().create(_geom), _abscisseCurv); + } /** * Retourne l'angle form\xE9 par les segments _a_b et _b_c. _a, _b et _c doivent Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java 2009-01-08 16:45:23 UTC (rev 4337) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueCourbe.java 2009-01-09 10:31:50 UTC (rev 4338) @@ -9,6 +9,8 @@ import java.awt.Color; import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; @@ -45,6 +47,7 @@ import org.fudaa.fudaa.modeleur.modeleur1d.model.ProfilContainerListener; import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuButton; import com.memoire.bu.BuPanel; import com.memoire.bu.BuSpecificBar; @@ -82,6 +85,60 @@ data_.addProfilContainerListener(this); } + /** + * Place l'intersection du profil avec la limite de stockage gauche \xE0 + * l'index _idx. + */ + public void setLimiteGauche(int _idx) { + controller_.clearError(); + try { + data_.setLimiteGauche(_idx, controller_.getCommandManager()); + } + catch(IllegalArgumentException _e) { + controller_.showError(_e.getMessage()); + } + } + + /** + * Place l'intersection du profil avec la limite de stockage droite \xE0 + * l'index _idx. + */ + public void setLimiteDroite(int _idx) { + controller_.clearError(); + try { + data_.setLimiteDroite(_idx, controller_.getCommandManager()); + } + catch(IllegalArgumentException _e) { + controller_.showError(_e.getMessage()); + } + } + + /** + * Place l'intersection du profil avec la rive gauche \xE0 l'index _idx. + */ + public void setRiveGauche(int _idx) { + controller_.clearError(); + try { + data_.setRiveGauche(_idx, controller_.getCommandManager()); + } + catch(IllegalArgumentException _e) { + controller_.showError(_e.getMessage()); + } + } + + /** + * Place l'intersection du profil avec la rive droite \xE0 l'index _idx. + */ + public void setRiveDroite(int _idx) { + controller_.clearError(); + try { + data_.setRiveDroite(_idx, controller_.getCommandManager()); + } + catch(IllegalArgumentException _e) { + controller_.showError(_e.getMessage()); + } + } + private void updateLabels() { courbe_.removeLabels(); // Rive gauche @@ -92,6 +149,10 @@ absCurv=data_.getAbsCurvRiveDroite(); if(absCurv!=-1) courbe_.addLabel(absCurv, "RD"); + // Axe hydraulique + absCurv=data_.getAbsCurvAxeHydrauliqueOnProfil(); + if(absCurv!=-1) + courbe_.addLabel(absCurv, "AH"); // Limite stockage gauche absCurv=data_.getAbsCurvLimiteStockageGauche(); if(absCurv!=-1) @@ -100,16 +161,15 @@ absCurv=data_.getAbsCurvLimiteStockageDroite(); if(absCurv!=-1) courbe_.addLabel(absCurv, "SD"); + grapheVue_.structureChanged(); } public void profilContainerDataModified() { updateLabels(); - grapheVue_.structureChanged(); } public void profilContainerSelectedChanged(int _idxOldProfil, int _idxNewProfil){ updateLabels(); - grapheVue_.structureChanged(); grapheVue_.restore(); } @@ -306,6 +366,13 @@ private EGGraphe grapheVue_; /** Le container principal de la courbe. */ private EGFillePanel containerCourbe_; + /** Le model de la courbe */ + CourbeGeomModel courbeModel_; + // Les boutons permettant de modifier les positions des rives et des limites de stockages. \\ + BuButton limiteGauche_; + BuButton riveGauche_; + BuButton riveDroite_; + BuButton limiteDroite_; public VueCourbe(Controller1d _controller, ProfilContainer _dataGeom){ controller_=_controller; @@ -323,7 +390,7 @@ // Axe Y \\ EGAxeVertical axeY = new EGAxeVertical(); axeY.setGraduations(true); - axeY.setGrille(new TraceLigneModel(TraceLigne.LISSE, 1, Color.LIGHT_GRAY)); + axeY.setGrille(new TraceLigneModel(TraceLigne.POINTILLE, 1, Color.LIGHT_GRAY)); axeY.setTitre(FudaaLib.getS("Ordonn\xE9e : z")); axeY.setUnite(FudaaLib.getS("m\xE8tre")); DecimalFormat df=CtuluLib.getDecimalFormat(); @@ -332,8 +399,8 @@ axeY.setBounds(0, 50); axeY.setLineColor(Color.BLACK); // Cr\xE9ation de la courbe \\ - EGModel courbeModel=new CourbeGeomModel(_dataGeom); - courbe_=new EGCourbeSimple(axeY, courbeModel); + courbeModel_=new CourbeGeomModel(_dataGeom); + courbe_=new EGCourbeSimple(axeY, courbeModel_); courbe_.setAspectContour(Color.RED); grapheModel.addCourbe(courbe_, null); // Cr\xE9ation du panel contenant l'ensemble des courbes \\ @@ -357,6 +424,44 @@ button.setText(""); actions.add(button); } + // Les boutons personnalis\xE9s \\ + limiteGauche_=new BuButton("SG"); + limiteGauche_.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] idx=getSelection(); + if(idx!=null&&idx.length==1) + courbeModel_.setLimiteGauche(idx[0]); + } + }); + actions.add(limiteGauche_); + riveGauche_=new BuButton("RG"); + riveGauche_.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] idx=getSelection(); + if(idx!=null&&idx.length==1) + courbeModel_.setRiveGauche(idx[0]); + } + }); + actions.add(riveGauche_); + riveDroite_=new BuButton("RD"); + riveDroite_.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] idx=getSelection(); + if(idx!=null&&idx.length==1) + courbeModel_.setRiveDroite(idx[0]); + } + }); + actions.add(riveDroite_); + limiteDroite_=new BuButton("SD"); + limiteDroite_.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] idx=getSelection(); + if(idx!=null&&idx.length==1) + courbeModel_.setLimiteDroite(idx[0]); + } + }); + actions.add(limiteDroite_); + // Ajout des boutons \xE0 la barre speBar.addTools(actions.toArray(new JComponent[0])); add(speBar, BuBorderLayout.NORTH); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-20 09:46:46
|
Revision: 4384 http://fudaa.svn.sourceforge.net/fudaa/?rev=4384&view=rev Author: emmanuel_martin Date: 2009-01-20 09:46:41 +0000 (Tue, 20 Jan 2009) Log Message: ----------- Changement du comportement du module de gestion des biefs. Modified Paths: -------------- 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/BiefSet.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java 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-19 19:40:40 UTC (rev 4383) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-01-20 09:46:41 UTC (rev 4384) @@ -8,15 +8,18 @@ package org.fudaa.fudaa.modeleur.modeleur1d.controller; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.swing.DefaultListSelectionModel; import javax.swing.event.ListSelectionListener; +import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluCommandManager; import org.fudaa.ebli.calque.BCalque; import org.fudaa.ebli.calque.ZModeleLigneBrisee; +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; @@ -139,25 +142,20 @@ } /** - * Supprime le bief selectionn\xE9. + * Supprime les biefs donn\xE9es en param\xE8tre. */ - public void removeSelectedBief(){ - String name=biefSelectionModel_.getSelectedName(); - if(name!=null) - biefSet_.removeBief(name, controller1d_.getCommandManager()); + public void removeBief(int[] _idx){ + Arrays.sort(_idx); + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("Suppression de biefs")); + for(int i=_idx.length-1;i>=0;i--) + biefSet_.removeBief(biefSet_.getBiefName(_idx[i]), cmd); + getCommandManager().addCmd(cmd.getSimplify()); } /** - * Importation d'un bief. - */ - public void importBief(){ - //TODO - } - - /** * Fusion de deux biefs. */ - public void fusionnerBiefs(){ + public void fusionnerBiefs(int _idxBief1, int _idxBief2){ //TODO } 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-19 19:40:40 UTC (rev 4383) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-20 09:46:41 UTC (rev 4384) @@ -455,7 +455,7 @@ cmd_=_cmd; } public void redo() { - boolean synchroniserEnable=isSynchroniserActived(); + boolean synchroniserEnable=isSynchronizerActived(); if(synchroniserEnable) gisSynchroniser_.disable(); cmd_.redo(); @@ -463,7 +463,7 @@ gisSynchroniser_.enable(); } public void undo() { - boolean synchroniserEnable=isSynchroniserActived(); + boolean synchroniserEnable=isSynchronizerActived(); if(synchroniserEnable) gisSynchroniser_.disable(); cmd_.undo(); @@ -475,7 +475,7 @@ } } CtuluCommandComposite cmd=new CtuluCommandComposite("R\xE9ordonnancement des profils"); - boolean synchroniserEnable=isSynchroniserActived(); + boolean synchroniserEnable=isSynchronizerActived(); if(synchroniserEnable) gisSynchroniser_.disable(); Geometry axeHydraulique=(Geometry)axeHydraulique_.getObject(0); @@ -529,7 +529,7 @@ /** * Retourne vrai si le synchroniser est activ\xE9. */ - public boolean isSynchroniserActived() { + public boolean isSynchronizerActived() { return gisSynchroniser_.isActived(); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefSet.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefSet.java 2009-01-19 19:40:40 UTC (rev 4383) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefSet.java 2009-01-20 09:46:41 UTC (rev 4384) @@ -23,7 +23,7 @@ * g\xE9om\xE9tries manipul\xE9es dans tout le 1d. * * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class BiefSet { @@ -103,16 +103,28 @@ class removeBiefCtuluCommand implements CtuluCommand, CtuluNamedCommand { public String nom_; public Bief bief_; - public removeBiefCtuluCommand(String _nom, Bief _bief){nom_=_nom;bief_=_bief;} - public void redo() {removeBief(nom_, null);} - public void undo() {addBief(nom_, bief_, null);} + public boolean isSyn_; + public removeBiefCtuluCommand(String _nom, Bief _bief, boolean _isSyn) { + nom_=_nom;bief_=_bief;isSyn_=_isSyn; + } + public void redo() { + removeBief(nom_, null); + bief_.disableSynchroniser(); + } + public void undo() { + addBief(nom_, bief_, null); + if(isSyn_) + bief_.enableSynchroniser(); + } public String getName() {return FudaaLib.getS("supprimer bief");} }; Bief bief=biefs_.get(_nomBief); + boolean isSynchronise=bief.isSynchronizerActived(); + bief.disableSynchroniser(); biefs_.remove(_nomBief); listNoms_.remove(_nomBief); if(_cmd!=null) - _cmd.addCmd(new removeBiefCtuluCommand(_nomBief, bief)); + _cmd.addCmd(new removeBiefCtuluCommand(_nomBief, bief, isSynchronise)); fireRemovedBief(_nomBief); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java 2009-01-19 19:40:40 UTC (rev 4383) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java 2009-01-20 09:46:41 UTC (rev 4384) @@ -9,7 +9,6 @@ import java.awt.Container; -import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.ListModel; import javax.swing.event.ListDataEvent; 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-19 19:40:40 UTC (rev 4383) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java 2009-01-20 09:46:41 UTC (rev 4384) @@ -10,10 +10,15 @@ import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; import javax.swing.JButton; import javax.swing.JScrollPane; import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import org.fudaa.ctulu.gui.CtuluTable; @@ -21,6 +26,7 @@ import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerBief; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSet; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSetListener; +import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsProfil1d; import com.memoire.bu.BuBorderLayout; import com.memoire.bu.BuButton; @@ -39,6 +45,10 @@ protected ControllerBief controllerBief_; /** Tableau d'affichage des biefs. */ protected JTable tableBiefs_; + /** Bouton d'ouverture d'un bief. */ + protected BuButton btOuvrir_; + /** bouton de fusion de bief. */ + protected BuButton btFusionner_; public VueModuleGestionBief(ControllerBief _controllerBief){ controllerBief_=_controllerBief; @@ -53,34 +63,71 @@ add(body, BuBorderLayout.CENTER); // Tableau de noms tableBiefs_=new CtuluTable(new TableBiefModel()); - tableBiefs_.setSelectionModel(controllerBief_.getBiefSelectionModel()); body.add(new JScrollPane(tableBiefs_), BuBorderLayout.CENTER); - // Boutons + // Boutons \\ + // Ouvrir Container btContainer=new Container(); btContainer.setLayout(new BuGridLayout(1, 5, 5)); - JButton btOuvrir=new BuButton(FudaaLib.getS("Ouvrir")); - btOuvrir.addActionListener(new ActionListener(){ + btOuvrir_=new BuButton(FudaaLib.getS("Ouvrir")); + btOuvrir_.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { - controllerBief_.importBief(); + controllerBief_.getBiefSelectionModel().setSelectedBief(tableBiefs_.getSelectionModel().getMinSelectionIndex()); } }); - btOuvrir.setEnabled(false); - btContainer.add(btOuvrir); + tableBiefs_.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + ListSelectionModel sel=tableBiefs_.getSelectionModel(); + if(sel.getMaxSelectionIndex()!=sel.getMinSelectionIndex()||sel.getMaxSelectionIndex()==-1) + btOuvrir_.setEnabled(false); + else + btOuvrir_.setEnabled(true); + } + }); + btOuvrir_.setEnabled(false); + btContainer.add(btOuvrir_); + // Supprimer JButton btSupprimer=new BuButton(FudaaLib.getS("supprimer")); btSupprimer.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { - controllerBief_.removeSelectedBief(); + // R\xE9cup\xE9ration des biefs selectionn\xE9s + List<Integer> idxSupp=new ArrayList<Integer>(); + for(int i=tableBiefs_.getModel().getRowCount()-1;i>=0;i--) + if(tableBiefs_.getSelectionModel().isSelectedIndex(i)) + idxSupp.add(i); + int[] idx=new int[idxSupp.size()]; + for(int i=0;i<idx.length;i++) + idx[i]=idxSupp.get(i); + // D\xE9selection si besoin du bief en cours de manipulation + if(UtilsProfil1d.in(controllerBief_.getBiefSelectionModel().getMaxSelectionIndex(), idx)) + controllerBief_.getBiefSelectionModel().clearSelection(); + // Suppression des biefs + controllerBief_.removeBief(idx); } }); btContainer.add(btSupprimer); - JButton btFusionner=new BuButton(FudaaLib.getS("Fusionner")); - btFusionner.addActionListener(new ActionListener(){ + // Fusionner + btFusionner_=new BuButton(FudaaLib.getS("Fusionner")); + btFusionner_.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { - controllerBief_.fusionnerBiefs(); + ListSelectionModel sel=tableBiefs_.getSelectionModel(); + controllerBief_.fusionnerBiefs(sel.getMaxSelectionIndex(), sel.getMinSelectionIndex()); } }); - btFusionner.setEnabled(false); - btContainer.add(btFusionner); + tableBiefs_.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + int nbSel=0; + for(int i=tableBiefs_.getModel().getRowCount();i>=0;i--) + if(tableBiefs_.getSelectionModel().isSelectedIndex(i)) + nbSel++; + if(nbSel!=2) + btFusionner_.setEnabled(false); + else + btFusionner_.setEnabled(true); + } + }); + btFusionner_.setEnabled(false); + btContainer.add(btFusionner_); + // Dupliquer JButton btDupliquer=new BuButton(FudaaLib.getS("Dupliquer")); btDupliquer.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-29 09:53:09
|
Revision: 4424 http://fudaa.svn.sourceforge.net/fudaa/?rev=4424&view=rev Author: emmanuel_martin Date: 2009-01-29 09:53:07 +0000 (Thu, 29 Jan 2009) Log Message: ----------- Am?\195?\169lioration de la stabilit?\195?\169 du modeleur1d Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.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/BiefSet.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 Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-28 22:44:24 UTC (rev 4423) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-01-29 09:53:07 UTC (rev 4424) @@ -409,12 +409,10 @@ @Override public void internalFrameActivated(InternalFrameEvent e) { + controllerBief_.removeAllBiefs(); controllerBief_.updateFrom2d(); } - /* (non-Javadoc) - * @see javax.swing.event.InternalFrameAdapter#internalFrameDeactivated(javax.swing.event.InternalFrameEvent) - */ @Override public void internalFrameDeactivated(InternalFrameEvent e) { mng_.clean(); 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-28 22:44:24 UTC (rev 4423) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-01-29 09:53:07 UTC (rev 4424) @@ -74,7 +74,12 @@ * Se r\xE9g\xE9n\xE8re par rapport aux 2d. */ public void updateFrom2d(){ - importBiefsFrom2d(controller1d_.getImplementation().get2dFrame().getVisuPanel().getArbreCalqueModel().getRootCalque().getCalqueParNom("gcBiefs")); + try { + importBiefsFrom2d(controller1d_.getImplementation().get2dFrame().getVisuPanel().getArbreCalqueModel().getRootCalque().getCalqueParNom("gcBiefs")); + } + catch(IllegalArgumentException _exp) { + controller1d_.getImplementation().error(FudaaLib.getS("Erreur dans l'import depuis le 2d"), _exp.getMessage()); + } } /** @@ -107,6 +112,7 @@ biefSet_.removeBief(names[i], null); BCalque[] calques=_rootCalque.getCalques(); // It\xE9ration du chaque bief + StringBuilder errors=new StringBuilder(); for (int i=0; i<calques.length; i++) { BCalque calqueBief=calques[i]; List<ZModeleLigneBrisee> modelsDuFutureBief=new ArrayList<ZModeleLigneBrisee>(); @@ -116,13 +122,21 @@ if (sousCalques[j] instanceof FSigLayerLineEditable) modelsDuFutureBief.add(((FSigLayerLineEditable)sousCalques[j]).getModele()); // Ajout du bief - biefSet_.addBief(calqueBief.getTitle(), modelsDuFutureBief.toArray(new ZModeleLigneBrisee[0]), null); + try { + biefSet_.addBief(calqueBief.getTitle(), modelsDuFutureBief.toArray(new ZModeleLigneBrisee[0]), null); + } + catch (IllegalArgumentException _exp) { + errors.append(FudaaLib.getS("Bief \"")+calqueBief.getTitle()+"\" : "+_exp.getMessage()+"\n"); + } } // Ajout d'une selection if(biefSet_.getNbBief()>selectedValue&&selectedValue!=-1) biefSelectionModel_.addSelectionInterval(selectedValue, selectedValue); else if(biefSet_.getNbBief()>0&&selectedValue==-1) biefSelectionModel_.addSelectionInterval(0, 0); + // Traitement des erreurs + if(errors.length()>0) + throw new IllegalArgumentException(errors.toString()); } /** @@ -159,12 +173,36 @@ public void removeBief(int[] _idx){ Arrays.sort(_idx); CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("Suppression de biefs")); - for(int i=_idx.length-1;i>=0;i--) + for(int i=_idx.length-1;i>=0;i--) { + if(biefSelectionModel_.getSelectedBief()==_idx[i]) + biefSelectionModel_.clearSelection(); biefSet_.removeBief(biefSet_.getBiefName(_idx[i]), cmd); + } getCommandManager().addCmd(cmd.getSimplify()); } /** + * Supprime tous les biefs. + */ + public void removeAllBiefs() { + int[] idx=new int[biefSet_.getNbBief()]; + for(int i=0;i<idx.length;i++) + idx[i]=i; + removeBief(idx); + } + + /** + * Supprime le bief selectionn\xE9. + */ + public void removeSelectedBief() { + int idxBief=biefSelectionModel_.getSelectedBief(); + if(idxBief!=-1) { + biefSelectionModel_.clearSelection(); + biefSet_.removeBief(biefSet_.getBiefName(idxBief), getCommandManager()); + } + } + + /** * Fusion de deux biefs. */ public void fusionnerBiefs(int _idxBief1, int _idxBief2){ @@ -373,9 +411,11 @@ public BiefSelectionModel getBiefSelectionModel() { return biefSelectionModel_; } - + /** - * Retourne le biefContainer, c'est \xE0 dire le conteneur de tout les biefs. + * Retourne le biefContainer, c'est \xE0 dire le conteneur de tous les biefs. + * Attention, pour la suppression de biefs, mieux vaut passer par le + * controller, sinon des incoh\xE9rences avec la selection peuvent apparaitre. */ public BiefSet getBiefSet(){ return biefSet_; 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-28 22:44:24 UTC (rev 4423) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-29 09:53:07 UTC (rev 4424) @@ -56,9 +56,11 @@ /** Le synchroniser de gis. */ private GisZoneSynchroniser gisSynchroniser_=new GisZoneSynchroniser(); - + /** * Les models de bases sont instanci\xE9s, le synchronizer n'est pas lanc\xE9. + * Attention le modele d'axe hydraulique ne contient pas d'axe hydraulique. Il + * est donc invalide. */ public Bief(){ axeHydraulique_=new MdlModel1dAxe(null); @@ -109,7 +111,7 @@ if (_models[i]==null) throw new IllegalArgumentException(FudaaLib.getS("Erreur programmation : _models ne doit pas contenir de valeurs null")); if (_models[i].getGeomData()==null) - throw new IllegalArgumentException(FudaaLib.getS("Erreur programmation : Certain model n'ont pas de GSIZone.")); + throw new IllegalArgumentException(FudaaLib.getS("Erreur programmation : Certain model n'ont pas de GSIZoneCollection.")); if (!(_models[i].getGeomData() instanceof GISZoneCollectionLigneBrisee)) throw new IllegalArgumentException(FudaaLib.getS("Erreur programmation : Toutes les GISZone doivent \xEAtre des GISZoneCollectionLigneBrisee.")); String nature=(String)_models[i].getGeomData().getFixedAttributValue(GISAttributeConstants.NATURE); @@ -119,7 +121,9 @@ if (axeHydraulique_!=null) throw new IllegalArgumentException(FudaaLib.getS("Plusieurs models d'axe hydrauliques sont donn\xE9es.")); else if (_models[i].getGeomData().getNbGeometries()>1) - throw new IllegalArgumentException(FudaaLib.getS("Il ne peut pas y avoir plusieurs Axes hydrauliques dans le bief.")); + throw new IllegalArgumentException(FudaaLib.getS("Il ne peut pas y avoir plusieurs axes hydrauliques dans le bief.")); + else if (_models[i].getGeomData().getNbGeometries()==0) + throw new IllegalArgumentException(FudaaLib.getS("Il doit y avoir au moins un axe hydraulique dans le bief.")); else axeHydraulique_=_models[i]; else if (nature==GISAttributeConstants.ATT_NATURE_LD) @@ -131,7 +135,7 @@ if (limitesStockages_!=null) throw new IllegalArgumentException(FudaaLib.getS("Plusieurs models de limites de stockage sont donn\xE9es.")); else if (_models[i].getGeomData().getNbGeometries()>2) - throw new IllegalArgumentException(FudaaLib.getS("Il ne peut pas y avoir plus de 2 limites de stockage.")); + throw new IllegalArgumentException(FudaaLib.getS("Il ne peut pas y avoir plus de 2 limites de stockages.")); else limitesStockages_=_models[i]; else if (nature==GISAttributeConstants.ATT_NATURE_PF) @@ -184,89 +188,83 @@ int idxAttlsDroite=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE); int idxAttLignesDirectrices=zone.getIndiceOf(GISAttributeConstants.INTERSECTIONS_LIGNES_DIRECTRICES); - if (axeHydraulique_.getNombre()==0) - for (int i=0; i<profils_.getNombre(); i++) { - profils_.getGeomData().setAttributValue(idxAttRiveGauche, i, null, null); - profils_.getGeomData().setAttributValue(idxAttRiveDroite, i, null, null); - profils_.getGeomData().setAttributValue(idxAttlsGauche, i, null, null); - profils_.getGeomData().setAttributValue(idxAttlsDroite, i, null, null); - GISAttributeModelIntegerList attrModel=new GISAttributeModelIntegerList(0, GISAttributeConstants.INTERSECTIONS_LIGNES_DIRECTRICES); - attrModel.setListener(profils_.getGeomData()); - profils_.getGeomData().setAttributValue(idxAttLignesDirectrices, i, attrModel, null); + Geometry axeHydraulique=(Geometry)axeHydraulique_.getObject(0); + CoordinateSequence seqAxeHydraulique=((GISCoordinateSequenceContainerInterface)axeHydraulique).getCoordinateSequence(); + orderProfils(-1, null); + // Normalise le sens du profil \\ + for (int k=0; k<profils_.getNombre(); k++) { + Geometry profil=zone.getGeometry(k); + CoordinateSequence seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); + // Normalisation du sens (gauche/droite) du profil \\ + Coordinate interAxeProfil=profil.intersection(axeHydraulique).getCoordinate(); + // Cr\xE9ation du vecteur contenant le sens de l'axe hydraulique + Coordinate vAxeH; + int idxPrevious=UtilsProfil1d.getPreviousIndex(seqAxeHydraulique, interAxeProfil); + int idxNext=UtilsProfil1d.getNextIndex(seqAxeHydraulique, interAxeProfil); + if (idxPrevious!=-1) + vAxeH=new Coordinate(interAxeProfil.x-seqAxeHydraulique.getCoordinate(idxPrevious).x, interAxeProfil.y + -seqAxeHydraulique.getCoordinate(idxPrevious).y, 0); + else + vAxeH=new Coordinate(seqAxeHydraulique.getCoordinate(idxNext).x-interAxeProfil.x, + seqAxeHydraulique.getCoordinate(idxNext).y-interAxeProfil.y, 0); + // Cr\xE9ation du vecteur contenant le sens du profil + Coordinate vProfilH; + idxPrevious=UtilsProfil1d.getPreviousIndex(seqProfil, interAxeProfil); + idxNext=UtilsProfil1d.getNextIndex(seqProfil, interAxeProfil); + if (idxPrevious!=-1) + vProfilH=new Coordinate(interAxeProfil.x-seqProfil.getCoordinate(idxPrevious).x, interAxeProfil.y + -seqProfil.getCoordinate(idxPrevious).y, 0); + else + vProfilH=new Coordinate(seqProfil.getCoordinate(idxNext).x-interAxeProfil.x, seqProfil.getCoordinate(idxNext).y + -interAxeProfil.y, 0); + // Inversion du sens du profil si besoin + double produitVectorielCoordZ=vAxeH.x*vProfilH.y-vAxeH.y*vProfilH.x; + if (produitVectorielCoordZ>0) { + inverseProfil(k); + profil=(Geometry)profils_.getGeomData().getGeometry(k); + seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); } - if (axeHydraulique_.getNombre()==1) { - Geometry axeHydraulique=(Geometry)axeHydraulique_.getObject(0); - CoordinateSequence seqAxeHydraulique=((GISCoordinateSequenceContainerInterface)axeHydraulique).getCoordinateSequence(); - orderProfils(-1, null); - // Normalise le sens du profil \\ - for (int k=0; k<profils_.getNombre(); k++) { - Geometry profil=zone.getGeometry(k); - CoordinateSequence seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); - // Normalisation du sens (gauche/droite) du profil \\ - Coordinate interAxeProfil=profil.intersection(axeHydraulique).getCoordinate(); - // Cr\xE9ation du vecteur contenant le sens de l'axe hydraulique - Coordinate vAxeH; - int idxPrevious=UtilsProfil1d.getPreviousIndex(seqAxeHydraulique, interAxeProfil); - int idxNext=UtilsProfil1d.getNextIndex(seqAxeHydraulique, interAxeProfil); - if(idxPrevious!=-1) - vAxeH=new Coordinate(interAxeProfil.x-seqAxeHydraulique.getCoordinate(idxPrevious).x, interAxeProfil.y-seqAxeHydraulique.getCoordinate(idxPrevious).y, 0); - else - vAxeH=new Coordinate(seqAxeHydraulique.getCoordinate(idxNext).x-interAxeProfil.x, seqAxeHydraulique.getCoordinate(idxNext).y-interAxeProfil.y, 0); - // Cr\xE9ation du vecteur contenant le sens du profil - Coordinate vProfilH; - idxPrevious=UtilsProfil1d.getPreviousIndex(seqProfil, interAxeProfil); - idxNext=UtilsProfil1d.getNextIndex(seqProfil, interAxeProfil); - if(idxPrevious!=-1) - vProfilH=new Coordinate(interAxeProfil.x-seqProfil.getCoordinate(idxPrevious).x, interAxeProfil.y-seqProfil.getCoordinate(idxPrevious).y, 0); - else - vProfilH=new Coordinate(seqProfil.getCoordinate(idxNext).x-interAxeProfil.x, seqProfil.getCoordinate(idxNext).y-interAxeProfil.y, 0); - // Inversion du sens du profil si besoin - double produitVectorielCoordZ=vAxeH.x*vProfilH.y-vAxeH.y*vProfilH.x; - if (produitVectorielCoordZ>0) { - inverseProfil(k); - profil=(Geometry)profils_.getGeomData().getGeometry(k); - seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); - } - } - // Cr\xE9ation des nouveaux points sur les profils \\ - for (int k=0; k<profils_.getNombre(); k++) { - // Ajout des points au profil si n\xE9c\xE9ssaire pour les intersections \\ - // Lignes de contraintes - for (int l=0; l<lignesContraints_.getNombre(); l++) - createPointIfNeededKeepZ(k, l, lignesContraints_); - // Rives - for (int l=0; l<rives_.getNombre(); l++) - createPointIfNeeded(k, (GISPolyligne) rives_.getObject(l)); - // Limites de stockages - for (int l=0; l<limitesStockages_.getNombre(); l++) - createPointIfNeeded(k, (GISPolyligne) limitesStockages_.getObject(l)); - // Lignes directrices - for (int l=0; l<lignesDirectrices_.getNombre(); l++) - createPointIfNeeded(k, (GISPolyligne) lignesDirectrices_.getObject(l)); - } - // Valuation des attributs simple d'intersection (rives et limites) \\ - for(int k=0;k<profils_.getNombre();k++) { - Geometry profil=zone.getGeometry(k); - CoordinateSequence seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); - Coordinate interAxeProfil=profil.intersection(axeHydraulique).getCoordinate(); - double abscisseCurvIntersectionAxe=UtilsProfil1d.abscisseCurviligne(seqProfil, interAxeProfil); - // Valuation des attributs avec les index des points des intersections \\ - // Rives - zone.setAttributValue(idxAttRiveGauche, k, 0, null); - zone.setAttributValue(idxAttRiveDroite, k, seqProfil.size()-1, null); - for (int l=0; l<rives_.getNombre(); l++) - valuateProfilIntersection(k, (Geometry) rives_.getObject(l), idxAttRiveGauche, idxAttRiveDroite, abscisseCurvIntersectionAxe); - // D\xE9tection des croisements zones de stockages droite et gauche \\ - // Limites de stockages - zone.setAttributValue(idxAttlsGauche, k, 0, null); - zone.setAttributValue(idxAttlsDroite, k, seqProfil.size()-1, null); - for (int l=0; l<limitesStockages_.getNombre(); l++) - valuateProfilIntersection(k, (Geometry) limitesStockages_.getObject(l), idxAttlsGauche, idxAttlsDroite, abscisseCurvIntersectionAxe); - } - // Valuation des attributs composites d'intersection (lignes directrices) \\ - // Lignes directrices \\ - valuateProfilIntersection(idxAttLignesDirectrices); } + // Cr\xE9ation des nouveaux points sur les profils \\ + for (int k=0; k<profils_.getNombre(); k++) { + // Ajout des points au profil si n\xE9c\xE9ssaire pour les intersections \\ + // Lignes de contraintes + for (int l=0; l<lignesContraints_.getNombre(); l++) + createPointIfNeededKeepZ(k, l, lignesContraints_); + // Rives + for (int l=0; l<rives_.getNombre(); l++) + createPointIfNeeded(k, (GISPolyligne)rives_.getObject(l)); + // Limites de stockages + for (int l=0; l<limitesStockages_.getNombre(); l++) + createPointIfNeeded(k, (GISPolyligne)limitesStockages_.getObject(l)); + // Lignes directrices + for (int l=0; l<lignesDirectrices_.getNombre(); l++) + createPointIfNeeded(k, (GISPolyligne)lignesDirectrices_.getObject(l)); + } + // Valuation des attributs simple d'intersection (rives et limites) \\ + for (int k=0; k<profils_.getNombre(); k++) { + Geometry profil=zone.getGeometry(k); + CoordinateSequence seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); + Coordinate interAxeProfil=profil.intersection(axeHydraulique).getCoordinate(); + double abscisseCurvIntersectionAxe=UtilsProfil1d.abscisseCurviligne(seqProfil, interAxeProfil); + // Valuation des attributs avec les index des points des intersections \\ + // Rives + zone.setAttributValue(idxAttRiveGauche, k, 0, null); + zone.setAttributValue(idxAttRiveDroite, k, seqProfil.size()-1, null); + for (int l=0; l<rives_.getNombre(); l++) + valuateProfilIntersection(k, (Geometry)rives_.getObject(l), idxAttRiveGauche, idxAttRiveDroite, abscisseCurvIntersectionAxe); + // D\xE9tection des croisements zones de stockages droite et gauche \\ + // Limites de stockages + zone.setAttributValue(idxAttlsGauche, k, 0, null); + zone.setAttributValue(idxAttlsDroite, k, seqProfil.size()-1, null); + for (int l=0; l<limitesStockages_.getNombre(); l++) + valuateProfilIntersection(k, (Geometry)limitesStockages_.getObject(l), idxAttlsGauche, idxAttlsDroite, + abscisseCurvIntersectionAxe); + } + // Valuation des attributs composites d'intersection (lignes directrices) \\ + // Lignes directrices \\ + valuateProfilIntersection(idxAttLignesDirectrices); + // Valuation des attributs sp\xE9cifique au 1d pour l'axe hydraulique \\ normalizeAxeHydrauliqueAttributes(axeHydraulique_.getGeomData()); // Activation du synchroniser @@ -612,8 +610,10 @@ Object[][] idxAbsCurv=new Object[profils_.getNombre()][]; for(int j=0;j<profils_.getNombre();j++) { Geometry intersection=axeHydraulique.intersection((Geometry) profils_.getObject(j)); - if(intersection.getNumPoints()!=1) - throw new IllegalArgumentException("Au moins un des profils est coup\xE9 plusieurs fois ou jamais."); + if(intersection.getNumPoints()==0) + throw new IllegalArgumentException("Au moins un des profils ne coupe jamais l'axe hydraulique."); + if(intersection.getNumPoints()>1) + throw new IllegalArgumentException("Au moins un des profils coupe plusieurs fois l'axe hydraulique."); idxAbsCurv[j]=new Object[]{j, UtilsProfil1d.abscisseCurviligne(seqAxeHydraulique, intersection.getCoordinate())}; } // Tri en fonction des abcsisses curvilignes Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefSet.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefSet.java 2009-01-28 22:44:24 UTC (rev 4423) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefSet.java 2009-01-29 09:53:07 UTC (rev 4424) @@ -13,6 +13,7 @@ import java.util.Map; import org.fudaa.ctulu.CtuluCommand; +import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ebli.calque.ZModeleLigneBrisee; @@ -49,9 +50,9 @@ */ public void addBief(String _nom, ZModeleLigneBrisee[] _models, CtuluCommandContainer _cmd) { if(_nom==null||_models==null) - throw new IllegalArgumentException("Ni _nom ni _models ne peuvent \xEAtre null."); + throw new IllegalArgumentException(FudaaLib.getS("Ni _nom ni _models ne peuvent \xEAtre null.")); if(biefs_.containsKey(_nom)) - throw new IllegalArgumentException("Ce nom de profil est d\xE9j\xE0 utilis\xE9."); + throw new IllegalArgumentException(FudaaLib.getS("Ce nom de profil est d\xE9j\xE0 utilis\xE9.")); class AddBiefCtuluCommand implements CtuluCommand, CtuluNamedCommand { public String nom_; public Bief bief_; @@ -60,6 +61,7 @@ public void undo() {removeBief(nom_, null);} public String getName() {return FudaaLib.getS("Ajouter bief");} }; + // Transformation des du tableau de models en bief Bief newBief=new Bief(_models); biefs_.put(_nom, newBief); listNoms_.add(_nom); @@ -93,6 +95,18 @@ } /** + * Supprime tous les biefs du container. + */ + public void removeAllBiefs(CtuluCommandContainer _cmd) { + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("Suppression de tous les biefs")); + String[] names=getBiefNames(); + for(int i=0;i<names.length;i++) + removeBief(names[i], cmd); + if(_cmd!=null) + _cmd.addCmd(cmd.getSimplify()); + } + + /** * Supprime le bief dont le nom est donn\xE9 en param\xE8tre. */ public void removeBief(String _nomBief, CtuluCommandContainer _cmd) { 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-28 22:44:24 UTC (rev 4423) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-01-29 09:53:07 UTC (rev 4424) @@ -212,7 +212,7 @@ * Retourne -2 si la coordonn\xE9e n'appartient pas \xE0 la g\xE9om\xE9trie. */ static public int getPreviousIndex(CoordinateSequence _geom, Coordinate _point) { - if(_point==null||_geom.size()<=0||egal(_point, _geom.getCoordinate(0))) + if(_point==null||_geom.size()<=0||egalSansZ(_point, _geom.getCoordinate(0))) return -1; boolean fini=false; int i=-1; @@ -232,7 +232,7 @@ * Retourne -2 si la coordonn\xE9e n'appartient pas \xE0 la g\xE9om\xE9trie. */ static public int getNextIndex(CoordinateSequence _geom, Coordinate _point) { - if(_point==null||_geom.size()<=0||egal(_point, _geom.getCoordinate(_geom.size()-1))) + if(_point==null||_geom.size()<=0||egalSansZ(_point, _geom.getCoordinate(_geom.size()-1))) return -1; boolean fini=false; int i=_geom.size(); 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-28 22:44:24 UTC (rev 4423) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionBief.java 2009-01-29 09:53:07 UTC (rev 4424) @@ -26,7 +26,6 @@ import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerBief; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSet; import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSetListener; -import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsProfil1d; import com.memoire.bu.BuBorderLayout; import com.memoire.bu.BuButton; @@ -97,9 +96,6 @@ int[] idx=new int[idxSupp.size()]; for(int i=0;i<idx.length;i++) idx[i]=idxSupp.get(i); - // D\xE9selection si besoin du bief en cours de manipulation - if(UtilsProfil1d.in(controllerBief_.getBiefSelectionModel().getMaxSelectionIndex(), idx)) - controllerBief_.getBiefSelectionModel().clearSelection(); // Suppression des biefs controllerBief_.removeBief(idx); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-01-30 17:09:29
|
Revision: 4430 http://fudaa.svn.sourceforge.net/fudaa/?rev=4430&view=rev Author: emmanuel_martin Date: 2009-01-30 17:09:25 +0000 (Fri, 30 Jan 2009) Log Message: ----------- Tache #164 : "Edition 1D : Ne pas limiter ?\195?\160 3 le nombre de segments sur les profils" Modified Paths: -------------- 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/ProfilContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 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-30 15:11:50 UTC (rev 4429) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-01-30 17:09:25 UTC (rev 4430) @@ -861,6 +861,16 @@ else if(_att==GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE) updateGeom(_idxGeom, limitesStockagsesModified_, 1, idxAttlsDroite_); else if(_att==GISAttributeConstants.INTERSECTIONS_LIGNES_DIRECTRICES) + /* + * Attention subtilit\xE9 : Quand l'attribut est + * GISAttributeConstants.INTERSECTIONS_LIGNES_DIRECTRICES c'est que + * l'\xE9v\xE9nement vient de la liste des index d'intersection avec une ligne + * directrice m\xE9moris\xE9e dans chaque profil. Or pour cette liste + * l'_idxGeom est en r\xE9alit\xE9 son index modifi\xE9. Vu que les lignes + * directrices sont ordonn\xE9es dans cette attribut, l'information qu'on + * re\xE7oit sous le nom _idxGeom est en faite l'index de la + * ligneDirectrice modifi\xE9e. + */ updateLd(_idxGeom); } @@ -870,7 +880,8 @@ updateGeom(_idxGeom, rivesModified_, 1, idxAttRiveDroite_); updateGeom(_idxGeom, limitesStockagsesModified_, 0, idxAttlsGauche_); updateGeom(_idxGeom, limitesStockagsesModified_, 1, idxAttlsDroite_); - updateLd(_idxGeom); + for(int i=0;i<lignesDirectrices_.getNombre();i++) + updateLd(i); } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-30 15:11:50 UTC (rev 4429) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-01-30 17:09:25 UTC (rev 4430) @@ -105,8 +105,6 @@ /** Place l'intersection du profil avec la rive droite \xE0 l'index _idx. */ public void setRiveDroite(int _idx, CtuluCommandContainer _cmd); - - /** Retourne le nombre de lignes directrices croisant le profil. */ public int getNbLignesDirectrices(); @@ -127,4 +125,7 @@ /** Retourne les index des lignes directrices pouvant \xEAtre d\xE9plac\xE9s au point indiqu\xE9.*/ public int[] getAllowedMoveOfLignesDirectricesTo(int _idxPoint); + + /** Retourne vrai si le point indiqu\xE9 est un point de rupture. */ + public boolean isRupturePoint(int _idx); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-30 15:11:50 UTC (rev 4429) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-01-30 17:09:25 UTC (rev 4430) @@ -9,7 +9,10 @@ import java.util.ArrayList; import java.util.BitSet; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.Set; import org.fudaa.ctulu.CtuluCommand; import org.fudaa.ctulu.CtuluCommandComposite; @@ -22,10 +25,10 @@ import org.fudaa.ctulu.gis.GISAttributeModelIntegerList; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISGeometryFactory; -import org.fudaa.ctulu.gis.GISPolyligne; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.LibUtils; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; @@ -97,6 +100,21 @@ } } + /** + * Marge d'acceptation avant de consid\xE9r\xE9 un point comme \xE9tant un point de + * rupture. La valeur est la diff\xE9rence des coefficients directeurs des + * segments avant et apr\xE8s le point. + * En donnant la valeur en radian de l'angle minimal : tolerance_=Math.tan(#ValeurDegr\xE9#) + * Avec #ValeurDegr\xE9# C [0;PI/2[ + * En donnant la valeur en radian de l'angle maximal : tolerance_=Math.tan(Math.PI-#ValeurDegr\xE9#) + * Avec #ValeurDegr\xE9# C ]PI/2;PI] + * En donnant la valeur en degr\xE9 de l'angle minimal : tolerance_=Math.tan(#ValeurDegr\xE9#*Math.PI/2/90) + * Avec #ValeurDegr\xE9# C [0;90[ + * En donnant la valeur en degr\xE9 de l'angle maximal : tolerance_=Math.tan((180-#ValeurDegr\xE9#)*Math.PI/2/90) + * Avec #ValeurDegr\xE9# C ]90;180] + */ + static final double tolerance_=Math.tan(89*Math.PI/2/90); + /** Le biefContainer contenant le bief contenant les profils utilis\xE9s. */ private BiefContainer biefContainer_; /** Le profil selectionn\xE9. */ @@ -106,17 +124,22 @@ // Caches \\ private int idxZMax_; private int idxZMin_; - private double curviligneDecalage_; // d\xE9calage de l'axe hydraulique. - // Le profil est potentiellement coup\xE9 en trois, les deux indices qui suivent - // indique l'index de chacune de ces ruptures. - private int idxRupture1_; - private int idxRupture2_; + /** D\xE9calage de l'axe hydraulique. */ + private double curviligneDecalage_; + /** Les points de ruptures du profils sont contenus dans cet ensemble. */ + private Set<Integer> idxRuptures_=new HashSet<Integer>(); public ProfilContainerAdapter(BiefContainer _biefContainer) { biefContainer_=_biefContainer; biefContainer_.addBiefContainerListener(this); } + public boolean isRupturePoint(int _idx) { + if(_idx<0||_idx>=getNbPoint()) + throw new IllegalArgumentException(FudaaLib.getS("_idx d'appartient pas au profil.")); + return idxRuptures_.contains(_idx); + } + /** * Change le profil selectionn\xE9. * @throws DataGeometryException @@ -202,7 +225,7 @@ * Permet de choisir la g\xE9om\xE9trie sur lequel l'instance va travailler. * Hypoth\xE8se importante : les points de la g\xE9om\xE9tries sont correctement * ordonn\xE9s (les points sont ordonn\xE9s en ordre croissant de leur abscisse - * curviligne). La veracit\xE9 de cette hypoth\xE8se n'est PAS v\xE9rifi\xE9 dans setData. + * curviligne). La veracit\xE9 de cette hypoth\xE8se n'est PAS v\xE9rifi\xE9 dans updateData. * * @param _zone la zone contenant la g\xE9om\xE9trie * @param _idxGeom l'indice de la g\xE9om\xE9trie dans _zone @@ -213,6 +236,7 @@ z_=null; curv_=null; curviligneDecalage_=0; + idxRuptures_.clear(); } else if (biefContainer_.getZoneProfils()!=null&&idxProfilSelected_>=0&&idxProfilSelected_<biefContainer_.getZoneProfils().getNbGeometries()&&biefContainer_.getZoneProfils().getAttributeIsZ()!=null) { try { @@ -249,11 +273,8 @@ throw new ProfilContainerException(FudaaLib.getS("Le profil se coupe lui m\xEAme. Il n'est donc pas valide.")); } - // / D\xE9termination des points de ruptures et verification qu'il y en a - // au maximun deux. \\\ - idxRupture1_=-1; - idxRupture2_=-1; - double upsilon=0.0001; // Marge d'erreur des calculs sur double + /// D\xE9termination des points de ruptures. \\\ + idxRuptures_.clear(); double coefDirecteur=0; // coefDirX : Indique si le coefficient directeur est calcul\xE9 sur les x // ou sur les y (au d\xE9nominateur). @@ -288,18 +309,22 @@ newCoefDirecteur=0; } // D\xE9tection des ruptures - if (coefDirX!=newCoefDirX||Math.abs(coefDirecteur-newCoefDirecteur)>upsilon) { - if (idxRupture1_==-1) - idxRupture1_=idx-1; - else if (idxRupture2_==-1) - idxRupture2_=idx-1; - else - throw new ProfilContainerException(FudaaLib.getS("Il y a plus que deux ruptures dans le profil.")); - } + if (coefDirX!=newCoefDirX||Math.abs(coefDirecteur-newCoefDirecteur)>tolerance_) + idxRuptures_.add(idx-1); // Pr\xE9paration de l'it\xE9ration suivante coefDirecteur=newCoefDirecteur; coefDirX=newCoefDirX; } + // Lin\xE9arisation du profil + if(idxRuptures_.size()>0) { + int[] idxRuptures=new int[idxRuptures_.size()+2]; + idxRuptures[0]=0; + Iterator<Integer> it=idxRuptures_.iterator(); + for(int i=0;i<idxRuptures_.size();i++) + idxRuptures[i+1]=it.next(); + idxRuptures[idxRuptures.length-1]=seq.size()-1; + LibUtils.linearisePolyligne(biefContainer_.getZoneProfils(), idxProfilSelected_, idxRuptures, null); + } } catch(ProfilContainerException _exp) { // Remise dans un \xE9tat coh\xE9rent @@ -307,6 +332,7 @@ z_=null; curv_=null; curviligneDecalage_=0; + idxRuptures_.clear(); fireProfilContainerDataModified(); // Propagation de l'exception throw _exp; @@ -701,18 +727,18 @@ * m\xEAme raison. Pour ne pas trop perdre en performance, seuls les * coordonn\xE9es modifi\xE9es sont clon\xE9es. */ - // Les nouvelles valeurs du points \xE0 d\xE9placer - double newX; - double newY; - // Delta pour savoir si des doubles sont \xE9gaux - double tolerance=0.000001; +// // Les nouvelles valeurs du points \xE0 d\xE9placer +// double newX; +// double newY; +// // Delta pour savoir si des doubles sont \xE9gaux +// double tolerance=0.000001; // Verifie que le point reste encadr\xE9 par le(s) m\xEAme(s) point(s) if((_idxPoint==0&&_value>=curv_.get(1))||(_idxPoint==seq.size()-1&&_value<=curv_.get(seq.size()-2))||(_idxPoint!=0&&_idxPoint!=seq.size()-1&&(_value<=curv_.get(_idxPoint-1)||_value>=curv_.get(_idxPoint+1)))) throw new ProfilContainerException(FudaaLib.getS("Il est interdit de d\xE9placer un point au dela des points l'encadrant.")); // Cas o\xF9 l'index n'est pas sur un point de rupture \\ - if (_idxPoint!=idxRupture1_&&_idxPoint!=idxRupture2_) { + if (!idxRuptures_.contains(_idxPoint)) { // Le point reste encadr\xE9 par les deux m\xEAme points => le signe de xa-xb et // de ya-yb ne change pas Coordinate newCoord=UtilsProfil1d.getCoordinateXY(seq, _value); @@ -726,202 +752,202 @@ curv_.set(_idxPoint, _value); } - // Cas complexe : l'index est sur un point de rupture \\ - else { - /* - * Abstract : - * Pour trouver le point restectant la concervation de labcisse curviligne, est - * utilis\xE9 par la suite une m\xE9thode d'intersection de deux cercles. - * - Soient A, B, C, trois points non confondus. Soit la polyligne A, C, B. - * On veut construire C' tq cruv(C')=c et que curv(B) reste constant. - * Donc : - * dist(AC)+dist(CB)=dist(AC')+dist(C'B) - * Ce probl\xE8me peut se r\xE9duire \xE0 la recherche de l'intersection de deux cercles : - * C1=cercle(centre=A, rayon=c-curv(A)) avec C2=cercle(centre=B, rayon=curv(B)-c) - * - * Cas 1 : ya-yb != 0: - * La r\xE9solution de ce probl\xE8me donne l'\xE9quation : - * x\xB2[M\xB2+1] + x[2yaM-2NM-2xa] + xa\xB2+ya\xB2+N\xB2-rayonC1\xB2-2yaN=0 - * avec N=(rayonC2\xB2-rayonC1\xB2-xb\xB2+xa\xB2-yb\xB2+ya\xB2)/(2(ya-yb)) - * et M=(xa-xb)/(ya-yb) - * C'est une \xE9quation du second degr\xE9. - * Pour la r\xE9solution de l'\xE9quation, nous nommerons : - * equA=[M\xB2+1] - * equB=[2yaM-2NM-2xa] - * equC=xa\xB2+ya\xB2+N\xB2-rayonC1\xB2-2yaN - * La r\xE9solution de l'\xE9quation r\xE9sultante donne deux solutions (c1' et c2'). - * Pour trouver celle qui nous interesse (si elle existe) la contrainte suivante doit \xEAtre v\xE9rifi\xE9e : - * vecteurNorm\xE9(C, Proj(C, AB)) = vecteurNorm\xE9(CX', Proj(CX', AB)) - * A noter que Proj(C1', AB)=Proj(C2', AB) de plus pour simplifier cette r\xE9solution sera faite sur z=0. - * - * Cas 2 : ya-yb = 0 et xa-xb != 0: - * La r\xE9solution de ce prol\xE8me donne l'\xE9quation : - * y\xB2-2yay+xa+K\xB2-2xaK-rayonC1\xB2=0 - * avec K=(rayonC2\xB2-rayonC1\xB2-xb\xB2+xa\xB2)/(2*(xa-xb)) - * # k est \xE9galement la valeur de x des deux solutions potentielles - * C'est un \xE9quation du second degr\xE9. - * Pour la r\xE9solution de l'aquation, nous nommerons : - * equA=1 - * equB=2ya - * equC=K\xB2-2xaK-rayonC1\xB2 - * La r\xE9solution de l'\xE9quation r\xE9sultante donne deux solutions (c1' et c2'). - * Pour trouver celle qui nous interesse (si elle existe) la contrainte suivante doit \xEAtre v\xE9rifi\xE9e : - * vecteurNorm\xE9(C, Proj(C, AB)) = vecteurNorm\xE9(CX', Proj(CX', AB)) - * A noter que Proj(C1', AB)=Proj(C2', AB) de plus pour simplifier cette r\xE9solution sera faite sur z=0. - * - * Cas 3 : ya-yb = 0 et xa-xb=0: - * quel qu'en soit le r\xE9sultat, c'est incoh\xE9rent pour notre contexte. - * - * De plus on verifie que le r\xE9sultat ne provoque pas de croisement avec les autres axes - * du profil. - * - * Une fois ce point trouv\xE9, on va \xE9galement d\xE9placer tous les points des deux axes adjacents, - * pour que le profil concerve sa forme g\xE9n\xE9rale. Ce r\xE9aligement se faire en concervant les - * abscisses curvilignes de chacun des points. - * Pour y parvenir le nouveau coefficient directeur des axes est calcul\xE9 et appliqu\xE9 au rapport de - * l'abcisse curviligne avec l'abscisse du point extr\xE9mit\xE9 de l'axe. - * - * Derni\xE8re petite note pour la fin, le cas dit 'simple' pr\xE9c\xE9dent - * (d\xE9placement d'un point qui n'est pas un point de rupture) n'est qu'un - * cas particulier de la r\xE9solution ci dessus (la solution de l'\xE9quation - * du second degr\xE9 serait unique). On pourrait donc l'enlever, mais je pense que - * s\xE9parer ces deux cas ne fait pas de mal pour une \xE9ventuelle relecture - * et/ou modification de ce code. - */ - - // Application de la m\xE9thode d\xE9crite ci dessus \\ - - // Valuation des variables d'entr\xE9es n\xE9c\xE9ssaires - final int idxPtdeb=_idxPoint==idxRupture1_?0:idxRupture1_; - final int idxPtFin=_idxPoint==idxRupture2_||idxRupture2_==-1?seq.size()-1:idxRupture2_; - final Coordinate a=seq.getCoordinate(idxPtdeb); - final Coordinate b=seq.getCoordinate(idxPtFin); - final Coordinate c=seq.getCoordinate(_idxPoint); - final double rayonC1=_value-curv_.get(idxPtdeb); - final double rayonC2=curv_.get(idxPtFin)-_value; - // Solutions - double x1; - double y1; - double x2; - double y2; - // Cas 1 - if(Math.abs(a.y-b.y)>tolerance){ - // Variables interm\xE9diaires - double n=(rayonC2*rayonC2-rayonC1*rayonC1-b.x*b.x+a.x*a.x-b.y*b.y+a.y*a.y)/(2*(a.y-b.y)); - double m=(a.x-b.x)/(a.y-b.y); - double equA=m*m+1; - double equB=2*(a.y*m-n*m-a.x); - double equC=a.x*a.x+a.y*a.y+n*n-rayonC1*rayonC1-2*a.y*n; - // Variables de r\xE9solution - double deltaTmp=equB*equB-4*equA*equC; - if(deltaTmp<0) - throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas possible sans violer la contrainte de constance de la longueur du profil.")); - double delta=Math.sqrt(equB*equB-4*equA*equC); - x1=(-equB+delta)/(2*equA); - y1=n-x1*m; - x2=(-equB-delta)/(2*equA); - y2=n-x2*m; - } - // Cas 2 - else if(Math.abs(a.x-b.x)>tolerance){ - // Variables interm\xE9diaires - double k=(rayonC2*rayonC2-rayonC1*rayonC1-b.x*b.x+a.x*a.x)/(2*(a.x-b.x)); - double equA=1; - double equB=2*a.y; - double equC=k*k-2*a.x*k-rayonC1*rayonC1; - // Variables de r\xE9solution - double deltaTmp=equB*equB-4*equA*equC; - if(deltaTmp<0) - throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas possible sans violer la contrainte de constance de la longueur du profil.")); - double delta=Math.sqrt(equB*equB-4*equA*equC); - y1=(-equB+delta)/(2*equA); - x1=k; - y2=(-equB-delta)/(2*equA); - x2=k; - } - // Cas 3 - else - throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas valide. Ce cas ne devrait jamais arriver. CSI_1")); - // Recherche du r\xE9sultat nous interessant dans ce cas ci - Coordinate aZ0=new Coordinate(a.x, a.y, 0); - Coordinate bZ0=new Coordinate(b.x, b.y, 0); - Coordinate cZ0=new Coordinate(c.x, c.y, 0); - Coordinate vecReference=UtilsProfil1d.vec(cZ0, UtilsProfil1d.proj(cZ0, aZ0, bZ0)); - Coordinate cProj=UtilsProfil1d.proj(new Coordinate(x1, y1, 0), aZ0, bZ0); - assert(UtilsProfil1d.egal(cProj, UtilsProfil1d.proj(new Coordinate(x2, y2, 0), aZ0, bZ0), 0.0001, false)); - if(UtilsProfil1d.egal(vecReference, UtilsProfil1d.vec(new Coordinate(x1, y1, 0), cProj), 0.0001, true)){ - newX=x1; - newY=y1; - } - else if(UtilsProfil1d.egal(vecReference, UtilsProfil1d.vec(new Coordinate(x2, y2, 0), cProj), 0.0001, true)) { - newX=x2; - newY=y2; - } - else - throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas valide. Ce cas ne devrait jamais arriver. CSI_2")); - - // Verifie que le point trouv\xE9 ne coupe pas un autre axe du profil \\ - boolean noCut=true; - Coordinate newP=new Coordinate(newX, newY); - GISPolyligne axe1=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{a, newP}); - GISPolyligne axe2=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{newP, b}); - if(idxPtdeb>0) { - /* - * Test de croisement entre les deux axes modifi\xE9s et l'axe avant. l'axe - * a, newP a normalement un point d'intersectino (a). - */ - GISPolyligne axeTest=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{new Coordinate(coords[0]), new Coordinate(coords[idxPtdeb])}); - noCut=axe1.intersection(axeTest).getNumPoints()==1; - noCut=noCut&&!axe2.intersects(axeTest); - } - if(idxPtFin<seq.size()-1) { - /* - * Test de croisement entre les deux axes modifi\xE9s et l'axe avant. l'axe - * newP, b a normalement un point d'intersectino (b). - */ - GISPolyligne axeTest=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{new Coordinate(coords[idxPtFin]), new Coordinate(coords[coords.length-1])}); - noCut=noCut&&axe2.intersection(axeTest).getNumPoints()==1; - noCut=noCut&&!axe1.intersects(axeTest); - } - // Traitement de l'\xE9ventuelle d\xE9tection d'un croisement - if(!noCut) - throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement est impossible sans obtenir un profil dont des axes se coupent.")); - // Enregistrement du nouveau point C' et de la nouvelle valeur curviligne - coords[_idxPoint]=new Coordinate(newX, newY, coords[_idxPoint].z); - // Mise a jour de la table des valeurs curvilignes - curv_.set(_idxPoint, _value); - - // R\xE9alignement des points des axes adjacents \\ - for(int inc=0;inc<2;inc++){ - // D\xE9termination des points de d\xE9but et de fin d'axe - int idxDeb; - int idxFin; - if(inc==0) { // premi\xE8re it\xE9ration, axe : debut, C' - idxDeb=_idxPoint==idxRupture1_?0:idxRupture1_; - idxFin=_idxPoint; - } - else { // seconde it\xE9ration, axe : C', fin - idxDeb=_idxPoint; - idxFin=_idxPoint==idxRupture2_||idxRupture2_==-1 ? seq.size()-1:idxRupture2_; - } - // R\xE9alignement sur l'axe - if (Math.abs(coords[idxFin].x-coords[idxDeb].x)>tolerance) { - double sign=Math.signum(coords[idxFin].x-coords[idxDeb].x); - double newCoefDirecteur=(coords[idxFin].y-coords[idxDeb].y)/(coords[idxFin].x-coords[idxDeb].x); - for (int i=idxDeb+1; i<idxFin; i++) { - coords[i]=new Coordinate(0, 0, coords[i].z); - coords[i].x=coords[idxDeb].x+sign*(curv_.get(i)-curv_.get(idxDeb))/Math.sqrt(1+newCoefDirecteur*newCoefDirecteur); - coords[i].y=coords[idxDeb].y+newCoefDirecteur*(coords[i].x-coords[idxDeb].x); - } - } - else { // Cas du bout de profil vertical - double sign=Math.signum(coords[idxFin].y-coords[idxDeb].y); - for (int i=idxDeb+1; i<idxFin; i++) - coords[i]=new Coordinate(coords[idxDeb].x, coords[idxDeb].y+sign*(curv_.get(i)-curv_.get(idxDeb)), - coords[i].z); - } - } - } +// // Cas complexe : l'index est sur un point de rupture \\ +// else { +// /* +// * Abstract : +// * Pour trouver le point restectant la concervation de labcisse curviligne, est +// * utilis\xE9 par la suite une m\xE9thode d'intersection de deux cercles. +// * - Soient A, B, C, trois points non confondus. Soit la polyligne A, C, B. +// * On veut construire C' tq cruv(C')=c et que curv(B) reste constant. +// * Donc : +// * dist(AC)+dist(CB)=dist(AC')+dist(C'B) +// * Ce probl\xE8me peut se r\xE9duire \xE0 la recherche de l'intersection de deux cercles : +// * C1=cercle(centre=A, rayon=c-curv(A)) avec C2=cercle(centre=B, rayon=curv(B)-c) +// * +// * Cas 1 : ya-yb != 0: +// * La r\xE9solution de ce probl\xE8me donne l'\xE9quation : +// * x\xB2[M\xB2+1] + x[2yaM-2NM-2xa] + xa\xB2+ya\xB2+N\xB2-rayonC1\xB2-2yaN=0 +// * avec N=(rayonC2\xB2-rayonC1\xB2-xb\xB2+xa\xB2-yb\xB2+ya\xB2)/(2(ya-yb)) +// * et M=(xa-xb)/(ya-yb) +// * C'est une \xE9quation du second degr\xE9. +// * Pour la r\xE9solution de l'\xE9quation, nous nommerons : +// * equA=[M\xB2+1] +// * equB=[2yaM-2NM-2xa] +// * equC=xa\xB2+ya\xB2+N\xB2-rayonC1\xB2-2yaN +// * La r\xE9solution de l'\xE9quation r\xE9sultante donne deux solutions (c1' et c2'). +// * Pour trouver celle qui nous interesse (si elle existe) la contrainte suivante doit \xEAtre v\xE9rifi\xE9e : +// * vecteurNorm\xE9(C, Proj(C, AB)) = vecteurNorm\xE9(CX', Proj(CX', AB)) +// * A noter que Proj(C1', AB)=Proj(C2', AB) de plus pour simplifier cette r\xE9solution sera faite sur z=0. +// * +// * Cas 2 : ya-yb = 0 et xa-xb != 0: +// * La r\xE9solution de ce prol\xE8me donne l'\xE9quation : +// * y\xB2-2yay+xa+K\xB2-2xaK-rayonC1\xB2=0 +// * avec K=(rayonC2\xB2-rayonC1\xB2-xb\xB2+xa\xB2)/(2*(xa-xb)) +// * # k est \xE9galement la valeur de x des deux solutions potentielles +// * C'est un \xE9quation du second degr\xE9. +// * Pour la r\xE9solution de l'aquation, nous nommerons : +// * equA=1 +// * equB=2ya +// * equC=K\xB2-2xaK-rayonC1\xB2 +// * La r\xE9solution de l'\xE9quation r\xE9sultante donne deux solutions (c1' et c2'). +// * Pour trouver celle qui nous interesse (si elle existe) la contrainte suivante doit \xEAtre v\xE9rifi\xE9e : +// * vecteurNorm\xE9(C, Proj(C, AB)) = vecteurNorm\xE9(CX', Proj(CX', AB)) +// * A noter que Proj(C1', AB)=Proj(C2', AB) de plus pour simplifier cette r\xE9solution sera faite sur z=0. +// * +// * Cas 3 : ya-yb = 0 et xa-xb=0: +// * quel qu'en soit le r\xE9sultat, c'est incoh\xE9rent pour notre contexte. +// * +// * De plus on verifie que le r\xE9sultat ne provoque pas de croisement avec les autres axes +// * du profil. +// * +// * Une fois ce point trouv\xE9, on va \xE9galement d\xE9placer tous les points des deux axes adjacents, +// * pour que le profil concerve sa forme g\xE9n\xE9rale. Ce r\xE9aligement se faire en concervant les +// * abscisses curvilignes de chacun des points. +// * Pour y parvenir le nouveau coefficient directeur des axes est calcul\xE9 et appliqu\xE9 au rapport de +// * l'abcisse curviligne avec l'abscisse du point extr\xE9mit\xE9 de l'axe. +// * +// * Derni\xE8re petite note pour la fin, le cas dit 'simple' pr\xE9c\xE9dent +// * (d\xE9placement d'un point qui n'est pas un point de rupture) n'est qu'un +// * cas particulier de la r\xE9solution ci dessus (la solution de l'\xE9quation +// * du second degr\xE9 serait unique). On pourrait donc l'enlever, mais je pense que +// * s\xE9parer ces deux cas ne fait pas de mal pour une \xE9ventuelle relecture +// * et/ou modification de ce code. +// */ +// +// // Application de la m\xE9thode d\xE9crite ci dessus \\ +// +// // Valuation des variables d'entr\xE9es n\xE9c\xE9ssaires +// final int idxPtdeb=_idxPoint==idxRupture1_?0:idxRupture1_; +// final int idxPtFin=_idxPoint==idxRupture2_||idxRupture2_==-1?seq.size()-1:idxRupture2_; +// final Coordinate a=seq.getCoordinate(idxPtdeb); +// final Coordinate b=seq.getCoordinate(idxPtFin); +// final Coordinate c=seq.getCoordinate(_idxPoint); +// final double rayonC1=_value-curv_.get(idxPtdeb); +// final double rayonC2=curv_.get(idxPtFin)-_value; +// // Solutions +// double x1; +// double y1; +// double x2; +// double y2; +// // Cas 1 +// if(Math.abs(a.y-b.y)>tolerance){ +// // Variables interm\xE9diaires +// double n=(rayonC2*rayonC2-rayonC1*rayonC1-b.x*b.x+a.x*a.x-b.y*b.y+a.y*a.y)/(2*(a.y-b.y)); +// double m=(a.x-b.x)/(a.y-b.y); +// double equA=m*m+1; +// double equB=2*(a.y*m-n*m-a.x); +// double equC=a.x*a.x+a.y*a.y+n*n-rayonC1*rayonC1-2*a.y*n; +// // Variables de r\xE9solution +// double deltaTmp=equB*equB-4*equA*equC; +// if(deltaTmp<0) +// throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas possible sans violer la contrainte de constance de la longueur du profil.")); +// double delta=Math.sqrt(equB*equB-4*equA*equC); +// x1=(-equB+delta)/(2*equA); +// y1=n-x1*m; +// x2=(-equB-delta)/(2*equA); +// y2=n-x2*m; +// } +// // Cas 2 +// else if(Math.abs(a.x-b.x)>tolerance){ +// // Variables interm\xE9diaires +// double k=(rayonC2*rayonC2-rayonC1*rayonC1-b.x*b.x+a.x*a.x)/(2*(a.x-b.x)); +// double equA=1; +// double equB=2*a.y; +// double equC=k*k-2*a.x*k-rayonC1*rayonC1; +// // Variables de r\xE9solution +// double deltaTmp=equB*equB-4*equA*equC; +// if(deltaTmp<0) +// throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas possible sans violer la contrainte de constance de la longueur du profil.")); +// double delta=Math.sqrt(equB*equB-4*equA*equC); +// y1=(-equB+delta)/(2*equA); +// x1=k; +// y2=(-equB-delta)/(2*equA); +// x2=k; +// } +// // Cas 3 +// else +// throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas valide. Ce cas ne devrait jamais arriver. CSI_1")); +// // Recherche du r\xE9sultat nous interessant dans ce cas ci +// Coordinate aZ0=new Coordinate(a.x, a.y, 0); +// Coordinate bZ0=new Coordinate(b.x, b.y, 0); +// Coordinate cZ0=new Coordinate(c.x, c.y, 0); +// Coordinate vecReference=UtilsProfil1d.vec(cZ0, UtilsProfil1d.proj(cZ0, aZ0, bZ0)); +// Coordinate cProj=UtilsProfil1d.proj(new Coordinate(x1, y1, 0), aZ0, bZ0); +// assert(UtilsProfil1d.egal(cProj, UtilsProfil1d.proj(new Coordinate(x2, y2, 0), aZ0, bZ0), 0.0001, false)); +// if(UtilsProfil1d.egal(vecReference, UtilsProfil1d.vec(new Coordinate(x1, y1, 0), cProj), 0.0001, true)){ +// newX=x1; +// newY=y1; +// } +// else if(UtilsProfil1d.egal(vecReference, UtilsProfil1d.vec(new Coordinate(x2, y2, 0), cProj), 0.0001, true)) { +// newX=x2; +// newY=y2; +// } +// else +// throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement n'est pas valide. Ce cas ne devrait jamais arriver. CSI_2")); +// +// // Verifie que le point trouv\xE9 ne coupe pas un autre axe du profil \\ +// boolean noCut=true; +// Coordinate newP=new Coordinate(newX, newY); +// GISPolyligne axe1=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{a, newP}); +// GISPolyligne axe2=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{newP, b}); +// if(idxPtdeb>0) { +// /* +// * Test de croisement entre les deux axes modifi\xE9s et l'axe avant. l'axe +// * a, newP a normalement un point d'intersectino (a). +// */ +// GISPolyligne axeTest=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{new Coordinate(coords[0]), new Coordinate(coords[idxPtdeb])}); +// noCut=axe1.intersection(axeTest).getNumPoints()==1; +// noCut=noCut&&!axe2.intersects(axeTest); +// } +// if(idxPtFin<seq.size()-1) { +// /* +// * Test de croisement entre les deux axes modifi\xE9s et l'axe avant. l'axe +// * newP, b a normalement un point d'intersectino (b). +// */ +// GISPolyligne axeTest=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{new Coordinate(coords[idxPtFin]), new Coordinate(coords[coords.length-1])}); +// noCut=noCut&&axe2.intersection(axeTest).getNumPoints()==1; +// noCut=noCut&&!axe1.intersects(axeTest); +// } +// // Traitement de l'\xE9ventuelle d\xE9tection d'un croisement +// if(!noCut) +// throw new ProfilContainerException(FudaaLib.getS("Ce d\xE9placement est impossible sans obtenir un profil dont des axes se coupent.")); +// // Enregistrement du nouveau point C' et de la nouvelle valeur curviligne +// coords[_idxPoint]=new Coordinate(newX, newY, coords[_idxPoint].z); +// // Mise a jour de la table des valeurs curvilignes +// curv_.set(_idxPoint, _value); +// +// // R\xE9alignement des points des axes adjacents \\ +// for(int inc=0;inc<2;inc++){ +// // D\xE9termination des points de d\xE9but et de fin d'axe +// int idxDeb; +// int idxFin; +// if(inc==0) { // premi\xE8re it\xE9ration, axe : debut, C' +// idxDeb=_idxPoint==idxRupture1_?0:idxRupture1_; +// idxFin=_idxPoint; +// } +// else { // seconde it\xE9ration, axe : C', fin +// idxDeb=_idxPoint; +// idxFin=_idxPoint==idxRupture2_||idxRupture2_==-1 ? seq.size()-1:idxRupture2_; +// } +// // R\xE9alignement sur l'axe +// if (Math.abs(coords[idxFin].x-coords[idxDeb].x)>tolerance) { +// double sign=Math.signum(coords[idxFin].x-coords[idxDeb].x); +// double newCoefDirecteur=(coords[idxFin].y-coords[idxDeb].y)/(coords[idxFin].x-coords[idxDeb].x); +// for (int i=idxDeb+1; i<idxFin; i++) { +// coords[i]=new Coordinate(0, 0, coords[i].z); +// coords[i].x=coords[idxDeb].x+sign*(curv_.get(i)-curv_.get(idxDeb))/Math.sqrt(1+newCoefDirecteur*newCoefDirecteur); +// coords[i].y=coords[idxDeb].y+newCoefDirecteur*(coords[i].x-coords[idxDeb].x); +// } +// } +// else { // Cas du bout de profil vertical +// double sign=Math.signum(coords[idxFin].y-coords[idxDeb].y); +// for (int i=idxDeb+1; i<idxFin; i++) +// coords[i]=new Coordinate(coords[idxDeb].x, coords[idxDeb].y+sign*(curv_.get(i)-curv_.get(idxDeb)), +// coords[i].z); +// } +// } +// } CtuluCommandComposite cmd=new CtuluCommandComposite("Changement abs. curviligne"); // Enregistrement des nouvelles coordonn\xE9es \\ biefContainer_.getZoneProfils().setCoordinateSequence(idxProfilSelected_, GISGeometryFactory.INSTANCE.getCoordinateSequenceFactory().create(coords), cmd); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 2009-01-30 15:11:50 UTC (rev 4429) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java 2009-01-30 17:09:25 UTC (rev 4430) @@ -112,7 +112,7 @@ if(column==0) return false; else - return true; + return !data_.isRupturePoint(row); } public Class<?> getColumnClass(int columnIndex) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <emm...@us...> - 2009-02-10 10:42:34
|
Revision: 4451 http://fudaa.svn.sourceforge.net/fudaa/?rev=4451&view=rev Author: emmanuel_martin Date: 2009-02-10 10:42:29 +0000 (Tue, 10 Feb 2009) Log Message: ----------- Petite stabilisation Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.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/ProfilContainerAdapter.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-02-10 09:33:45 UTC (rev 4450) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-02-10 10:42:29 UTC (rev 4451) @@ -409,7 +409,7 @@ @Override public void internalFrameActivated(InternalFrameEvent e) { - controllerBief_.removeAllBiefs(); + controllerBief_.removeAllBiefs(false); controllerBief_.updateFrom2d(); } 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-02-10 09:33:45 UTC (rev 4450) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-02-10 10:42:29 UTC (rev 4451) @@ -169,8 +169,17 @@ /** * Supprime les biefs donn\xE9es en param\xE8tre. + * Par defaut avec undoRedo. */ public void removeBief(int[] _idx){ + removeBief(_idx, true); + } + + /** + * Supprime les biefs donn\xE9es en param\xE8tre. + * Si _undoRedo est \xE0 vrai, l'action pourra \xEAtre annul\xE9e. + */ + public void removeBief(int[] _idx, boolean _undoRedo){ Arrays.sort(_idx); CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("Suppression de biefs")); for(int i=_idx.length-1;i>=0;i--) { @@ -178,17 +187,26 @@ biefSelectionModel_.clearSelection(); biefSet_.removeBief(biefSet_.getBiefName(_idx[i]), cmd); } - getCommandManager().addCmd(cmd.getSimplify()); + if(_undoRedo) + getCommandManager().addCmd(cmd.getSimplify()); } /** * Supprime tous les biefs. + * Par defaut avec undoRedo. */ public void removeAllBiefs() { + removeAllBiefs(true); + } + + /** + * Supprime tous les biefs. Si _undoRedo est \xE0 vrai, l'action pourra \xEAtre annul\xE9e. + */ + public void removeAllBiefs(boolean _undoRedo) { int[] idx=new int[biefSet_.getNbBief()]; for(int i=0;i<idx.length;i++) idx[i]=i; - removeBief(idx); + removeBief(idx, _undoRedo); } /** 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-02-10 09:33:45 UTC (rev 4450) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2009-02-10 10:42:29 UTC (rev 4451) @@ -955,7 +955,7 @@ * mettre \xE0 jour (qui correspond \xE9galement \xE0 la g\xE9om\xE9trie modifi\xE9). */ private void updateGeom(int _idxPoint, ZModeleLigneBrisee _model, int _idxGeomVolatile, int _idxAtt) { - if(_idxGeomVolatile==-1||_idxAtt==-1) + if(_idxGeomVolatile==-1||_idxAtt==-1||_model.getNombre()<=_idxGeomVolatile) return; CoordinateSequence seqGeomV=_model.getGeomData().getCoordinateSequence(_idxGeomVolatile); CoordinateSequence seqProf=profilsListen_.getGeomData().getCoordinateSequence(_idxPoint); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-02-10 09:33:45 UTC (rev 4450) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-02-10 10:42:29 UTC (rev 4451) @@ -101,19 +101,11 @@ } /** - * Marge d'acceptation avant de consid\xE9r\xE9 un point comme \xE9tant un point de - * rupture. La valeur est la diff\xE9rence des coefficients directeurs des - * segments avant et apr\xE8s le point. - * En donnant la valeur en radian de l'angle minimal : tolerance_=Math.tan(#ValeurDegr\xE9#) - * Avec #ValeurDegr\xE9# C [0;PI/2[ - * En donnant la valeur en radian de l'angle maximal : tolerance_=Math.tan(Math.PI-#ValeurDegr\xE9#) - * Avec #ValeurDegr\xE9# C ]PI/2;PI] - * En donnant la valeur en degr\xE9 de l'angle minimal : tolerance_=Math.tan(#ValeurDegr\xE9#*Math.PI/2/90) - * Avec #ValeurDegr\xE9# C [0;90[ - * En donnant la valeur en degr\xE9 de l'angle maximal : tolerance_=Math.tan((180-#ValeurDegr\xE9#)*Math.PI/2/90) - * Avec #ValeurDegr\xE9# C ]90;180] + * Marge d'acceptation avant de consid\xE9rer un point comme \xE9tant un point de + * rupture. La valeur est l'angle maximal au dela duquel il sera lin\xE9aris\xE9. + * Il est en radian. */ - static final double tolerance_=Math.tan(89*Math.PI/2/90); + static final double _tolerance=Math.PI-Math.PI/6; /** Le biefContainer contenant le bief contenant les profils utilis\xE9s. */ private BiefContainer biefContainer_; @@ -275,56 +267,17 @@ /// D\xE9termination des points de ruptures. \\\ idxRuptures_.clear(); - double coefDirecteur=0; - // coefDirX : Indique si le coefficient directeur est calcul\xE9 sur les x - // ou sur les y (au d\xE9nominateur). - boolean coefDirX; - // Initialisation : calcul du premier cofficient directeur \\ - int idx=1; - // Calcul du coefficient directeur - if (seq.getX(idx)!=seq.getX(idx-1)) { - // Calcul sur les x - coefDirX=true; - coefDirecteur=(seq.getY(idx)-seq.getY(idx-1))/(seq.getX(idx)-seq.getX(idx-1)); - } - else { - // Calcul sur les y - coefDirX=false; - coefDirecteur=0; - } - // Coeur : Calcul de tous les coefficients directeur et m\xE9morisation des - // ruptures \\ - for (idx=2; idx<seq.size(); idx++) { - double newCoefDirecteur; - boolean newCoefDirX; - // Calcul du coefficient directeur - if (seq.getX(idx)!=seq.getX(idx-1)) { - // Calcul sur les x - newCoefDirX=true; - newCoefDirecteur=(seq.getY(idx)-seq.getY(idx-1))/(seq.getX(idx)-seq.getX(idx-1)); - } - else { - // Calcul sur les y - newCoefDirX=false; - newCoefDirecteur=0; - } - // D\xE9tection des ruptures - if (coefDirX!=newCoefDirX||Math.abs(coefDirecteur-newCoefDirecteur)>tolerance_) - idxRuptures_.add(idx-1); - // Pr\xE9paration de l'it\xE9ration suivante - coefDirecteur=newCoefDirecteur; - coefDirX=newCoefDirX; - } + for (int i=1; i<seq.size()-1; i++) + if(UtilsProfil1d.getAngle(seq.getCoordinate(i-1), seq.getCoordinate(i), seq.getCoordinate(i+1))<_tolerance) + idxRuptures_.add(i); // Lin\xE9arisation du profil - if(idxRuptures_.size()>0) { - int[] idxRuptures=new int[idxRuptures_.size()+2]; - idxRuptures[0]=0; - Iterator<Integer> it=idxRuptures_.iterator(); - for(int i=0;i<idxRuptures_.size();i++) - idxRuptures[i+1]=it.next(); - idxRuptures[idxRuptures.length-1]=seq.size()-1; - LibUtils.linearisePolyligne(biefContainer_.getZoneProfils(), idxProfilSelected_, idxRuptures, null); - } + int[] idxRuptures=new int[idxRuptures_.size()+2]; + idxRuptures[0]=0; + Iterator<Integer> it=idxRuptures_.iterator(); + for (int i=0; i<idxRuptures_.size(); i++) + idxRuptures[i+1]=it.next(); + idxRuptures[idxRuptures.length-1]=seq.size()-1; + LibUtils.linearisePolyligne(biefContainer_.getZoneProfils(), idxProfilSelected_, idxRuptures, null); } catch(ProfilContainerException _exp) { // Remise dans un \xE9tat coh\xE9rent This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bma...@us...> - 2009-02-16 21:23:32
|
Revision: 4477 http://fudaa.svn.sourceforge.net/fudaa/?rev=4477&view=rev Author: bmarchan Date: 2009-02-16 21:23:26 +0000 (Mon, 16 Feb 2009) Log Message: ----------- Modeleur 1D : Correction pour prise en compte d?\195?\169calage Axe hydro. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.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/controller/ControllerProfil.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueTableau.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/OpenBiefPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestion.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionAxeHydraulique.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionBief.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionProfil.java Removed Paths: ------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueImportation.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionAxeHydraulique.java 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/VueModuleGestionProfil.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -32,7 +32,7 @@ import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsBief1d; import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsProfil1d; -import org.fudaa.fudaa.modeleur.modeleur1d.view.VueImportation; +import org.fudaa.fudaa.modeleur.modeleur1d.view.OpenBiefPanel; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; @@ -208,11 +208,19 @@ private void normalizePKData() throws CancelException { GISZoneCollection zone=profils_.getGeomData(); int idxAttCommentaireHydraulique=zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO); - // Vrai si les PK existes. + // Vrai si les PK existent sur tous les profils. boolean attrIsCorrectlyValued=false; // Vrai si les PK existe et correspond \xE0 l'axe hydraulique si il existe. boolean attrMatchWithAxeHydraulique=false; boolean presenceAxeHydraulique=axeHydraulique_.getNombre()>0; + // D\xE9calage du d\xE9but d'abscisse de l'axe + double decalAxe=0.0; + int idxAttDecalAxe=axeHydraulique_.getGeomData().getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE); + if (idxAttDecalAxe!=-1) { + decalAxe=((Double)axeHydraulique_.getGeomData().getValue(idxAttDecalAxe, 0)).doubleValue(); + } + + // L'attribut COMMENTAIRE_HYDRO est pr\xE9sent, test que les valeurs sont concordantes avec l'axe. if (idxAttCommentaireHydraulique!=-1) { attrIsCorrectlyValued=true; if(presenceAxeHydraulique) @@ -222,6 +230,7 @@ // V\xE9rification de la pr\xE9sence des donn\xE9es PK \\ String CommHydrauValue=(String)profils_.getGeomData().getValue(idxAttCommentaireHydraulique, i); attrIsCorrectlyValued=GISLib.isHydroCommentValued(CommHydrauValue, "PK"); + // V\xE9rification de la coh\xE9rence avec l'axe hydraulique \\ if (presenceAxeHydraulique) { double hydraoCommValue=GISLib.getHydroCommentDouble(CommHydrauValue, "PK"); @@ -231,40 +240,45 @@ throw new IllegalArgumentException(FudaaLib .getS("Au moins un des profils coupe plusieurs fois ou jamais l'axe hydraulique.")); attrMatchWithAxeHydraulique=attrIsCorrectlyValued&&attrMatchWithAxeHydraulique - &&Math.abs(hydraoCommValue-absCurvValue)<0.0001; + &&Math.abs(hydraoCommValue-(absCurvValue+decalAxe))<0.0001; } } } - if (idxAttCommentaireHydraulique==-1) - // Ajout de l'attribut COMMENTAIRE_HYDRO - if (idxAttCommentaireHydraulique==-1) { - GISAttributeInterface[] atts=new GISAttributeInterface[zone.getNbAttributes()+1]; - for (int k=0; k<zone.getNbAttributes(); k++) - atts[k]=zone.getAttribute(k); - atts[atts.length-1]=GISAttributeConstants.COMMENTAIRE_HYDRO; - zone.setAttributes(atts, null); - } + + // Ajout de l'attribut COMMENTAIRE_HYDRO + else { + GISAttributeInterface[] atts=new GISAttributeInterface[zone.getNbAttributes()+1]; + for (int k=0; k<zone.getNbAttributes(); k++) + atts[k]=zone.getAttribute(k); + atts[atts.length-1]=GISAttributeConstants.COMMENTAIRE_HYDRO; + zone.setAttributes(atts, null); + } + + // Les PK n'ont pas \xE9t\xE9 correctement \xE9valu\xE9s, valuation a partir de l'axe hydrau s'il existe, 0 + // sinon. if (!attrIsCorrectlyValued) { - // Valuation de l'attribut, a partir de l'axe hydrau si il existe, 0 - // sinon. idxAttCommentaireHydraulique=zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO); for (int k=0; k<zone.getNumGeometries(); k++) { String comm=(String)profils_.getGeomData().getValue(idxAttCommentaireHydraulique, k); - if (!GISLib.isHydroCommentValued(comm, "PK")) + if (!GISLib.isHydroCommentValued(comm, "PK")) { + double pk; if (presenceAxeHydraulique) { // Valuation avec le croisement avec l'axe hydraulique - double abscurv=UtilsProfil1d.abscisseCurviligne(axeHydraulique_.getGeomData().getCoordinateSequence(0), profils_ - .getGeomData().getCoordinateSequence(k)); - zone.setAttributValue(idxAttCommentaireHydraulique, k, GISLib.setHydroCommentDouble(comm, abscurv, "PK"), null); + pk=UtilsProfil1d.abscisseCurviligne(axeHydraulique_.getGeomData().getCoordinateSequence(0), profils_ + .getGeomData().getCoordinateSequence(k))+decalAxe; } - else - // Valuation avec 0 - zone.setAttributValue(idxAttCommentaireHydraulique, k, GISLib.setHydroCommentDouble(comm, 0, "PK"), null); + else { + // Valuation avec le d\xE9calage de l'axe. + pk=decalAxe; + } + zone.setAttributValue(idxAttCommentaireHydraulique, k, GISLib.setHydroCommentDouble(comm, pk, "PK"), null); + } } attrMatchWithAxeHydraulique=true; } + if (!attrMatchWithAxeHydraulique&&presenceAxeHydraulique) { - VueImportation vImport=new VueImportation(); + OpenBiefPanel vImport=new OpenBiefPanel(); if (!vImport.run()) throw new CancelException(FudaaLib.getS("L'importation a \xE9t\xE9 annul\xE9.")); if (vImport.axeHydrauChosen()) { @@ -273,9 +287,9 @@ for (int k=0; k<zone.getNumGeometries(); k++) { String comm=(String)profils_.getGeomData().getValue(idxAttCommentaireHydraulique, k); // Valuation avec le croisement avec l'axe hydraulique - double abscurv=UtilsProfil1d.abscisseCurviligne(axeHydraulique_.getGeomData().getCoordinateSequence(0), profils_ - .getGeomData().getCoordinateSequence(k)); - zone.setAttributValue(idxAttCommentaireHydraulique, k, GISLib.setHydroCommentDouble(comm, abscurv, "PK"), null); + double pk=UtilsProfil1d.abscisseCurviligne(axeHydraulique_.getGeomData().getCoordinateSequence(0), profils_ + .getGeomData().getCoordinateSequence(k))+decalAxe; + zone.setAttributValue(idxAttCommentaireHydraulique, k, GISLib.setHydroCommentDouble(comm, pk, "PK"), null); } } else { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -50,10 +50,10 @@ import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsProfil1d; import org.fudaa.fudaa.modeleur.modeleur1d.view.VueBief; -import org.fudaa.fudaa.modeleur.modeleur1d.view.VueContainerModules; +import org.fudaa.fudaa.modeleur.modeleur1d.view.PnGestion; import org.fudaa.fudaa.modeleur.modeleur1d.view.VueCourbe; -import org.fudaa.fudaa.modeleur.modeleur1d.view.VueExport; -import org.fudaa.fudaa.modeleur.modeleur1d.view.VueModuleGestionAxeHydraulique; +import org.fudaa.fudaa.modeleur.modeleur1d.view.ExportPanel; +import org.fudaa.fudaa.modeleur.modeleur1d.view.PnGestionAxeHydraulique; import org.fudaa.fudaa.modeleur.modeleur1d.view.VueTableau; import com.memoire.bu.BuDesktop; @@ -82,7 +82,7 @@ /** Un label pour afficher les erreurs. */ private BuLabel vueError_=new BuLabel(); /** La vue des modules contenu dans la colonne \xE0 droite. */ - private VueContainerModules vueContainerModules_; + private PnGestion vueContainerModules_; /** La frame contenant tous les widgets 1d. */ private MdlFille1d frame1d_; @@ -122,9 +122,9 @@ controllerProfil_=new ControllerProfil(controllerBief_.getBiefSelectionModel(), controllerBief_.getBiefContainer(), this); // Instanciation des Vues \\ // Modules - vueContainerModules_=new VueContainerModules(modelContainerModules_); + vueContainerModules_=new PnGestion(modelContainerModules_); addVueModule(controllerBief_.getVueModuleGestionBief()); - addVueModule(new VueModuleGestionAxeHydraulique(controllerBief_)); + addVueModule(new PnGestionAxeHydraulique(controllerBief_)); addVueModule(controllerProfil_.getVueModuleGestionProfil()); // Vue Bief controllerBief_.getVueBief().getScene().addSelectionListener(this); @@ -193,7 +193,7 @@ public JComponent getVueError(){ return vueError_; } - public VueContainerModules getVueContainerModules(){ + public PnGestion getVueContainerModules(){ return vueContainerModules_; } @@ -362,7 +362,7 @@ // Gestion de l'export \\ public void export(){ - VueExport vueExport=new VueExport(appli_); + ExportPanel vueExport=new ExportPanel(appli_); if(!vueExport.run()) return; // Configuration du mascaretWriter 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-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -23,6 +23,7 @@ import org.fudaa.ctulu.gis.GISLib; import org.fudaa.ctulu.gis.GISPolyligne; import org.fudaa.ctulu.gis.GISZoneCollection; +import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.ebli.calque.BCalque; import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; import org.fudaa.fudaa.commun.FudaaLib; @@ -34,7 +35,7 @@ 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.modeleur.modeleur1d.view.PnGestionBief; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; @@ -57,7 +58,7 @@ /** Le model de selection des biefs. */ protected BiefSelectionModel biefSelectionModel_; /** La vue du module de gestion des biefs. */ - protected VueModuleGestionBief vueModuleGestionBief_; + protected PnGestionBief vueModuleGestionBief_; /** La vue sur les biefs. */ protected VueBief vueBief_; @@ -65,7 +66,7 @@ controller1d_=_controller1d; biefContainerAdapter_=new BiefContainerAdapter(biefSet_); biefSelectionModel_=new BiefSelectionModel(); - vueModuleGestionBief_=new VueModuleGestionBief(this); + vueModuleGestionBief_=new PnGestionBief(this); vueBief_=new VueBief(controller1d_.getImplementation(), this); } @@ -91,6 +92,36 @@ } /** + * Decale les abscisses des profils du bief en fonction de l'abscisse donn\xE9 pour le d\xE9but de l'axe hydraulique + */ + public void setDebutAbscisseAxe(double _abs) { + if (!getBiefContainer().hasAxeHydraulique()) return; + double decal=_abs-getBiefContainer().getDecalageAxeHydraulique(); + if (decal==0) return; + + CtuluCommandComposite cmp=new CtuluCommandComposite("Modifier abscisse curviligne de l'axe"); + + // Changement de l'attribut PK sur axe. + GISZoneCollection zaxe=getBiefContainer().getZoneAxeHydraulique(); + if (zaxe.getNumGeometries()>0) { + int idxAttr=zaxe.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE); + zaxe.setAttributValue(idxAttr, 0, _abs, cmp); + } + + // D\xE9calage des profils + GISZoneCollectionLigneBrisee zone=getBiefContainer().getZoneProfils(); + for (int i=0; i<zone.getNbGeometries(); i++) { + String value=(String)zone.getValue(zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), i); + double oldval=GISLib.getHydroCommentDouble(value, "PK"); + String s=GISLib.setHydroCommentDouble(value, oldval+decal, "PK"); + zone.setAttributValue(zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), i, s, cmp); + } + + if (getCommandManager()!=null) + getCommandManager().addCmd(cmp.getSimplify()); + } + + /** * R\xE9ordonne les profils du bief selectionn\xE9. retourne le nouvel indice de * l'indice pass\xE9 en param\xE8tre (-1 si inutilis\xE9). */ @@ -135,7 +166,7 @@ /** * Retourne la vue du module de gestion des biefs. */ - public VueModuleGestionBief getVueModuleGestionBief(){ + public PnGestionBief getVueModuleGestionBief(){ return vueModuleGestionBief_; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerProfil.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerProfil.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerProfil.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -17,7 +17,7 @@ import org.fudaa.fudaa.modeleur.modeleur1d.model.ProfilContainer; import org.fudaa.fudaa.modeleur.modeleur1d.model.ProfilContainerAdapter; import org.fudaa.fudaa.modeleur.modeleur1d.model.ProfilContainerException; -import org.fudaa.fudaa.modeleur.modeleur1d.view.VueModuleGestionProfil; +import org.fudaa.fudaa.modeleur.modeleur1d.view.PnGestionProfil; /** * Controller permettant de g\xE9rer (cr\xE9er, modifier, supprimer, selectionner) les profils. @@ -35,14 +35,14 @@ /** le conteneur du bief. */ private BiefContainer biefContainer_; /** La vue du module de gestion des profils. */ - protected VueModuleGestionProfil vueModuleGestionProfil_; + protected PnGestionProfil vueModuleGestionProfil_; public ControllerProfil(BiefSelectionModel _biefSelectionModel, BiefContainer _biefContainer, Controller1d _controller1d){ controller1d_=_controller1d; biefContainer_=_biefContainer; profilSelectionModel_=new ProfilSelectionModel(_biefSelectionModel); profilContainerAdapter_=new ProfilContainerAdapter(biefContainer_); - vueModuleGestionProfil_=new VueModuleGestionProfil(this); + vueModuleGestionProfil_=new PnGestionProfil(this); } public ProfilContainer getProfilContainer(){ @@ -67,7 +67,7 @@ /** * Retourne la vue du module de gestion des profils. */ - public VueModuleGestionProfil getVueModuleGestionProfil(){ + public PnGestionProfil getVueModuleGestionProfil(){ return vueModuleGestionProfil_; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainer.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -22,6 +22,12 @@ /** Retourne vrai si l'index pass\xE9 en param\xE8tre correspond \xE0 un profil. */ public boolean hasProfil(int _idxProfil); + /** Retourne vrai si un axe hydraulique existe */ + public boolean hasAxeHydraulique(); + + /** Retourne la valeur de d\xE9calage de l'axe hydraulique. */ + public double getDecalageAxeHydraulique(); + /** Ajout d'un nouveau listener. */ public void addBiefContainerListener(BiefContainerListener _listener); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/BiefContainerAdapter.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -15,6 +15,7 @@ import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; import org.fudaa.fudaa.commun.FudaaLib; @@ -46,6 +47,17 @@ return false; } + public boolean hasAxeHydraulique() { + GISZoneCollectionLigneBrisee zone=getZoneAxeHydraulique(); + return zone!=null && zone.getNbGeometries()>0; + } + + public double getDecalageAxeHydraulique() { + GISZoneCollection zone=getZoneAxeHydraulique(); + int idxAttr=zone.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE); + return ((Double)zone.getValue(idxAttr, 0)).doubleValue(); + } + /** * Selectionner un des biefs. Pour n'en selectionner aucun, _nomBief doit * valloir null. Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainer.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -80,18 +80,20 @@ /** Supprime le point indiqu\xE9 en param\xE8tre. */ public void remove(int _idxPoint, CtuluCommandContainer _cmd) throws ProfilContainerException; - /** Retourne l'abscisse curviligne du profil sur l'axe hydraulique. -1 si inexistant. */ + /** + * Retourne le PK du profil sur l'axe. Correspond a l'abscisse curviligne + d\xE9calage de d\xE9but de l'axe. + */ public double getAbsCurvProfilOnAxeHydraulique(); /** - * Met l'abscisse curviligne du profil sur l'axe hydraulique \xE0 _value. + * D\xE9place le profil sur l'axe, en fonction d'un abscisse curviligne donn\xE9. * Retourne vrai il est n\xE9c\xE9ssaire d'effectuer une r\xE9ordonnancement des * profils sur l'axe hydraulique. - * _value ne peut \xEAtre ni n\xE9gatif ni sup\xE9rieur \xE0 l'abscisse curviligne total + * @param _pk Le PK du profil. Ne peut \xEAtre ni n\xE9gatif ni sup\xE9rieur \xE0 l'abscisse curviligne total * de l'axe, dans ces cas une exception de type * {@link IllegalArgumentException} est lev\xE9e. */ - public boolean setAbsCurvProfilOnAxeHydraulique(double _value, CtuluCommandContainer _cmd) throws ProfilContainerException; + public boolean moveProfilOnAxeHydraulique(double _pk, CtuluCommandContainer _cmd) throws ProfilContainerException; /** Place l'intersection du profil avec la limite de stockage gauche \xE0 l'index _idx. */ public void setLimiteGauche(int _idx, CtuluCommandContainer _cmd); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -380,6 +380,19 @@ return GISLib.getHydroCommentDouble(value, "PK"); } + /** + * Definit le PK du profil sur l'axe. + */ + public void setAbsCurvProfilOnAxeHydraulique(double _abs, CtuluCommandContainer _cmd) { + if (idxProfilSelected_==-1) + return; + GISZoneCollection zone=biefContainer_.getZoneProfils(); + String value=(String)zone.getValue(zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), idxProfilSelected_); + String s=GISLib.setHydroCommentDouble(value, _abs, "PK"); + zone.setAttributValue(zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), idxProfilSelected_, s, _cmd); + fireProfilContainerDataModified(); + } + public int getNbLignesDirectrices() { if (idxProfilSelected_==-1) return 0; @@ -568,15 +581,15 @@ fireProfilContainerDataModified(); } - public boolean setAbsCurvProfilOnAxeHydraulique(double _value, CtuluCommandContainer _cmd) throws ProfilContainerException { - _value=_value-curviligneDecalage_; - CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("D\xE9placement d'un profil")); + public boolean moveProfilOnAxeHydraulique(double _pk, CtuluCommandContainer _cmd) throws ProfilContainerException { + double absZeroDecal=_pk-curviligneDecalage_; + CtuluCommandComposite cmp=new CtuluCommandComposite(); // Cas si un axe hydraulique existe \\ if (biefContainer_.getZoneAxeHydraulique().getNumGeometries()>0) { CoordinateSequence axeHydrau=((GISCoordinateSequenceContainerInterface)biefContainer_.getZoneAxeHydraulique().getGeometry(0)) .getCoordinateSequence(); Geometry geomAxeHydrau=biefContainer_.getZoneAxeHydraulique().getGeometry(0); - if (_value<0||_value>UtilsProfil1d.abscisseCurviligne(axeHydrau, axeHydrau.getCoordinate(axeHydrau.size()-1))) + if (absZeroDecal<0||absZeroDecal>UtilsProfil1d.abscisseCurviligne(axeHydrau, axeHydrau.getCoordinate(axeHydrau.size()-1))) throw new IllegalArgumentException(FudaaLib.getS("L'abscisse curviligne doit \xEAtre entre "+curviligneDecalage_+" et " +(UtilsProfil1d.abscisseCurviligne(axeHydrau, axeHydrau.getCoordinate(axeHydrau.size()-1))+curviligneDecalage_) +" inclus.")); @@ -588,19 +601,19 @@ // Point de croisement actuel entre l'axe et le profil Coordinate oldCoordCroisement=intersection.getCoordinate(); double oldAbscisseCurviligne=UtilsProfil1d.abscisseCurviligne(axeHydrau, oldCoordCroisement); - if (!UtilsProfil1d.egal(_value, oldAbscisseCurviligne)) { + if (!UtilsProfil1d.egal(absZeroDecal, oldAbscisseCurviligne)) { // Cr\xE9ation d'une selection contenant la g\xE9om\xE9trie \xE0 modifier BitSet bs=new BitSet(biefContainer_.getZoneProfils().getNbGeometries()); bs.set(idxProfilSelected_); CtuluListSelection selection=new CtuluListSelection(bs); // Calcul du future point de croisement entre l'axe et le profil - Coordinate newCoordCroisement=UtilsProfil1d.getCoordinateXY(axeHydrau, _value); + Coordinate newCoordCroisement=UtilsProfil1d.getCoordinateXY(axeHydrau, absZeroDecal); // Application de la translation Coordinate move=UtilsProfil1d.vec(oldCoordCroisement, newCoordCroisement); // R\xE9duction de la pr\xE9cision pour \xE9viter les probl\xE8mes d'arrondis move.x=((double) ((long) (move.x*10000.)))/10000; move.y=((double) ((long) (move.y*10000.)))/10000; - biefContainer_.getModelProfils().moveGlobal(selection, move.x, move.y, 0, cmd); + biefContainer_.getModelProfils().moveGlobal(selection, move.x, move.y, 0, cmp); // Somme de tous les angles de l'axe entre les deux points de // translation int oldNextIdx=UtilsProfil1d.getNextIndex(axeHydrau, oldCoordCroisement); @@ -619,37 +632,36 @@ -UtilsProfil1d.getAngle(axeHydrau.getCoordinate(i), axeHydrau.getCoordinate(i+1), axeHydrau.getCoordinate(i+2)); // Application de la rotation biefContainer_.getModelProfils() - .rotateGlobal(selection, newAngle-oldAngle, newCoordCroisement.x, newCoordCroisement.y, cmd); + .rotateGlobal(selection, newAngle-oldAngle, newCoordCroisement.x, newCoordCroisement.y, cmp); // Verifie que le profil ne coupe pas deux fois l'axe hydraulique Geometry intersect=geomAxeHydrau.intersection(biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)); if (intersect.getNumPoints()!=1) { - cmd.undo(); // Annulation des modifications + cmp.undo(); // Annulation des modifications throw new ProfilContainerException(FudaaLib.getS("Le profil couperait l'axe hydraulique en au moins deux endroits.")); } } } // Modification bas\xE9e sur l'attribut commentaire hydraulique. \\ + setAbsCurvProfilOnAxeHydraulique(_pk, cmp); GISZoneCollection zone=biefContainer_.getZoneProfils(); int idxAttrComm=zone.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO); - String comm=(String)zone.getValue(idxAttrComm, idxProfilSelected_); - zone.setAttributValue(idxAttrComm, idxProfilSelected_, GISLib.setHydroCommentDouble(comm, _value, "PK"), cmd); // Gestion de l'undo/redo if (_cmd!=null) - _cmd.addCmd(cmd.getSimplify()); + _cmd.addCmd(cmp.getSimplify()); // Retourne vrai si il faut r\xE9ordonnancer les profils if (zone.getNumGeometries()==1) return false; if (idxProfilSelected_==0) { - if (GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, 1), "PK")<_value) + if (GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, 1), "PK")<_pk) return true; } else if (idxProfilSelected_<zone.getNumGeometries()-1) { - if (GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, idxProfilSelected_-1), "PK")>_value - ||GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, idxProfilSelected_+1), "PK")<_value) + if (GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, idxProfilSelected_-1), "PK")>_pk + ||GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, idxProfilSelected_+1), "PK")<_pk) return true; } else if (idxProfilSelected_==zone.getNumGeometries()-1) - if (GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, idxProfilSelected_-1), "PK")>_value) + if (GISLib.getHydroCommentDouble((String)zone.getValue(idxAttrComm, idxProfilSelected_-1), "PK")>_pk) return true; return false; } Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java (from rev 4476, branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java) =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/ExportPanel.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -0,0 +1,140 @@ +/* + * @creation 18 d\xE9c. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.fudaa.modeleur.modeleur1d.view; + +import java.awt.BorderLayout; +import java.io.File; + +import javax.swing.ButtonGroup; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import org.fudaa.ctulu.CtuluLib; +import org.fudaa.ctulu.CtuluLibFile; +import org.fudaa.ctulu.CtuluUI; +import org.fudaa.ctulu.gui.CtuluDialogPanel; +import org.fudaa.ctulu.gui.CtuluFileChooserPanel; +import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.sig.FSigLib; +import org.fudaa.fudaa.tr.common.TrResource; + +import com.memoire.bu.BuFileFilter; +import com.memoire.bu.BuLabel; +import com.memoire.bu.BuRadioButton; +import com.memoire.bu.BuVerticalLayout; + +/** + * GUI de l'exporteur des donn\xE9es 1d. Il se contente de faire apparaitre une + * fen\xEAtre modale (via la m\xE9thode 'run') puis met \xE0 disposition les + * informations. Il ne fait aucun traitement par lui m\xEAme. + * + * @author Emmanuel MARTIN + * @version $Id$ + */ +public class ExportPanel extends CtuluDialogPanel { + + private CtuluFileChooserPanel fileChooser_; + private BuRadioButton mascaret1d_; + private BuRadioButton mascaret2d_; + private CtuluUI ui_; + private BuFileFilter filtre1d_; + private BuFileFilter filtre2d_; + + public ExportPanel(CtuluUI _ui) { + ui_=_ui; + filtre1d_=new BuFileFilter("geo", FSigLib.getS("Fichier Mascaret 1d")); + filtre2d_=new BuFileFilter("georef", FSigLib.getS("Fichier Mascaret 2d")); + + setLayout(new BuVerticalLayout(5, true, true)); + final String title=FSigLib.getS("Fichier d'exportation"); + fileChooser_=new CtuluFileChooserPanel(title); + fileChooser_.setAllFileFilter(false); + fileChooser_.setWriteMode(true); + fileChooser_.setFilter(new BuFileFilter[]{filtre1d_, filtre2d_}); + fileChooser_.getTf().getDocument().addDocumentListener(new DocumentListener(){ + private void updateRb() { + // Selection automatique du checkbox correspondant \xE0 l'extension + String name=fileChooser_.getTf().getText(); + if(filtre1d_.accept(name)) + mascaret1d_.setSelected(true); + else if(filtre2d_.accept(name)) + mascaret2d_.setSelected(true); + } + public void changedUpdate(DocumentEvent e) {updateRb();} + public void insertUpdate(DocumentEvent e) {updateRb();} + public void removeUpdate(DocumentEvent e) {updateRb();} + }); + + BuLabel lbFile=new BuLabel(title); + JPanel pnFile=new JPanel(); + pnFile.setLayout(new BorderLayout(3, 3)); + pnFile.add(lbFile, BorderLayout.WEST); + pnFile.add(fileChooser_, BorderLayout.CENTER); + add(pnFile); + + mascaret1d_=new BuRadioButton("Mascaret 1d"); + add(mascaret1d_); + mascaret2d_=new BuRadioButton("Mascaret 2d"); + add(mascaret2d_); + ButtonGroup bgLayers=new ButtonGroup(); + bgLayers.add(mascaret1d_); + bgLayers.add(mascaret2d_); + mascaret2d_.doClick(); + } + + /** + * 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("Exporter les donn\xE9es de la fen\xEAtre active"))); + } + + public boolean valide() { + if (!isFileOK()) + return false; + return true; + } + + private boolean isFileOK() { + final File f=fileChooser_.getFile(); + if (f==null) { + setErrorText(CtuluLib.getS("Donnez un nom au fichier d'exportation")); + return false; + } + // Verification de l'extension + if(!filtre1d_.accept(f)&&!filtre2d_.accept(f)) { + setErrorText(TrResource.getS("Le fichier choisi a une extension inconnue")); + return false; + } + // Verification de l'\xE9crasement + if(f.exists()&&!ui_.question(CtuluLib.getS("Attention"), CtuluLib.getS("Le fichier {0} existe d\xE9j\xE0. Voulez-vous l'\xE9craser?", CtuluLibFile.getSansExtension(f.getName())))) + return false; + if (CtuluLibFile.getExtension(CtuluLibFile.getSansExtension(f.getName()))!=null) { + setErrorText(CtuluLib.getS("Ne mettez pas plusieurs '.' dans le nom.")); + return false; + } + setErrorText(null); + return true; + } + + public File getFile() { + return fileChooser_.getFile(); + } + + public boolean isMascaret1d() { + return mascaret1d_.isSelected(); + } + + public boolean isMascaret2d() { + return mascaret2d_.isSelected(); + } +} Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/OpenBiefPanel.java (from rev 4476, branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueImportation.java) =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/OpenBiefPanel.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/OpenBiefPanel.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -0,0 +1,69 @@ +/* + * @creation 12 f\xE9vr. 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 javax.swing.ButtonGroup; +import javax.swing.SwingUtilities; + +import org.fudaa.ctulu.gui.CtuluDialogPanel; +import org.fudaa.fudaa.commun.FudaaLib; + +import com.memoire.bu.BuLabel; +import com.memoire.bu.BuRadioButton; +import com.memoire.bu.BuVerticalLayout; + +/** + * GUI de l'importeur de donn\xE9es. Il se contente de faire apparaitre une fen\xEAtre + * modale (via la m\xE9thode 'run') puis met \xE0 disposition les informations. Il ne + * fait aucun traitement par lui m\xEAme. + * + * @author Emmanuel MARTIN + * @version $Id$ + */ +public class OpenBiefPanel extends CtuluDialogPanel { + + private BuRadioButton rbtAxeHydrau_; + + public OpenBiefPanel() { + setLayout(new BuVerticalLayout(2, true, true)); + add(new BuLabel(FudaaLib + .getS("<html>Un axe hydraulique et des informations de type 'PK' sont disponibles et incompatibles " + +"entre elles.<br> Lequelles doivent \xEAtre choisies ?<br> Les informations non selectionn\xE9es seront d\xE9truites."))); + rbtAxeHydrau_=new BuRadioButton(FudaaLib.getS("Axe hydraulique")); + rbtAxeHydrau_.setSelected(true); + BuRadioButton rbtPK=new BuRadioButton(FudaaLib.getS("Information 'PK'")); + ButtonGroup group=new ButtonGroup(); + group.add(rbtAxeHydrau_); + group.add(rbtPK); + rbtAxeHydrau_.setHorizontalAlignment(SwingUtilities.CENTER); + rbtPK.setHorizontalAlignment(SwingUtilities.CENTER); + add(rbtAxeHydrau_); + add(rbtPK); + } + + /** + * 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("Importation de donn\xE9es."))); + } + + public boolean valide() { + return true; + } + + /** + * Retourne vrai si l'utilisateur \xE0 choisie l'axe hydraulique. + */ + public boolean axeHydrauChosen() { + return rbtAxeHydrau_.isSelected(); + } +} Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestion.java (from rev 4476, branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java) =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestion.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestion.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -0,0 +1,65 @@ +/* + * @creation 18 d\xE9c. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.fudaa.modeleur.modeleur1d.view; + +import java.awt.Container; + +import javax.swing.JComponent; +import javax.swing.ListModel; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; + +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuVerticalLayout; + +/** + * @author Emmanuel MARTIN + * @version $Id$ + */ +public class PnGestion extends JComponent implements ListDataListener { + + /** le model */ + private ListModel model_; + /** Container contenant la visualisation des modules. */ + private Container container_; + + public PnGestion(ListModel _model){ + model_=_model; + setLayout(new BuBorderLayout()); + container_=new Container(); + container_.setLayout(new BuVerticalLayout()); + add(container_, BuBorderLayout.CENTER); + model_.addListDataListener(this); + updateBox(); + } + + /** + * R\xE9g\xE9n\xE8re le contenu de la box. + */ + protected void updateBox(){ + container_.removeAll(); + for(int i=0;i<model_.getSize();i++) + if(model_.getElementAt(i) instanceof JComponent) + container_.add((JComponent) model_.getElementAt(i)); + } + + public void contentsChanged(ListDataEvent e) { + // TODO quelque chose de plus 'fin' + updateBox(); + } + + public void intervalAdded(ListDataEvent e) { + // TODO quelque chose de plus 'fin' + updateBox(); + } + + public void intervalRemoved(ListDataEvent e) { + // TODO quelque chose de plus 'fin' + updateBox(); + } +} Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionAxeHydraulique.java (from rev 4476, branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionAxeHydraulique.java) =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionAxeHydraulique.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionAxeHydraulique.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -0,0 +1,95 @@ +/* + * @creation 19 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.event.ActionEvent; +import java.awt.event.ActionListener; + +import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerBief; +import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefContainer; +import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefContainerListener; + +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; + +/** + * Un panneau permettant de modifier les propri\xE9t\xE9s de l'axe hydraulique. + * @author Emmanuel MARTIN + * @version $Id$ + */ +public class PnGestionAxeHydraulique extends BuPanel{ + + /** Le controller des biefs. */ + protected ControllerBief controllerBief_; + /** D\xE9calage curviligne */ + protected BuTextField tfDecalageCurviligne_; + /** Label d\xE9calage abscisse curviligne */ + protected BuLabel lbDecalageCurviligne_; + + public PnGestionAxeHydraulique(ControllerBief _controllerBief){ + controllerBief_=_controllerBief; + setLayout(new BuBorderLayout()); + // Mise \xE0 jour lors du changement de bief selectionn\xE9 + controllerBief_.getBiefContainer().addBiefContainerListener(new BiefContainerListener() { + public void biefSelectedChanged(String name) { + biefHasChanged(); + } + public void biefSelectedRenamed(String name, String name2) {} + public void profilAdded(int profil) {} + public void profilRemoved(int profil) {} + public void profilRenamed(int profil, String name, String name2) {} + }); + // Titre + BuLabel lblTitre=new BuLabel("<html><b>"+FudaaLib.getS("Axe hydraulique")+"</b></html>"); + lblTitre.setHorizontalAlignment(BuLabel.CENTER); + add(lblTitre, BuBorderLayout.NORTH); + // Body \\ + Container body=new Container(); + body.setLayout(new BuGridLayout(2, 2, 2)); + // D\xE9calage curviligne + body.add(lbDecalageCurviligne_=new BuLabel(FudaaLib.getS("D\xE9calage abscisse: "))); + tfDecalageCurviligne_=new BuTextField(); + tfDecalageCurviligne_.setCharValidator(BuCharValidator.DOUBLE); + tfDecalageCurviligne_.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + try { + double oldvalue=controllerBief_.getBiefContainer().getDecalageAxeHydraulique(); + double newvalue=Double.parseDouble(tfDecalageCurviligne_.getText()); + if (oldvalue!=newvalue) + controllerBief_.setDebutAbscisseAxe(newvalue); + } + catch(NumberFormatException _ex) {} + } + }); + body.add(tfDecalageCurviligne_); + add(body, BuBorderLayout.CENTER); + } + + /** + * Met a jour le panneau en fonction du bief selectionn\xE9. + */ + private void biefHasChanged() { + BiefContainer bief=controllerBief_.getBiefContainer(); + if (bief.hasAxeHydraulique()) { + lbDecalageCurviligne_.setEnabled(true); + tfDecalageCurviligne_.setEnabled(true); + tfDecalageCurviligne_.setText(Double.toString(bief.getDecalageAxeHydraulique())); + } + else { + lbDecalageCurviligne_.setEnabled(false); + tfDecalageCurviligne_.setEnabled(false); + tfDecalageCurviligne_.setText(""); + } + } +} Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionBief.java (from rev 4476, 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/PnGestionBief.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionBief.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -0,0 +1,189 @@ +/* + * @creation 18 d\xE9c. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.fudaa.modeleur.modeleur1d.view; + +import java.awt.Container; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableModel; + +import org.fudaa.ctulu.gui.CtuluTable; +import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerBief; +import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSet; +import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefSetListener; + +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuButton; +import com.memoire.bu.BuGridLayout; +import com.memoire.bu.BuLabel; +import com.memoire.bu.BuPanel; + +/** + * Un panneau permettant de g\xE9rer les biefs. + * @author Emmanuel MARTIN + * @version $Id$ + */ +public class PnGestionBief extends BuPanel { + + /** Le controller des biefs. */ + protected ControllerBief controllerBief_; + /** Tableau d'affichage des biefs. */ + protected JTable tableBiefs_; + /** Bouton d'ouverture d'un bief. */ + protected BuButton btOuvrir_; + /** bouton de fusion de bief. */ + protected BuButton btFusionner_; + + public PnGestionBief(ControllerBief _controllerBief){ + controllerBief_=_controllerBief; + setLayout(new BuBorderLayout()); + // Titre + BuLabel lblTitre=new BuLabel("<html><b>"+FudaaLib.getS("Bief")+"</b></html>"); + lblTitre.setHorizontalAlignment(BuLabel.CENTER); + add(lblTitre, BuBorderLayout.NORTH); + // Body \\ + Container body=new Container(); + body.setLayout(new BuBorderLayout(2, 2)); + add(body, BuBorderLayout.CENTER); + // Tableau de noms + tableBiefs_=new CtuluTable(new TableBiefModel()); + body.add(new JScrollPane(tableBiefs_), BuBorderLayout.CENTER); + // Boutons \\ + // Ouvrir + Container btContainer=new Container(); + btContainer.setLayout(new BuGridLayout(1, 5, 5)); + btOuvrir_=new BuButton(FudaaLib.getS("Ouvrir")); + btOuvrir_.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + controllerBief_.getBiefSelectionModel().setSelectedBief(tableBiefs_.getSelectionModel().getMinSelectionIndex()); + } + }); + tableBiefs_.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + ListSelectionModel sel=tableBiefs_.getSelectionModel(); + if(sel.getMaxSelectionIndex()!=sel.getMinSelectionIndex()||sel.getMaxSelectionIndex()==-1) + btOuvrir_.setEnabled(false); + else + btOuvrir_.setEnabled(true); + } + }); + btOuvrir_.setEnabled(false); + btContainer.add(btOuvrir_); + // Supprimer + JButton btSupprimer=new BuButton(FudaaLib.getS("supprimer")); + btSupprimer.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + // R\xE9cup\xE9ration des biefs selectionn\xE9s + List<Integer> idxSupp=new ArrayList<Integer>(); + for(int i=tableBiefs_.getModel().getRowCount()-1;i>=0;i--) + if(tableBiefs_.getSelectionModel().isSelectedIndex(i)) + idxSupp.add(i); + int[] idx=new int[idxSupp.size()]; + for(int i=0;i<idx.length;i++) + idx[i]=idxSupp.get(i); + // Suppression des biefs + controllerBief_.removeBief(idx); + } + }); + btContainer.add(btSupprimer); + // Fusionner + btFusionner_=new BuButton(FudaaLib.getS("Fusionner")); + btFusionner_.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + ListSelectionModel sel=tableBiefs_.getSelectionModel(); + controllerBief_.fusionnerBiefs(sel.getMinSelectionIndex(), sel.getMaxSelectionIndex()); + } + }); + tableBiefs_.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + int nbSel=0; + for(int i=tableBiefs_.getModel().getRowCount();i>=0;i--) + if(tableBiefs_.getSelectionModel().isSelectedIndex(i)) + nbSel++; + if(nbSel!=2) + btFusionner_.setEnabled(false); + else + btFusionner_.setEnabled(true); + } + }); + btFusionner_.setEnabled(false); + btContainer.add(btFusionner_); + // Dupliquer + JButton btDupliquer=new BuButton(FudaaLib.getS("Dupliquer")); + btDupliquer.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + controllerBief_.dupliquerSelectedBief(); + } + }); + btDupliquer.setEnabled(false); + btContainer.add(btDupliquer); + body.add(btContainer, BuBorderLayout.EAST); + body.setPreferredSize(body.getMinimumSize()); + } + + /** + * Surcharge du model du tableau pour prendre les informations directement dans le BiefSet. + */ + private class TableBiefModel extends DefaultTableModel implements BiefSetListener { + + /** Raccourcis vers le biefSet. */ + private BiefSet biefSet_; + + public TableBiefModel() { + super(new String[]{FudaaLib.getS("Nom")}, 0); + biefSet_=controllerBief_.getBiefSet(); + biefSet_.addBiefSetListener(this); + } + + public Class<?> getColumnClass(int columnIndex) { + return String.class; + } + + public int getRowCount() { + if(biefSet_==null) + return 0; + return biefSet_.getNbBief(); + } + + public Object getValueAt(int rowIndex, int columnIndex) { + return biefSet_.getBiefName(rowIndex); + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return true; + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) { + if(!getValueAt(rowIndex, columnIndex).equals(value)) + controllerBief_.renameBief((String) getValueAt(rowIndex, columnIndex), (String) value); + } + + public void addedBief(String name) { + fireTableDataChanged(); + } + + public void removedBief(String name) { + fireTableDataChanged(); + } + + public void renamedBief(String name, String name2) { + fireTableDataChanged(); + } + + } +} Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionProfil.java (from rev 4476, branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueModuleGestionProfil.java) =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionProfil.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/PnGestionProfil.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -0,0 +1,156 @@ +/* + * @creation 18 d\xE9c. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.fudaa.modeleur.modeleur1d.view; + +import java.awt.Container; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.event.ListSelectionEvent; +import javax.swing.table.DefaultTableModel; + +import org.fudaa.ctulu.gui.CtuluTable; +import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerProfil; +import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefContainer; +import org.fudaa.fudaa.modeleur.modeleur1d.model.BiefContainerListener; + +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuButton; +import com.memoire.bu.BuGridLayout; +import com.memoire.bu.BuLabel; + +/** + * Un panneau permettant de g\xE9rer les profils. + * @author Emmanuel MARTIN + * @version $Id$ + */ +public class PnGestionProfil extends JPanel { + + /** Le controller des profils. */ + protected ControllerProfil controllerProfil_; + /** Tableau d'affichage des biefs. */ + protected JTable tableProfils_; + + public PnGestionProfil(ControllerProfil _controllerProfil){ + controllerProfil_=_controllerProfil; + setLayout(new BuBorderLayout()); + // Titre + BuLabel lblTitre=new BuLabel("<html><b>"+FudaaLib.getS("Profil")+"</b></html>"); + lblTitre.setHorizontalAlignment(BuLabel.CENTER); + add(lblTitre, BuBorderLayout.NORTH); + // Body \\ + Container body=new Container(); + body.setLayout(new BuBorderLayout(2, 2)); + add(body, BuBorderLayout.CENTER); + // Tableau de noms + tableProfils_=new CtuluTable(new TableProfilModel()) { + /* (non-Javadoc) + * @see javax.swing.JTable#valueChanged(javax.swing.event.ListSelectionEvent) + */ + @Override + public void valueChanged(ListSelectionEvent e) { + super.valueChanged(e); + scrollRectToVisible(getCellRect(getSelectionModel().getMaxSelectionIndex(), 0, false)); + } + }; + tableProfils_.setSelectionModel(controllerProfil_.getProfilSelectionModel()); + body.add(new JScrollPane(tableProfils_), BuBorderLayout.CENTER); + // Boutons + Container btContainer=new Container(); + btContainer.setLayout(new BuGridLayout(1, 5, 5)); + JButton btAjout=new BuButton(FudaaLib.getS("Ajout")); + btAjout.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + controllerProfil_.ajoutProfil(); + } + }); + btAjout.setEnabled(false); + btContainer.add(btAjout); + JButton btSupprimer=new BuButton(FudaaLib.getS("supprimer")); + btSupprimer.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + controllerProfil_.supprimerSelectedProfil(); + } + }); + btContainer.add(btSupprimer); + JButton btFusionner=new BuButton(FudaaLib.getS("Fusionner")); + btFusionner.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + controllerProfil_.fusionnerProfil(); + } + }); + btFusionner.setEnabled(false); + btContainer.add(btFusionner); + body.add(btContainer, BuBorderLayout.EAST); + body.setPreferredSize(new Dimension(body.getMinimumSize().width, 350)); + } + + /** + * Surcharge du model du tableau pour prendre les informations directement dans le BiefSet. + */ + private class TableProfilModel extends DefaultTableModel implements BiefContainerListener { + + /** Raccourcis vers le biefContainer. */ + private BiefContainer biefContainer_; + + public TableProfilModel() { + super(new String[]{FudaaLib.getS("Nom")}, 0); + biefContainer_=controllerProfil_.getBiefContainer(); + biefContainer_.addBiefContainerListener(this); + } + + public Class<?> getColumnClass(int columnIndex) { + return String.class; + } + + public int getRowCount() { + if(biefContainer_==null) + return 0; + return biefContainer_.getNbProfil(); + } + + public Object getValueAt(int rowIndex, int columnIndex) { + return biefContainer_.getNomProfil(rowIndex); + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return true; + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) { + if(!getValueAt(rowIndex, columnIndex).equals(value)) + controllerProfil_.renameProfil(rowIndex, (String) value); + } + + public void biefSelectedChanged(String name) { + fireTableDataChanged(); + } + + public void biefSelectedRenamed(String name, String name2) { + fireTableDataChanged(); + } + + public void profilRemoved(int profil) { + fireTableDataChanged(); + } + + public void profilRenamed(int profil, String name, String name2) { + fireTableDataChanged(); + } + + public void profilAdded(int profil) { + fireTableDataChanged(); + } + } +} Deleted: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueContainerModules.java 2009-02-16 21:23:26 UTC (rev 4477) @@ -1,65 +0,0 @@ -/* - * @creation 18 d\xE9c. 2008 - * @modification $Date:$ - * @license GNU General Public License 2 - * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne - * @mail fud...@li... - */ -package org.fudaa.fudaa.modeleur.modeleur1d.view; - -import java.awt.Container; - -import javax.swing.JComponent; -import javax.swing.ListModel; -import javax.swing.event.ListDataEvent; -import javax.swing.event.ListDataListener; - -import com.memoire.bu.BuBorderLayout; -import com.memoire.bu.BuVerticalLayout; - -/** - * @author Emmanuel MARTIN - * @version $Id$ - */ -public class VueContainerModules extends JComponent implements ListDataListener { - - /** le model */ - private ListModel model_; - /** Container contenant la visualisation des modules. */ - private Container container_; - - public VueContainerModules(ListModel _model){ - model_=_model; - setLayout(new BuBorderLayout()); - container_=new Container(); - container_.setLayout(new BuVerticalLayout()); - add(container_, BuBorderLayout.CENTER); - model_.addListDataListener(this); - updateBox(); - } - - /** - * R\xE9g\xE9n\xE8re le contenu de la box. - */ - protected void updateBox(){ - container_.removeAll(); - for(int i=0;i<model_.getSize();i++) - if(model_.getElementAt(i) instanceof JComponent) - container_.add((JComponent) model_.getElementAt(i)); - } - - public void contentsChanged(ListDataEvent e) { - // TODO quelque chose de plus 'fin' - updateBox(); - } - - public void intervalAdded(ListDataEvent e) { - // TODO quelque chose de plus 'fin' - updateBox(); - } - - public void intervalRemoved(ListDataEvent e) { - // TODO quelque chose de plus 'fin' - updateBox(); - } -} Deleted: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java 2009-02-16 17:11:11 UTC (rev 4476) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueExport.java 2009-... [truncated message content] |
From: <bma...@us...> - 2009-03-24 18:04:08
|
Revision: 4566 http://fudaa.svn.sourceforge.net/fudaa/?rev=4566&view=rev Author: bmarchan Date: 2009-03-24 18:03:47 +0000 (Tue, 24 Mar 2009) Log Message: ----------- Tache #205 : R?\195?\169orientation correcte des profils. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java 2009-03-24 15:34:57 UTC (rev 4565) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/BiefImporterFromModels.java 2009-03-24 18:03:47 UTC (rev 4566) @@ -28,6 +28,7 @@ import org.fudaa.fudaa.modeleur.layer.MdlModel1dLimiteStockage; import org.fudaa.fudaa.modeleur.layer.MdlModel2dConstraintLine; import org.fudaa.fudaa.modeleur.layer.MdlModel2dDirectionLine; +import org.fudaa.fudaa.modeleur.layer.MdlModel2dLine; import org.fudaa.fudaa.modeleur.layer.MdlModel2dProfile; import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsBief1d; @@ -53,7 +54,7 @@ private ZModeleLigneBrisee[] models_; // Les mod\xE8les en fonction de le contenu. Se sont les m\xEAmes que dans models_. private ZModeleLigneBrisee axeHydraulique_; - private ZModeleLigneBrisee profils_; + private MdlModel2dLine profils_; private ZModeleLigneBrisee rives_; private ZModeleLigneBrisee limitesStockages_; private ZModeleLigneBrisee lignesDirectrices_; @@ -150,7 +151,7 @@ // Inversion du sens du profil si besoin double produitVectorielCoordZ=vAxeH.x*vProfilH.y-vAxeH.y*vProfilH.x; if (produitVectorielCoordZ>0) { - inverseProfil(k); + profils_.invertOrientation(k,null); profil=(Geometry)profils_.getGeomData().getGeometry(k); seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); } @@ -344,7 +345,7 @@ if (profils_!=null) throw new IllegalArgumentException(FudaaLib.getS("Plusieurs models de profils sont donn\xE9es.")); else - profils_=models_[i]; + profils_=(MdlModel2dLine)models_[i]; else if (nature==GISAttributeConstants.ATT_NATURE_RV) if (rives_!=null) throw new IllegalArgumentException(FudaaLib.getS("Plusieurs models de rives sont donn\xE9es.")); @@ -375,29 +376,6 @@ } /** - * Inverse le sens du profil dont l'index est pass\xE9 en param\xE8tre. - */ - private void inverseProfil(int _idxProfil) { - GISZoneCollection zone=profils_.getGeomData(); - Coordinate[] coords=((Geometry)zone.getGeometry(_idxProfil)).getCoordinates(); - for (int l=0; l<coords.length/2; l++) { - // Inversion des coordonn\xE9es - Coordinate tmp=coords[l]; - coords[l]=coords[coords.length-1-l]; - coords[coords.length-1-l]=tmp; - // Inversion des attributs atomiques - for (int i=0; i<zone.getNbAttributes(); i++) - if (zone.getAttribute(i).isAtomicValue()) { - 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); - } - } - zone.setCoordinateSequence(_idxProfil, new GISCoordinateSequenceFactory().create(coords), null); - } - - /** * Valuation des attributs *gauche et *droite des profils. * * @param _idxProfil Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java 2009-03-24 15:34:57 UTC (rev 4565) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java 2009-03-24 18:03:47 UTC (rev 4566) @@ -71,6 +71,7 @@ // Ajout du calque d'axe hydraulique MdlLayer1dAxe axeHydraulique=new MdlLayer1dAxe((FSigEditor)gisEditor_); axeHydraulique.setSelectable(false); + axeHydraulique.setShowLineOrientation(true); axeHydraulique.modele(bief.axeHydraulique_); groupeCalque.add(axeHydraulique); // Ajout du calque de lignes directrices This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bma...@us...> - 2009-03-26 16:31:24
|
Revision: 4572 http://fudaa.svn.sourceforge.net/fudaa/?rev=4572&view=rev Author: bmarchan Date: 2009-03-26 16:31:09 +0000 (Thu, 26 Mar 2009) Log Message: ----------- Tache #208 : Modeleur 1D : Profil rectangle sous Mascaret a pr?\195?\169sent conforme Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Exporter1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-03-25 11:43:06 UTC (rev 4571) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-03-26 16:31:09 UTC (rev 4572) @@ -381,8 +381,8 @@ // Les formats a exporter. HashMap<FileFormatVersionInterface, Exporter1d> ff2Exporter=new HashMap<FileFormatVersionInterface, Exporter1d>(); - ff2Exporter.put(MascaretGEO1dFileFormat.getInstance(), new Exporter1d.Mascaret()); - ff2Exporter.put(MascaretGEO2dFileFormat.getInstance(), new Exporter1d.Mascaret()); + ff2Exporter.put(MascaretGEO1dFileFormat.getInstance(), new Exporter1d.Mascaret1d()); + ff2Exporter.put(MascaretGEO2dFileFormat.getInstance(), new Exporter1d.Mascaret2d()); ff2Exporter.put(RubarStCnFileFormat.getInstance(), new Exporter1d.Rubar()); FileFormatVersionInterface[] ffs=ff2Exporter.keySet().toArray(new FileFormatVersionInterface[0]); @@ -401,11 +401,8 @@ } if (ff==null) return; - // Cr\xE9ation du writer. - FileWriteOperationAbstract writer=ff.createWriter(); - - Object[] params=ff2Exporter.get(ff).export(bief,controllerBief_.getSelectedBiefName()); - CtuluIOOperationSynthese result=writer.write(params,file, null); + // Export. + CtuluIOOperationSynthese result=ff2Exporter.get(ff).export(file,bief,controllerBief_.getSelectedBiefName()); appli_.manageErrorOperationAndIsFatal(result); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Exporter1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Exporter1d.java 2009-03-25 11:43:06 UTC (rev 4571) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Exporter1d.java 2009-03-26 16:31:09 UTC (rev 4572) @@ -7,9 +7,18 @@ */ package org.fudaa.fudaa.modeleur.modeleur1d.controller; +import java.io.File; + +import org.fudaa.ctulu.CtuluAnalyze; +import org.fudaa.ctulu.CtuluIOOperationSynthese; +import org.fudaa.ctulu.fileformat.FileFormatVersionInterface; +import org.fudaa.ctulu.fileformat.FileWriteOperationAbstract; import org.fudaa.ctulu.gis.GISDataModel; import org.fudaa.ctulu.gis.GISZoneCollection; +import org.fudaa.dodico.mascaret.io.MascaretGEO1dFileFormat; +import org.fudaa.dodico.mascaret.io.MascaretGEO2dFileFormat; import org.fudaa.dodico.mascaret.io.MascaretGEOWriter; +import org.fudaa.dodico.rubar.io.RubarStCnFileFormat; import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsProfil1d; @@ -21,34 +30,65 @@ interface Exporter1d { /** - * Retourne les parametres d'\xE9criture sp\xE9cifiques d'un format de fichier. - * Methode a implementer pour chaque format de fichier. + * Export des donn\xE9es d'un bief. + * @param _f Le fichier d'\xE9criture du bief. * @param _bief Le bief. * @param _name Le nom du bief. * @return Les parametres. */ - public Object[] export(Bief _bief, String _name); + public CtuluIOOperationSynthese export(File _f, Bief _bief, String _name); /** + * Retourne le file format associ\xE9 \xE0 l'exporter. + * @return Le file format. + */ + public FileFormatVersionInterface getFileFormat(); + + /** * Exporteur pour Mascaret 1D, ou 2D. * @author Bertrand Marchand * @version $Id$ */ - class Mascaret implements Exporter1d { + abstract class Mascaret implements Exporter1d { - public Object[] export(Bief _bief, String _name) { + public CtuluIOOperationSynthese export(File _file, Bief _bief, String _name) { + _bief.profils_.getGeomData().prepareExport(); + _bief.axeHydraulique_.getGeomData().prepareExport(); + GISZoneCollection[] zones=new GISZoneCollection[]{_bief.axeHydraulique_.getGeomData(), _bief.lignesDirectrices_.getGeomData(), _bief.limitesStockages_.getGeomData(), _bief.profils_.getGeomData(), _bief.rives_.getGeomData()}; + + final CtuluAnalyze ana=new CtuluAnalyze(); MascaretGEOWriter.FunctorSelectProfil functorSelectProfil=new MascaretGEOWriter.FunctorSelectProfil() { public boolean exportProfil(GISZoneCollection _zone, int _idxProfil) { - return UtilsProfil1d.isProfilCorrect(_zone, _idxProfil); + return UtilsProfil1d.isProfilCorrect(_zone, _idxProfil,ana); } }; - return new Object[]{_name,zones,functorSelectProfil}; + // Ecriture du fichier + FileWriteOperationAbstract writer=getFileFormat().createWriter(); + CtuluIOOperationSynthese synt=writer.write(new Object[]{_name,zones,functorSelectProfil},_file, null); + + if (ana.containsWarnings()) { + ana.merge(synt.getAnalyze()); + synt.setAnalyze(ana); + } + return synt; } } + class Mascaret1d extends Mascaret { + public FileFormatVersionInterface getFileFormat() { + return MascaretGEO1dFileFormat.getInstance(); + } + } + + class Mascaret2d extends Mascaret { + public FileFormatVersionInterface getFileFormat() { + return MascaretGEO2dFileFormat.getInstance(); + } + } + /** * Exporteur pour Rubar ST. * @author Bertrand Marchand @@ -56,7 +96,7 @@ */ class Rubar implements Exporter1d { - public Object[] export(Bief _bief, String _name) { + public CtuluIOOperationSynthese export(File _file, Bief _bief, String _name) { GISDataModel[] params=new GISDataModel[2]; // Remplit les Z coordonn\xE9es avec la valeur de l'attribut Z _bief.profils_.getGeomData().prepareExport(); @@ -64,7 +104,15 @@ params[0]=_bief.profils_.getGeomData(); params[1]=_bief.lignesDirectrices_.getGeomData(); - return params; + + // Ecriture du fichier + FileWriteOperationAbstract writer=getFileFormat().createWriter(); + CtuluIOOperationSynthese synt=writer.write(params,_file, null); + return synt; } + + public FileFormatVersionInterface getFileFormat() { + return RubarStCnFileFormat.getInstance(); + } } } 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-03-25 11:43:06 UTC (rev 4571) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2009-03-26 16:31:09 UTC (rev 4572) @@ -7,6 +7,8 @@ */ package org.fudaa.fudaa.modeleur.modeleur1d.model; +import org.fudaa.ctulu.CtuluAnalyze; +import org.fudaa.ctulu.gis.GISAttributeConstants; import org.fudaa.ctulu.gis.GISAttributeModel; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; @@ -14,6 +16,7 @@ import org.fudaa.ctulu.gis.GISPoint; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.resource.MdlResource; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; @@ -31,35 +34,54 @@ /** * Retourne vrai si le profil est correct. + * @param _ana L'analyseur. Permet de retourner le pourquoi de la non conformit\xE9. Peut \xEAtre null. */ - static public boolean isProfilCorrect(GISZoneCollection _zone, int _idxProfil) { + static public boolean isProfilCorrect(final GISZoneCollection _zone, final int _idxProfil, final CtuluAnalyze _ana) { + + // Une classe pour afficher le message. + class MessageHelper { + public void warn(String _mes, int _idxProfil, int _idxPoint) { + if (_ana==null) return; + int iattName=_zone.getIndiceOf(GISAttributeConstants.TITRE); + String name=(String)_zone.getValue(iattName, _idxProfil); + _ana.addWarn(MdlResource.getS(_mes,name,""+_idxPoint),-1); + } + } + CoordinateSequence seq=((GISCoordinateSequenceContainerInterface)_zone.getGeometry(_idxProfil)).getCoordinateSequence(); // Verifie qu'on a bien au minimum deux points. \\ - if (seq.size()<2) + if (seq.size()<2) { + new MessageHelper().warn("Profil '{0}' : Le nombre de points mini doit \xEAtre de 2", _idxProfil, 0); return false; + } // Verifie que deux points cons\xE9cutifs ne sont pas confondus. \\ for (int i=1; i<seq.size(); i++) - if (seq.getX(i-1)==seq.getX(i)&&seq.getY(i-1)==seq.getY(i)) + if (seq.getX(i-1)==seq.getX(i)&&seq.getY(i-1)==seq.getY(i)&&seq.getOrdinate(i,2)==seq.getOrdinate(i-1,2)) { + new MessageHelper().warn("Profil '{0}' : Au moins 2 points sont confondus au point {1}", _idxProfil, i+1); return false; - // Verifie que le profil donn\xE9 ne poss\xE8de pas des axes qui se coupent entre + } + // Verifie que le profil donn\xE9 ne poss\xE8de pas des segments qui se coupent entre eux // eux \\ for (int i=1; i<seq.size(); i++) { Geometry mainAxe=GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{seq.getCoordinate(i-1), seq.getCoordinate(i)}); boolean ok=true; - // Un seul point d'intersection avec l'axe qui suit - if (i+1<seq.size() + // Un seul point d'intersection avec le segment qui suit + int j=i; + if (j+1<seq.size() &&mainAxe.intersection( - GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{seq.getCoordinate(i), seq.getCoordinate(i+1)})) + GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{seq.getCoordinate(j), seq.getCoordinate(j+1)})) .getNumPoints()>1) ok=false; - // Aucun point d'intersection avec les axes qui suivent - int j=i; + j++; + // Aucun point d'intersection avec les segments qui suivent while (ok&&++j+1<seq.size()) ok=!mainAxe.intersects(GISGeometryFactory.INSTANCE.createLineString(new Coordinate[]{seq.getCoordinate(j), seq.getCoordinate(j+1)})); // Traitement d'une \xE9ventuelle intersection - if (!ok) + if (!ok) { + new MessageHelper().warn("Profil '{0}' : Le profil se coupe lui m\xEAme au point {1}", _idxProfil, j+1); return false; + } } // / D\xE9termination des points de ruptures et verification qu'il y en a @@ -82,8 +104,10 @@ if(UtilsProfil1d.getAngle(seq.getCoordinate(idx1), seq.getCoordinate(idx2), seq.getCoordinate(idx3))<(Math.PI-0.0001)) if(idxPointRupturePrecedent<0||!seq.getCoordinate(idxPointRupturePrecedent).equals(seq.getCoordinate(idx2))) nbPointsRupture++; - if (nbPointsRupture>2) + if (nbPointsRupture>2) { + new MessageHelper().warn("Profil '{0}' : Le profil poss\xE8de plus de 3 segments",_idxProfil,0); return false; + } if(idx2+1<idx3) idx2++; else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bma...@us...> - 2009-03-26 16:38:05
|
Revision: 4573 http://fudaa.svn.sourceforge.net/fudaa/?rev=4573&view=rev Author: bmarchan Date: 2009-03-26 16:37:57 +0000 (Thu, 26 Mar 2009) Log Message: ----------- Tache #209 : Modeleur 1D : Les abscisses curvilignes ne sont pas corrects apr?\195?\168s une fusion Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/FusionBiefPanel.java Removed Paths: ------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java 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-03-26 16:31:09 UTC (rev 4572) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2009-03-26 16:37:57 UTC (rev 4573) @@ -34,7 +34,7 @@ import org.fudaa.fudaa.modeleur.modeleur1d.model.UtilsBief1d; 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.FusionBiefPanel; import org.fudaa.fudaa.modeleur.modeleur1d.view.PnGestionBief; import com.vividsolutions.jts.geom.Coordinate; @@ -237,93 +237,141 @@ try { // D\xE9termine quel bief est le premier et lequel est le second // (curvilignement parlant) - double bief1BaseCurv=0; - double bief2BaseCurv=0; - { // 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); - // 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.")); - if (bief1.axeHydraulique_.getNombre()!=bief2.axeHydraulique_.getNombre()) - throw new IllegalArgumentException(FudaaLib.getS("Les deux biefs doivent avoir la m\xEAme pr\xE9sence d'axe hydraulique.")); + // Pr\xE9sence ou non d'un axe hydro. + boolean hasAxe=false; + // Le decalage du debut des axes. + double decalBief1; + double decalBief2; + // Les offset de d\xE9calage pour les biefs s'ils ont \xE9t\xE9 modifi\xE9s par + // l'utilisateur. + double offsetBief1=0; + double offsetBief2=0; + // Longueurs de chaque axe (ou pk fin - pk debut si le bief n'a pas d'axe) + double longBief1; + double longBief2; - GISZoneCollection zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); - if (zoneAxeHydrau1.getNumGeometries()>0) - bief1BaseCurv=(Double)zoneAxeHydrau1.getValue(zoneAxeHydrau1.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 0); - GISZoneCollection zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); - if (zoneAxeHydrau2.getNumGeometries()>0) - bief2BaseCurv=(Double)zoneAxeHydrau2.getValue(zoneAxeHydrau2.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 0); + String name1=biefSet_.getBiefName(_idxBief1); + String name2=biefSet_.getBiefName(_idxBief2); + Bief bief1=biefSet_.getBief(name1); + Bief bief2=biefSet_.getBief(name2); + GISZoneCollection zone1=biefSet_.getBief(name1).profils_.getGeomData(); + GISZoneCollection zone2=biefSet_.getBief(name2).profils_.getGeomData(); - // Inversion des biefs si n\xE9c\xE9ssaire - if (bief1BaseCurv>bief2BaseCurv) { - int idxTmp=_idxBief1; - _idxBief1=_idxBief2; - _idxBief2=idxTmp; - double valTmp=bief1BaseCurv; - bief1BaseCurv=bief2BaseCurv; - bief2BaseCurv=valTmp; - } + // 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.")); + if (bief1.axeHydraulique_.getNombre()!=bief2.axeHydraulique_.getNombre()) + throw new IllegalArgumentException(FudaaLib.getS("Les deux biefs doivent avoir la m\xEAme pr\xE9sence d'axe hydraulique.")); + + GISZoneCollection zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); + GISZoneCollection zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); + hasAxe=zoneAxeHydrau1.getNumGeometries()>0; + + // R\xE9cup\xE9ration du d\xE9calage d'abscisse \\ + + if (hasAxe) { + decalBief1=(Double)zoneAxeHydrau1.getValue(zoneAxeHydrau1.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 0); + decalBief2=(Double)zoneAxeHydrau2.getValue(zoneAxeHydrau2.getIndiceOf(GISAttributeConstants.CURVILIGNE_DECALAGE), 0); } - { // Bloque r\xE9duisant artificiellement la port\xE9 des variables - String name1=biefSet_.getBiefName(_idxBief1); - String name2=biefSet_.getBiefName(_idxBief2); - double bief1MaxCurvBrut; - double bief2MaxCurvBrut; - if (biefSet_.getBief(name1).axeHydraulique_.getGeomData().getNumGeometries()>0) { - CoordinateSequence seqAxe1=biefSet_.getBief(name1).axeHydraulique_.getGeomData().getCoordinateSequence(0); - bief1MaxCurvBrut=UtilsProfil1d.abscisseCurviligne(seqAxe1, seqAxe1.getCoordinate(seqAxe1.size()-1)); - CoordinateSequence seqAxe2=biefSet_.getBief(name2).axeHydraulique_.getGeomData().getCoordinateSequence(0); - bief2MaxCurvBrut=UtilsProfil1d.abscisseCurviligne(seqAxe2, seqAxe2.getCoordinate(seqAxe2.size()-1)); - } - else { - GISZoneCollection zone1=biefSet_.getBief(name1).profils_.getGeomData(); - bief1MaxCurvBrut=Double.parseDouble(((String)zone1.getValue(zone1.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), - zone1.getNumGeometries()-1)).substring(3)); - GISZoneCollection zone2=biefSet_.getBief(name2).profils_.getGeomData(); - bief2MaxCurvBrut=Double.parseDouble(((String)zone2.getValue(zone2.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), - zone2.getNumGeometries()-1)).substring(3)); - } + else { + decalBief1=GISLib.getHydroCommentDouble((String)zone1.getValue(zone1.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), + 0), "PK"); + decalBief2=GISLib.getHydroCommentDouble((String)zone2.getValue(zone2.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), + 0), "PK"); + } - 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(); - } + // R\xE9cup\xE9ration de la longueur des 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; - } + if (hasAxe) { + CoordinateSequence seqAxe1=biefSet_.getBief(name1).axeHydraulique_.getGeomData().getCoordinateSequence(0); + longBief1=UtilsProfil1d.abscisseCurviligne(seqAxe1, seqAxe1.getCoordinate(seqAxe1.size()-1)); + CoordinateSequence seqAxe2=biefSet_.getBief(name2).axeHydraulique_.getGeomData().getCoordinateSequence(0); + longBief2=UtilsProfil1d.abscisseCurviligne(seqAxe2, seqAxe2.getCoordinate(seqAxe2.size()-1)); } - String name1=biefSet_.getBiefName(_idxBief1); - String name2=biefSet_.getBiefName(_idxBief2); - Bief bief1=biefSet_.getBief(name1); - Bief bief2=biefSet_.getBief(name2); - // Extraction/Cr\xE9ation des axes hydrauliques - GISZoneCollection zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); - GISZoneCollection zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); + // Pas d'axe hydro => On calcule les longueurs a partir des PK profils. + else { + longBief1=GISLib.getHydroCommentDouble((String)zone1.getValue(zone1.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), + zone1.getNumGeometries()-1), "PK") + -decalBief1; + longBief2=GISLib.getHydroCommentDouble((String)zone2.getValue(zone2.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO), + zone2.getNumGeometries()-1), "PK") + -decalBief2; + } + + // Inversion des biefs si n\xE9c\xE9ssaire + if (decalBief1>decalBief2) { + int idxTmp=_idxBief1; + _idxBief1=_idxBief2; + _idxBief2=idxTmp; + double valTmp=decalBief1; + decalBief1=decalBief2; + decalBief2=valTmp; + + name1=biefSet_.getBiefName(_idxBief1); + name2=biefSet_.getBiefName(_idxBief2); + bief1=biefSet_.getBief(name1); + bief2=biefSet_.getBief(name2); + zone1=bief1.profils_.getGeomData(); + zone2=bief2.profils_.getGeomData(); + zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); + zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); + } + + // Superposition des biefs => On demande un d\xE9calage a l'utilisateur. + if (decalBief1+longBief1>decalBief2) { + FusionBiefPanel vueFusionBief=new FusionBiefPanel(controller1d_.getFormater(), name1, decalBief1, longBief1, name2, decalBief2, + longBief2); + if (!vueFusionBief.run()) + return; + + offsetBief1=vueFusionBief.getAbsCurvAxe1()-decalBief1; + offsetBief2=vueFusionBief.getAbsCurvAxe2()-decalBief2; + } + + // Inversion des biefs si n\xE9c\xE9ssaire + if (decalBief1+offsetBief1>decalBief2+offsetBief2) { + int idxTmp=_idxBief1; + _idxBief1=_idxBief2; + _idxBief2=idxTmp; + double valTmp=decalBief1; + decalBief1=decalBief2; + decalBief2=valTmp; + valTmp=offsetBief1; + offsetBief1=offsetBief2; + offsetBief2=valTmp; + + name1=biefSet_.getBiefName(_idxBief1); + name2=biefSet_.getBiefName(_idxBief2); + bief1=biefSet_.getBief(name1); + bief2=biefSet_.getBief(name2); + zone1=bief1.profils_.getGeomData(); + zone2=bief2.profils_.getGeomData(); + zoneAxeHydrau1=bief1.axeHydraulique_.getGeomData(); + zoneAxeHydrau2=bief2.axeHydraulique_.getGeomData(); + } + + // Extraction/Cr\xE9ation des axes hydrauliques \\ + CoordinateSequence seqAxeHydraulique1; CoordinateSequence seqAxeHydraulique2; boolean fakeAH=false; - if (zoneAxeHydrau1.getNbGeometries()==0) { + + // On recupere les axes. + if (hasAxe) { + seqAxeHydraulique1=zoneAxeHydrau1.getCoordinateSequence(0); + seqAxeHydraulique2=zoneAxeHydrau2.getCoordinateSequence(0); + } + + // Pas d'axe hydraulique => Construction de 2 faux axes hydrauliques. + else { fakeAH=true; - // Construction d'un faux axe hydraulique + if (bief1.profils_.getNombre()>=2) { CoordinateSequence prof1=bief1.profils_.getGeomData().getCoordinateSequence(0); CoordinateSequence prof2=bief1.profils_.getGeomData().getCoordinateSequence(bief1.profils_.getNombre()-1); @@ -338,6 +386,7 @@ } else return; + if (bief2.profils_.getNombre()>=2) { CoordinateSequence prof1=bief2.profils_.getGeomData().getCoordinateSequence(0); CoordinateSequence prof2=bief2.profils_.getGeomData().getCoordinateSequence(bief2.profils_.getNombre()-1); @@ -353,12 +402,9 @@ else return; } - else { - seqAxeHydraulique1=zoneAxeHydrau1.getCoordinateSequence(0); - seqAxeHydraulique2=zoneAxeHydrau2.getCoordinateSequence(0); - } + - Coordinate debutAxe2=UtilsProfil1d.getCoordinateXY(seqAxeHydraulique1, bief2BaseCurv-bief1BaseCurv); + Coordinate debutAxe2=UtilsProfil1d.getCoordinateXY(seqAxeHydraulique1, (decalBief2+offsetBief2)-(decalBief1+offsetBief1)); Coordinate move=UtilsProfil1d.vec(seqAxeHydraulique2.getCoordinate(0), debutAxe2); // Construction du nouveau bief @@ -374,30 +420,25 @@ GISZoneCollection bief2ZoneProfil=bief2.profils_.getGeomData(); // Ajout de g\xE9om\xE9tries au nouveau bief \\ - // Ajout des profils des biefs d'origines + + // Ajout des profils du bief 1, en d\xE9calant eventuellement les PK. int idxAttrComm=zoneProfils.getIndiceOf(GISAttributeConstants.COMMENTAIRE_HYDRO); for (int i=0; i<bief1.profils_.getNombre(); i++) { int idxGeom=zoneProfils.addGeometry(bief1ZoneProfil.getGeometry(i), UtilsProfil1d.getData(i, bief1ZoneProfil), null); - if (fakeAH) { - // Dans le cas de l'utilisation de l'attribut CommentaireHydro, on - // r\xE9percute le changement de baseCurv sur les valeurs de l'attribut String comm=(String)zoneProfils.getValue(idxAttrComm, idxGeom); - double newPK=GISLib.getHydroCommentDouble(comm, "PK")+bief1BaseCurv; + double newPK=GISLib.getHydroCommentDouble(comm, "PK")+offsetBief1; String newValue=GISLib.setHydroCommentDouble(comm, newPK, "PK"); zoneProfils.setAttributValue(idxAttrComm, idxGeom, newValue, null); - } } + // Ajout des profil du bief 2, en d\xE9calant eventuellement les PK. for (int i=0; i<bief2.profils_.getNombre(); i++) { int idxGeom=zoneProfils.addGeometry(bief2ZoneProfil.getGeometry(i), UtilsProfil1d.getData(i, bief2ZoneProfil), null); - if (fakeAH) { - // Dans le cas de l'utilisation de l'attribut CommentaireHydro, on - // r\xE9percute le changement de baseCurv sur les valeurs de l'attribut String comm=(String)zoneProfils.getValue(idxAttrComm, idxGeom); - double newPK=GISLib.getHydroCommentDouble(comm, "PK")+bief2BaseCurv; + double newPK=GISLib.getHydroCommentDouble(comm, "PK")+offsetBief2; String newValue=GISLib.setHydroCommentDouble(comm, newPK, "PK"); zoneProfils.setAttributValue(idxAttrComm, idxGeom, newValue, null); - } } + // Ajout de l'axe hydraulique du second bief (utile pour la translation) if (!fakeAH) zoneAxeHydraulique.addGeometry(zoneAxeHydrau2.getGeometry(0), UtilsProfil1d.getData(0, zoneAxeHydrau2), null); @@ -432,7 +473,7 @@ 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); + decalBief1, null); // suppression de l'axe hydraulique 2 du nouveau bief zoneAxeHydraulique.removeGeometries(new int[]{0}, null); } Copied: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/FusionBiefPanel.java (from rev 4503, 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/FusionBiefPanel.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/FusionBiefPanel.java 2009-03-26 16:37:57 UTC (rev 4573) @@ -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 FusionBiefPanel 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 FusionBiefPanel(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 biefs se superposent.")); + titre1.setHorizontalAlignment(SwingUtilities.CENTER); + head.add(titre1); + BuLabel titre2=new BuLabel(FudaaLib.getS("D\xE9finissez de nouvelles valeurs de d\xE9calage d'abscisses 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_; + } + +} Deleted: 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 2009-03-26 16:31:09 UTC (rev 4572) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueFusionBief.java 2009-03-26 16:37:57 UTC (rev 4573) @@ -1,125 +0,0 @@ -/* - * @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_; - } - -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bma...@us...> - 2009-03-26 17:35:33
|
Revision: 4574 http://fudaa.svn.sourceforge.net/fudaa/?rev=4574&view=rev Author: bmarchan Date: 2009-03-26 17:35:24 +0000 (Thu, 26 Mar 2009) Log Message: ----------- Tache #210 : Modeleur 1D : Selection du profil dans la vue bief en m?\195?\170me temps que dans la liste. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-03-26 16:37:57 UTC (rev 4573) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/Controller1d.java 2009-03-26 17:35:24 UTC (rev 4574) @@ -132,6 +132,7 @@ addVueModule(controllerProfil_.getVueModuleGestionProfil()); // Vue Bief controllerBief_.getVueBief().getScene().addSelectionListener(this); + controllerProfil_.getProfilContainer().addProfilContainerListener(controllerBief_.getVueBief()); // Vue tableau vueTableau_=new VueTableau(this, controllerProfil_.getProfilContainer()); vueTableau_.addSelectionListener(this); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java 2009-03-26 16:37:57 UTC (rev 4573) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java 2009-03-26 17:35:24 UTC (rev 4574) @@ -23,6 +23,7 @@ import org.fudaa.fudaa.modeleur.layer.MdlLayer2dProfile; import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerBief; import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; +import org.fudaa.fudaa.modeleur.modeleur1d.model.ProfilContainerListener; import org.fudaa.fudaa.sig.layer.FSigEditor; @@ -35,10 +36,12 @@ * @author Emmanuel MARTIN * @version $Id$ */ -public class VueBief extends ZEbliCalquesPanel implements ListSelectionListener { +public class VueBief extends ZEbliCalquesPanel implements ListSelectionListener, ProfilContainerListener { /** Le controller de la fen\xEAtre 1d. */ protected ControllerBief controllerBief_; + /** Le calque des profils, pour mise a jour du profil selectionn\xE9. */ + MdlLayer2dProfile profils_; public VueBief(MdlImplementation _impl, ControllerBief _controllerBief) { super(_impl); @@ -85,9 +88,9 @@ limitesStockage.modele(bief.limitesStockages_); groupeCalque.add(limitesStockage); // Ajout du calque de profils - MdlLayer2dProfile profils=new MdlLayer2dProfile((FSigEditor)gisEditor_); - profils.modele(bief.profils_); - groupeCalque.add(profils); + profils_=new MdlLayer2dProfile((FSigEditor)gisEditor_); + profils_.modele(bief.profils_); + groupeCalque.add(profils_); // Ajout du calque de rives MdlLayer1dBank rives=new MdlLayer1dBank((FSigEditor)gisEditor_); rives.setSelectable(false); @@ -103,4 +106,13 @@ public void valueChanged(ListSelectionEvent e) { generateCalques(); } + + public void profilContainerSelectedChanged(int _idxOldProfil, int _idxNewProfil){ + if (_idxNewProfil==-1) + profils_.clearSelection(); + else + profils_.setSelection(new int[]{_idxNewProfil}); + } + + public void profilContainerDataModified() {} } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |