From: <emm...@us...> - 2008-12-30 15:19:57
|
Revision: 4316 http://fudaa.svn.sourceforge.net/fudaa/?rev=4316&view=rev Author: emmanuel_martin Date: 2008-12-30 15:19:53 +0000 (Tue, 30 Dec 2008) Log Message: ----------- L'import des rives gauches et droites et des limites de stockages gauches et droites depuis le 2d est fait correctement. Une simplification pour le 1d est fait, sans d?\195?\169truire les donn?\195?\169es 2d. Des modifications dans la partie 2d entrainent une mise ?\195?\160 jour dans la partie 1d. ATTENTION actuellement la mise ?\195?\160 jour depuis la partie 2d provoque la destruction de toutes les modifications faites dans la partie 1D ! Un comportement plus fin sera mise en place dans un commit ult?\195?\169rieur. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneAbscisseCurviligneAction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer1dBank.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 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/VueBief.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dBankPersistence.java Removed Paths: ------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dStorageLimit.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel1dStorageLimit.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/org/fudaa/ctulu/gis/GISAttributeConstants.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -56,8 +56,6 @@ public final static String ATT_NATURE_CE="CE"; /** Nature axe hydraulique */ public final static String ATT_NATURE_AH="AH"; - /** Nature limite de stockage (gauche ou droite) */ - public final static String ATT_NATURE_LS="LS"; /** Nature rive (gauche ou droite) */ public final static String ATT_NATURE_RV="RV"; Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -23,6 +23,7 @@ import org.fudaa.fudaa.modeleur.action.CalqueDeleteCalqueAction; import org.fudaa.fudaa.modeleur.action.CalqueNewCalqueAction; import org.fudaa.fudaa.modeleur.layer.MdlLayer1dAxe; +import org.fudaa.fudaa.modeleur.layer.MdlLayer1dBank; import org.fudaa.fudaa.modeleur.layer.MdlLayer1dTrace; import org.fudaa.fudaa.modeleur.layer.MdlLayer2dCloud; import org.fudaa.fudaa.modeleur.layer.MdlLayer2dConstraintLine; @@ -296,6 +297,10 @@ MdlLayer2dConstraintLine cqConst=new MdlLayer2dConstraintLine(getEditor()); cqConst.setName(BGroupeCalque.findUniqueChildName(cqBief, cqConst.getExtName())); cqBief.add(cqConst); + + MdlLayer1dBank cqBank=new MdlLayer1dBank(getEditor()); + cqBank.setName(BGroupeCalque.findUniqueChildName(cqBief, cqBank.getExtName())); + cqBief.add(cqBank); } /** Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneAbscisseCurviligneAction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneAbscisseCurviligneAction.java 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneAbscisseCurviligneAction.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -160,11 +160,9 @@ */ public Coordinate coordinateClicked(Coordinate _coord, double tolerance){ Point ptClick=new GeometryFactory().createPoint(_coord); - boolean returnValue=false; if (selectedGeometry_!=null&&selectedGeometry_.distance(ptClick)<tolerance) { // Recherche de l'index du dernier point de la polyligne \xE0 prendre en // compte. - returnValue=true; boolean fini=false; int i=-1; CoordinateSequence coordSeq=selectedGeometry_.getCoordinateSequence(); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer1dBank.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer1dBank.java 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer1dBank.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -15,13 +15,13 @@ import org.fudaa.ebli.trace.TraceLigne; import org.fudaa.ebli.trace.TraceLigneModel; import org.fudaa.fudaa.modeleur.MdlResource; -import org.fudaa.fudaa.modeleur.persistence.MdlLayer2dDirectionLinePersistence; +import org.fudaa.fudaa.modeleur.persistence.MdlLayer2dBankPersistence; import org.fudaa.fudaa.sig.layer.FSigEditor; /** * Un calque pour le stockage et la manipulation des rives. * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class MdlLayer1dBank extends MdlLayer2dLine { @@ -43,7 +43,7 @@ } public BCalquePersistenceInterface getPersistenceMng() { - return new MdlLayer2dDirectionLinePersistence(); + return new MdlLayer2dBankPersistence(); } /** Deleted: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dStorageLimit.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dStorageLimit.java 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlLayer2dStorageLimit.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -1,60 +0,0 @@ -/* - * @creation 23 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.layer; - -import java.awt.Color; - -import org.fudaa.ebli.calque.BCalquePersistenceInterface; -import org.fudaa.ebli.calque.dessin.DeForme; -import org.fudaa.ebli.calque.edition.ZModeleLigneBriseeEditable; -import org.fudaa.ebli.trace.TraceLigne; -import org.fudaa.ebli.trace.TraceLigneModel; -import org.fudaa.fudaa.modeleur.MdlResource; -import org.fudaa.fudaa.modeleur.persistence.MdlLayer2dDirectionLinePersistence; -import org.fudaa.fudaa.sig.layer.FSigEditor; - -/** - * Un calque pour le stockage et la manipulation des limites de stockage. - * @author Emmanuel MARTIN - * @version $Id$ - */ -public class MdlLayer2dStorageLimit extends MdlLayer2dLine { - - /** - * Constructeur. Utilise un mod\xE8le de donn\xE9es et un editeur. - * @param _model Modele - * @param _editor Editeur. - */ - private MdlLayer2dStorageLimit(ZModeleLigneBriseeEditable _model, final FSigEditor _editor) { - super(_model,_editor); - setLineModel(0, new TraceLigneModel(TraceLigne.LISSE, 1.5f, new Color(102,102,255))); - setLineModelOuvert(getLineModel(0)); - setName(getExtName()); - setTitle(MdlResource.MDL.getString("Limites de stockage")); - } - - public MdlLayer2dStorageLimit(FSigEditor _editor) { - this(new MdlModel1dStorageLimit(_editor,_editor.getMng()),_editor); - } - - public BCalquePersistenceInterface getPersistenceMng() { - return new MdlLayer2dDirectionLinePersistence(); - } - - /** - * Retourne le nom par defaut du calque. - * @return Le nom. - */ - public String getExtName() { - return "stockage"; - } - - public boolean canAddForme(int _typeForme) { - return _typeForme==DeForme.LIGNE_BRISEE; - } -} Deleted: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel1dStorageLimit.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel1dStorageLimit.java 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/MdlModel1dStorageLimit.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -1,40 +0,0 @@ -/* - * @creation 23 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.layer; - -import org.fudaa.ctulu.CtuluCommandContainer; -import org.fudaa.ctulu.gis.GISAttribute; -import org.fudaa.ctulu.gis.GISAttributeConstants; -import org.fudaa.ebli.calque.ZModelGeometryListener; - -/** - * Un mod\xE8le de gestion de limite de stockage. - * @author Emmanuel MARTIN - * @version $Id:$ - */ -public class MdlModel1dStorageLimit extends MdlModel2dLine { - - /** - * Construction d'un modele de profil avec pile de commandes. - * @param _cmd La pile de commandes pour le undo/redo. - */ - public MdlModel1dStorageLimit(final ZModelGeometryListener _listener, final CtuluCommandContainer _cmd) { - super(_listener); - GISAttribute[] attrs=new GISAttribute[]{ - GISAttributeConstants.BATHY, - GISAttributeConstants.ETAT_GEOM, - GISAttributeConstants.TITRE, - GISAttributeConstants.NATURE, - GISAttributeConstants.VISIBILITE - }; - // Pas de container de commande pour cette op\xE9ration, sinon conserv\xE9 en undo/redo. - getGeomData().setAttributes(attrs, null); - getGeomData().setAttributeIsZ(GISAttributeConstants.BATHY); - getGeomData().setFixedAttributeValue(GISAttributeConstants.NATURE, GISAttributeConstants.ATT_NATURE_LS); - } -} \ No newline at end of file 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-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/controller/ControllerBief.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -26,7 +26,7 @@ /** * Controller permettant de g\xE9rer (cr\xE9er, modifier, supprimer, selectionner) les biefs. * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class ControllerBief { @@ -57,20 +57,20 @@ * Se r\xE9g\xE9n\xE8re par rapport aux 2d. */ public void updateFrom2d(){ - // Suppression des biefs pr\xE9c\xE9dents - String[] names=biefSet_.getBiefNames(); - for(int i=0;i<names.length;i++) - biefSet_.removeBief(names[i], null); - // Ajout des nouveaux importBiefsFrom2d(controller1d_.getImplementation().get2dFrame().getVisuPanel().getArbreCalqueModel().getRootCalque().getCalqueParNom("gcBiefs")); } /** - * Import les biefs du 2d vers le 1d. + * Importe les biefs du 2d vers le 1d. */ private void importBiefsFrom2d(BCalque _rootCalque) { if (_rootCalque==null) return; + int selectedValue=biefSelectionModel_.getMinSelectionIndex(); + // Suppression des biefs pr\xE9c\xE9dents + String[] names=biefSet_.getBiefNames(); + for(int i=0;i<names.length;i++) + biefSet_.removeBief(names[i], null); BCalque[] calques=_rootCalque.getCalques(); // It\xE9ration du chaque bief for (int i=0; i<calques.length; i++) { @@ -82,11 +82,11 @@ if (sousCalques[j] instanceof FSigLayerLineEditable) modelsDuFutureBief.add(((FSigLayerLineEditable)sousCalques[j]).getModele()); // Ajout du bief - biefSet_.addBief(calqueBief.getTitle(), modelsDuFutureBief.toArray(new ZModeleLigneBrisee[0]), controller1d_.getCommandManager()); + 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) - biefSelectionModel_.addSelectionInterval(0, 0); + if(biefSet_.getNbBief()>0&&selectedValue!=-1) + biefSelectionModel_.addSelectionInterval(selectedValue, selectedValue); } /** 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-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/Bief.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -7,19 +7,31 @@ */ package org.fudaa.fudaa.modeleur.modeleur1d.model; +import java.util.Arrays; +import java.util.Comparator; + import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; +import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; +import org.fudaa.ctulu.gis.GISPolyligne; +import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import org.fudaa.ebli.calque.ZModeleLigneBrisee; import org.fudaa.fudaa.modeleur.layer.MdlModel1dAxe; import org.fudaa.fudaa.modeleur.layer.MdlModel1dBank; -import org.fudaa.fudaa.modeleur.layer.MdlModel1dStorageLimit; +import org.fudaa.fudaa.modeleur.layer.MdlModel2dConstraintLine; import org.fudaa.fudaa.modeleur.layer.MdlModel2dDirectionLine; import org.fudaa.fudaa.modeleur.layer.MdlModel2dProfile; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.CoordinateSequence; +import com.vividsolutions.jts.geom.Geometry; + /** * Contient les informations relatives \xE0 un bief. * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class Bief { public ZModeleLigneBrisee axeHydraulique_; @@ -31,39 +43,47 @@ public Bief(){} public Bief(ZModeleLigneBrisee[] _models){ - if(_models==null) + if (_models==null) throw new IllegalArgumentException("_models ne peut pas \xEAtre null."); - for(int i=0;i<_models.length;i++) { - if(_models[i]==null) + for (int i=0; i<_models.length; i++) { + if (_models[i]==null) throw new IllegalArgumentException("_models ne doit pas contenir de valeurs null"); - if(_models[i].getGeomData()==null) + if (_models[i].getGeomData()==null) throw new IllegalArgumentException("Certain model n'ont pas de GSIZone."); - if(!(_models[i].getGeomData() instanceof GISZoneCollectionLigneBrisee)) - throw new IllegalArgumentException("Toutes les GISZOne doivent \xEAtre des GISZoneCollectionLigneBrisee."); - String nature=(String) _models[i].getGeomData().getFixedAttributValue(GISAttributeConstants.NATURE); - if(nature==GISAttributeConstants.ATT_NATURE_AH) - if(axeHydraulique_!=null) + if (!(_models[i].getGeomData() instanceof GISZoneCollectionLigneBrisee)) + throw new IllegalArgumentException("Toutes les GISZone doivent \xEAtre des GISZoneCollectionLigneBrisee."); + String nature=(String)_models[i].getGeomData().getFixedAttributValue(GISAttributeConstants.NATURE); + if (nature==null) + throw new IllegalArgumentException("Une des GISZone ne contient pas l'attribut NATURE."); + if (nature==GISAttributeConstants.ATT_NATURE_AH) + if (axeHydraulique_!=null) throw new IllegalArgumentException("Plusieurs models d'axe hydrauliques sont donn\xE9es."); + else if (_models[i].getGeomData().getNbGeometries()>1) + throw new IllegalArgumentException("Il ne peut pas y avoir plusieurs Axes hydrauliques dans le bief."); else axeHydraulique_=_models[i]; - else if(nature==GISAttributeConstants.ATT_NATURE_LD) - if(lignesDirectrices_!=null) + else if (nature==GISAttributeConstants.ATT_NATURE_LD) + if (lignesDirectrices_!=null) throw new IllegalArgumentException("Plusieurs models de lignes directrices sont donn\xE9es."); else lignesDirectrices_=_models[i]; - else if(nature==GISAttributeConstants.ATT_NATURE_LS) - if(limitesStockages_!=null) + else if (nature==GISAttributeConstants.ATT_NATURE_LC) + if (limitesStockages_!=null) throw new IllegalArgumentException("Plusieurs models de limites de stockage sont donn\xE9es."); + else if (_models[i].getGeomData().getNbGeometries()>2) + throw new IllegalArgumentException("Il ne peut pas y avoir plus de 2 limites de stockage."); else limitesStockages_=_models[i]; - else if(nature==GISAttributeConstants.ATT_NATURE_PF) - if(profils_!=null) + else if (nature==GISAttributeConstants.ATT_NATURE_PF) + if (profils_!=null) throw new IllegalArgumentException("Plusieurs models de profils sont donn\xE9es."); else profils_=_models[i]; - else if(nature==GISAttributeConstants.ATT_NATURE_RV) - if(rives_!=null) + else if (nature==GISAttributeConstants.ATT_NATURE_RV) + if (rives_!=null) throw new IllegalArgumentException("Plusieurs models de rives sont donn\xE9es."); + else if (_models[i].getGeomData().getNbGeometries()>2) + throw new IllegalArgumentException("Il ne peut pas y avoir plus de 2 rives."); else rives_=_models[i]; } @@ -75,15 +95,184 @@ if (rives_==null) rives_=new MdlModel1dBank(null, null); if (limitesStockages_==null) - limitesStockages_=new MdlModel1dStorageLimit(null, null); + limitesStockages_=new MdlModel2dConstraintLine(null, null); if (lignesDirectrices_==null) lignesDirectrices_=new MdlModel2dDirectionLine(null, null); + // Valuation des attributs sp\xE9cifiques au 1d \\ + // Verification de la pr\xE9sences des attributs + GISZoneCollection zone=profils_.getGeomData(); + int attToAdd=0; + int idxIlsd=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE); + if (idxIlsd==-1) + attToAdd++; + int idxIlsg=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE); + if (idxIlsg==-1) + attToAdd++; + int idxRd=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE); + if (idxRd==-1) + attToAdd++; + int idxRg=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE); + if (idxRg==-1) + attToAdd++; + // Ajout des attributs manquant \\ + if (attToAdd>0) { + GISAttributeInterface[] atts=new GISAttributeInterface[zone.getNbAttributes()+attToAdd]; + int k=0; + for (k=0; k<zone.getNbAttributes(); k++) + atts[k]=zone.getAttribute(k); + if (idxIlsd==-1) + atts[k++]=GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE; + if (idxIlsg==-1) + atts[k++]=GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE; + if (idxRd==-1) + atts[k++]=GISAttributeConstants.INTERSECTION_RIVE_DROITE; + if (idxRg==-1) + atts[k++]=GISAttributeConstants.INTERSECTION_RIVE_GAUCHE; + zone.setAttributes(atts, null); + } + int idxAttRiveGauche=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_GAUCHE); + int idxAttRiveDroite=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_RIVE_DROITE); + int idxAttlsGauche=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_GAUCHE); + int idxAttlsDroite=zone.getIndiceOf(GISAttributeConstants.INTERSECTION_LIMITE_STOCKAGE_DROITE); + 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); + } + 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 fonctino 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); + + } + } + // Construction des rives et limites de stockages \\ + 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) { + Coordinate[] coords=((Geometry)profil).getCoordinates(); + for (int l=0; l<coords.length/2; l++) { + Coordinate tmp=coords[l]; + coords[l]=coords[coords.length-1-l]; + coords[coords.length-1-l]=tmp; + } + zone.setCoordinateSequence(k, new GISCoordinateSequenceFactory().create(coords), null); + profil=(Geometry)profils_.getGeomData().getGeometry(k); + seqProfil=((GISCoordinateSequenceContainerInterface)profil).getCoordinateSequence(); + } + double abscisseCurvIntersectionAxe=UtilsProfil1d.abscisseCurviligne(seqProfil, interAxeProfil); + // D\xE9tection des croisements rives gauches et rives droites \\ + // valeur par defaut + zone.setAttributValue(idxAttRiveGauche, k, seqProfil.getCoordinate(0), null); + zone.setAttributValue(idxAttRiveDroite, k, seqProfil.getCoordinate(seqProfil.size()-1), null); + for (int l=0; l<rives_.getNombre(); l++) { + Geometry inter=((Geometry)rives_.getObject(l)).intersection(profil); + if (inter.getNumPoints()>0) + if (abscisseCurvIntersectionAxe>UtilsProfil1d.abscisseCurviligne(seqProfil, inter.getCoordinate())) + zone.setAttributValue(idxAttRiveGauche, k, inter.getCoordinate(), null); + else + zone.setAttributValue(idxAttRiveDroite, k, inter.getCoordinate(), null); + } + // D\xE9tection des croisements zones de stockage droite et gauche \\ + // Valeur par defaut + zone.setAttributValue(idxAttlsGauche, k, seqProfil.getCoordinate(0), null); + zone.setAttributValue(idxAttlsDroite, k, seqProfil.getCoordinate(seqProfil.size()-1), null); + for (int l=0; l<limitesStockages_.getNombre(); l++) { + Geometry inter=((Geometry)limitesStockages_.getObject(l)).intersection(profil); + if (inter.getNumPoints()>0) + if (abscisseCurvIntersectionAxe>UtilsProfil1d.abscisseCurviligne(seqProfil, inter.getCoordinate())) + zone.setAttributValue(idxAttlsGauche, k, inter.getCoordinate(), null); + else + zone.setAttributValue(idxAttlsDroite, k, inter.getCoordinate(), null); + } + } + } + // Simplification des rives \\ + rives_=new MdlModel1dBank(null, null); + Coordinate[] riveGauche=new Coordinate[profils_.getNombre()]; + Coordinate[] riveDroite=new Coordinate[profils_.getNombre()]; + for (int i=0; i<profils_.getNombre(); i++) { + riveGauche[i]=(Coordinate)zone.getValue(idxAttRiveGauche, i); + riveDroite[i]=(Coordinate)zone.getValue(idxAttRiveDroite, i); + } + if (riveGauche.length>1&&riveGauche[0]!=null) + rives_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(riveGauche)), null, null); + if (riveDroite.length>1&&riveDroite[0]!=null) + rives_.getGeomData().addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(riveDroite)), null, null); + // Simplification des zones de stockages \\ + limitesStockages_=new MdlModel2dConstraintLine(null, null); + Coordinate[] lsGauche=new Coordinate[profils_.getNombre()]; + Coordinate[] lsDroite=new Coordinate[profils_.getNombre()]; + for (int i=0; i<profils_.getNombre(); i++) { + lsGauche[i]=(Coordinate)zone.getValue(idxAttlsGauche, i); + lsDroite[i]=(Coordinate)zone.getValue(idxAttlsDroite, i); + } + if (lsGauche.length>0&&lsGauche[0]!=null) + limitesStockages_.getGeomData() + .addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(lsGauche)), null, null); + if (lsDroite.length>0&&lsDroite[0]!=null) + limitesStockages_.getGeomData() + .addGeometry(new GISPolyligne(new GISCoordinateSequenceFactory().create(lsDroite)), null, null); } /** * Retourne vrai si les donn\xE9es contenues dans les champs sont coh\xE9rentes. */ public boolean checkCoherence(){ + // TODO ajouter la verification de la pr\xE9sences des attribtus n\xE9c\xE9ssaires if (axeHydraulique_==null||profils_==null||rives_==null||limitesStockages_==null||lignesDirectrices_==null) return false; // Axe hydraulique @@ -101,7 +290,7 @@ // Limite de stockage if (limitesStockages_.getGeomData()==null||!(limitesStockages_.getGeomData() instanceof GISZoneCollectionLigneBrisee)) return false; - if ((String)limitesStockages_.getGeomData().getFixedAttributValue(GISAttributeConstants.NATURE)!=GISAttributeConstants.ATT_NATURE_LS) + if ((String)limitesStockages_.getGeomData().getFixedAttributValue(GISAttributeConstants.NATURE)!=GISAttributeConstants.ATT_NATURE_LC) return false; if(limitesStockages_.getNbPolyligne()>2) return false; 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-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -100,12 +100,12 @@ private CtuluCollection z_; private List<Double> curv_; // Caches \\ - int idxZMax_; - int idxZMin_; + private int idxZMax_; + private int idxZMin_; // Le profil est potentiellement coup\xE9 en trois, les deux indices qui suivent // indique l'index de chacune de ces ruptures. - int idxRupture1_; - int idxRupture2_; + private int idxRupture1_; + private int idxRupture2_; public ProfilContainerAdapter(BiefContainer _biefContainer) { biefContainer_=_biefContainer; @@ -514,14 +514,14 @@ 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=vec(cZ0, proj(cZ0, aZ0, bZ0)); - Coordinate cProj=proj(new Coordinate(x1, y1, 0), aZ0, bZ0); - assert(egal(cProj, proj(new Coordinate(x2, y2, 0), aZ0, bZ0), 0.0001, false)); - if(egal(vecReference, vec(new Coordinate(x1, y1, 0), cProj), 0.0001, true)){ + 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(egal(vecReference, vec(new Coordinate(x2, y2, 0), cProj), 0.0001, true)) { + else if(UtilsProfil1d.egal(vecReference, UtilsProfil1d.vec(new Coordinate(x2, y2, 0), cProj), 0.0001, true)) { newX=x2; newY=y2; } @@ -724,55 +724,4 @@ for(ProfilContainerListener listener:listeners_) listener.profilContainerSelectedChanged(_idxOldProfil, _idxNewProfil); } - - // Quelques fonctions m\xE9th\xE9matiques \\ - - /** - * retourne le vecteur _a, _b sous forme de Coordinate. - */ - private Coordinate vec(Coordinate _a, Coordinate _b){ - return new Coordinate(_b.x-_a.x, _b.y-_a.y, _b.z-_a.z); - } - - /** - * Retourne la projection de _a sur la droite _b_c. - * Attention : Il s'agit bien d'une projection sur une - * droite et non un segment de droite : le r\xE9sultat - * peut \xEAtre en dehors de [_b, _c] - */ - private Coordinate proj(Coordinate _a, Coordinate _b, Coordinate _c){ - Coordinate vBC=vec(_b, _c); - Coordinate vBA=vec(_b, _a); - double normeBC=Math.sqrt(vBC.x*vBC.x+vBC.y*vBC.y+vBC.z*vBC.z); - double produitScalaireBCBA=vBC.x*vBA.x+vBC.y*vBA.y+vBC.z*vBA.z; - double rapportSurBC=produitScalaireBCBA/(normeBC*normeBC); - return new Coordinate(vBC.x*rapportSurBC+_b.x, vBC.y*rapportSurBC+_b.y, vBC.z*rapportSurBC+_b.z); - } - - /** - * Normalise le vecteur pass\xE9 en param\xE8tre. - */ - private Coordinate normalisation(Coordinate _a){ - double normeA=Math.sqrt(_a.x*_a.x+_a.y*_a.y+_a.z*_a.z); - _a.x=_a.x/normeA; - _a.y=_a.y/normeA; - _a.z=_a.z/normeA; - return _a; - } - - /** - * Compars les deux vecteurs avec la tol\xE9rance donn\xE9e. - * Le dernier param\xE8tre indique si un normalisation des - * deux vecteurs doit \xEAtre faite avec la comparaison. - * Les vecteurs ne sont pas modif\xE9s dans l'op\xE9ration. - */ - private boolean egal(Coordinate _a, Coordinate _b, double _tolerance, boolean _normalisation) { - if(_normalisation){ - normalisation(_a); - normalisation(_b); - } - Coordinate diff=vec(_a, _b); - return Math.abs(diff.x)<_tolerance&&Math.abs(diff.y)<_tolerance&&Math.abs(diff.z)<_tolerance; - } - } 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-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/UtilsProfil1d.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -9,6 +9,7 @@ import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISPoint; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; import com.vividsolutions.jts.geom.Coordinate; @@ -18,7 +19,7 @@ /** * Quelques fonctions aidant pour la manipulation des profils en 1d. * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class UtilsProfil1d { @@ -105,4 +106,112 @@ return true; } + // Quelques fonctions m\xE9th\xE9matiques \\ + + /** + * retourne le vecteur _a, _b sous forme de Coordinate. + */ + static public Coordinate vec(Coordinate _a, Coordinate _b){ + return new Coordinate(_b.x-_a.x, _b.y-_a.y, _b.z-_a.z); + } + + /** + * Retourne la projection de _a sur la droite _b_c. + * Attention : Il s'agit bien d'une projection sur une + * droite et non un segment de droite : le r\xE9sultat + * peut \xEAtre en dehors de [_b, _c] + */ + static public Coordinate proj(Coordinate _a, Coordinate _b, Coordinate _c){ + Coordinate vBC=vec(_b, _c); + Coordinate vBA=vec(_b, _a); + double normeBC=Math.sqrt(vBC.x*vBC.x+vBC.y*vBC.y+vBC.z*vBC.z); + double produitScalaireBCBA=vBC.x*vBA.x+vBC.y*vBA.y+vBC.z*vBA.z; + double rapportSurBC=produitScalaireBCBA/(normeBC*normeBC); + return new Coordinate(vBC.x*rapportSurBC+_b.x, vBC.y*rapportSurBC+_b.y, vBC.z*rapportSurBC+_b.z); + } + + /** + * Normalise le vecteur pass\xE9 en param\xE8tre. + */ + static public Coordinate normalisation(Coordinate _a){ + double normeA=Math.sqrt(_a.x*_a.x+_a.y*_a.y+_a.z*_a.z); + _a.x=_a.x/normeA; + _a.y=_a.y/normeA; + _a.z=_a.z/normeA; + return _a; + } + + /** + * Compars les deux vecteurs avec la tol\xE9rance donn\xE9e. + * Le dernier param\xE8tre indique si un normalisation des + * deux vecteurs doit \xEAtre faite avec la comparaison. + * Les vecteurs ne sont pas modif\xE9s dans l'op\xE9ration. + */ + static public boolean egal(Coordinate _a, Coordinate _b, double _tolerance, boolean _normalisation) { + if(_normalisation){ + normalisation(_a); + normalisation(_b); + } + Coordinate diff=vec(_a, _b); + return Math.abs(diff.x)<_tolerance&&Math.abs(diff.y)<_tolerance&&Math.abs(diff.z)<_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. + */ + static public int getPreviousIndex(CoordinateSequence _geom, Coordinate _point) { + if(_geom.size()>0&&_point.equals(_geom.getCoordinate(0))) + return -1; + boolean fini=false; + int i=-1; + GISPoint point=new GISPoint(_point); + while (!fini&&++i<_geom.size()-1) + fini=(GISGeometryFactory.INSTANCE + .createLineString(new Coordinate[]{_geom.getCoordinate(i), _geom.getCoordinate(i+1)})).distance(point)<0.0001; + if(!fini) + return -2; + else + return i; + } + + /** + * Retourne l'index du point suivant la coordonn\xE9e indiqu\xE9e sur la coordinateSequence donn\xE9e. + * Retourne -1 si la coordonn\xE9e donn\xE9e correspond au dernier l'index. + * 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))) + return -1; + boolean fini=false; + int i=_geom.size()-1; + GISPoint point=new GISPoint(_point); + while (!fini&&--i>0) + fini=(GISGeometryFactory.INSTANCE + .createLineString(new Coordinate[]{_geom.getCoordinate(i-1), _geom.getCoordinate(i)})).distance(point)<0.0001; + if(!fini) + return -2; + else + return i; + } + + /** + * Retourne l'abscisse curviligne du point '_point' de la polyligne '_geom'. + * Si la coordonn\xE9e n'appartient pas \xE0 la geometry, -1 est retourn\xE9. + */ + static public double abscisseCurviligne(CoordinateSequence _geom, Coordinate _point){ + int i=getPreviousIndex(_geom, _point); + if(i==-1) + return 0; + if(i==-2) + return -1; + // Calcule de l'abscisse curviligne + double valueCurviligne=0; + for (int j=1; j<=i; j++) + valueCurviligne+=_geom.getCoordinate(j).distance(_geom.getCoordinate(j-1)); + // Mise \xE0 jour de l'abscisse curviligne + valueCurviligne+=_geom.getCoordinate(i).distance(_point); + return valueCurviligne; + } } 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 2008-12-24 15:09:43 UTC (rev 4315) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/view/VueBief.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -18,9 +18,9 @@ import org.fudaa.fudaa.modeleur.MdlImplementation; import org.fudaa.fudaa.modeleur.layer.MdlLayer1dAxe; import org.fudaa.fudaa.modeleur.layer.MdlLayer1dBank; +import org.fudaa.fudaa.modeleur.layer.MdlLayer2dConstraintLine; import org.fudaa.fudaa.modeleur.layer.MdlLayer2dDirectionLine; import org.fudaa.fudaa.modeleur.layer.MdlLayer2dProfile; -import org.fudaa.fudaa.modeleur.layer.MdlLayer2dStorageLimit; import org.fudaa.fudaa.modeleur.modeleur1d.controller.ControllerBief; import org.fudaa.fudaa.modeleur.modeleur1d.model.Bief; import org.fudaa.fudaa.sig.layer.FSigEditor; @@ -78,7 +78,7 @@ lignesDirectrices.modele(bief.lignesDirectrices_); groupeCalque.add(lignesDirectrices); // Ajout du calque de limites de stockage - MdlLayer2dStorageLimit limitesStockage=new MdlLayer2dStorageLimit((FSigEditor)gisEditor_); + MdlLayer2dConstraintLine limitesStockage=new MdlLayer2dConstraintLine((FSigEditor)gisEditor_); limitesStockage.modele(bief.limitesStockages_); groupeCalque.add(limitesStockage); // Ajout du calque de profils Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dBankPersistence.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dBankPersistence.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dBankPersistence.java 2008-12-30 15:19:53 UTC (rev 4316) @@ -0,0 +1,30 @@ +/* + * @creation 29 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.persistence; + +import org.fudaa.fudaa.modeleur.layer.MdlLayer1dBank; +import org.fudaa.fudaa.modeleur.layer.MdlLayer2dLine; +import org.fudaa.fudaa.modeleur.layer.MdlLayer2dProfile; +import org.fudaa.fudaa.sig.layer.FSigEditor; + +/** + * Gestion de la persistance pour un calque de lignes de rive. + * @author Emmanuel MARTIN + * @see MdlLayer2dProfile + */ +public class MdlLayer2dBankPersistence extends MdlLayer2dLinePersistence { + + /* (non-Javadoc) + * @see org.fudaa.fudaa.modeleur.persistence.MdlLayer2dLinePersistence#createNewLayer(org.fudaa.fudaa.sig.layer.FSigEditor) + */ + @Override + protected MdlLayer2dLine createNewLayer(FSigEditor _editor) { + return new MdlLayer1dBank(_editor); + } + +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/persistence/MdlLayer2dBankPersistence.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |