From: <emm...@us...> - 2008-11-21 16:29:43
|
Revision: 4234 http://fudaa.svn.sourceforge.net/fudaa/?rev=4234&view=rev Author: emmanuel_martin Date: 2008-11-21 16:29:32 +0000 (Fri, 21 Nov 2008) Log Message: ----------- tache #90 :"Calculer un abscisse curviligne" Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java Added Paths: ----------- 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/BPaletteAbscisseCurviligne.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/ZCalqueAbscisseCurviligneInteraction.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java 2008-11-20 14:48:50 UTC (rev 4233) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java 2008-11-21 16:29:32 UTC (rev 4234) @@ -32,7 +32,7 @@ * Permet de visionner des distances. * * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class ZCalqueDistanceInteraction extends BCalqueInteraction implements MouseListener, MouseMotionListener { @@ -66,7 +66,7 @@ return new Coordinate(tmp.x_, tmp.y_); } - /** Converti une coordonn\xE9e reel en coordonn\xE9e \xE9cran. */ + /** Converti une coordonn\xE9e \xE9cran en coordonn\xE9e r\xE9el. */ protected Coordinate ecranToReel(Coordinate coord){ GrPoint tmp=new GrPoint(coord.x, coord.y, 0); tmp.autoApplique(getVersReel()); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2008-11-20 14:48:50 UTC (rev 4233) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlEditionManager.java 2008-11-21 16:29:32 UTC (rev 4234) @@ -27,6 +27,7 @@ import org.fudaa.ebli.commun.EbliActionAbstract; import org.fudaa.ebli.commun.EbliActionInterface; import org.fudaa.fudaa.commun.FudaaLib; +import org.fudaa.fudaa.modeleur.action.SceneAbscisseCurviligneAction; import org.fudaa.fudaa.modeleur.action.SceneDecimationAction; import org.fudaa.fudaa.modeleur.action.SceneInterpolationAction; import org.fudaa.fudaa.modeleur.action.SceneInvertAction; @@ -73,6 +74,7 @@ acts.add(new SceneRefinementAction((MdlSceneEditor)sceneEditor_)); acts.add(new SceneInvertAction((MdlSceneEditor)sceneEditor_)); acts.add(new SceneProjectionAction((MdlSceneEditor)sceneEditor_)); + acts.add(new SceneAbscisseCurviligneAction(this)); getSceneEditor().setActions(acts.toArray(new EbliActionAbstract[0])); } Added: 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 (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneAbscisseCurviligneAction.java 2008-11-21 16:29:32 UTC (rev 4234) @@ -0,0 +1,188 @@ +/* + * @creation 20 nov. 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.action; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.JComponent; +import javax.swing.event.InternalFrameEvent; + +import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.ctulu.gis.GISPolygone; +import org.fudaa.ctulu.gis.GISPolyligne; +import org.fudaa.ebli.calque.BCalqueInteraction; +import org.fudaa.ebli.calque.ZCalqueAffichageDonneesInterface; +import org.fudaa.ebli.calque.ZEbliCalquesPanel; +import org.fudaa.ebli.calque.ZModeleGeometry; +import org.fudaa.ebli.calque.ZScene; +import org.fudaa.ebli.calque.ZSelectionEvent; +import org.fudaa.ebli.calque.ZSelectionListener; +import org.fudaa.ebli.calque.edition.ZEditorDefault; +import org.fudaa.ebli.commun.EbliActionPaletteAbstract; +import org.fudaa.ebli.ressource.EbliResource; +import org.fudaa.fudaa.modeleur.layer.BPaletteAbscisseCurviligne; +import org.fudaa.fudaa.modeleur.layer.ZCalqueAbscisseCurviligneInteraction; +import org.fudaa.fudaa.sig.layer.FSigVisuPanel; + +import com.memoire.bu.BuPalette; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.CoordinateSequence; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.Point; + +/** + * Une action pour afficher une palette indiquant l'abscisse curviligne d'un axe + * hydaulique. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class SceneAbscisseCurviligneAction extends EbliActionPaletteAbstract implements PropertyChangeListener, ZSelectionListener { + + private ZEbliCalquesPanel calquesPanel_; + private ZScene scene_; + // Calque ne fermant pas l'edition \\ + private BCalqueInteraction calqueZoom_; + private BCalqueInteraction calqueDeplacementVue_; + /** Le calque contenant les informations de distance. */ + private ZCalqueAbscisseCurviligneInteraction calqueAbscisseCurviligne_; + /** La geometrie selectionn\xE9 sur laquelle le calcul de l'abcisse curviligne est effectu\xE9.*/ + private LineString selectedGeometry_; + /** La palette affichant la donn\xE9e curviligne. */ + private BPaletteAbscisseCurviligne palette_; + /** La internalFrame*/ + private BuPalette interFrame_; + + public SceneAbscisseCurviligneAction(final ZEditorDefault _editor) { + super(EbliResource.EBLI.getString("Abscisse curviligne"), null, "PALETTE_ABSCISSE_CURVILIGNE"); + scene_=_editor.getSceneEditor().getScene(); + scene_.addSelectionListener(this); + calquesPanel_=_editor.getPanel(); + calquesPanel_.getController().addPropertyChangeListener("gele", this); + calqueZoom_=calquesPanel_.getController().getCalqueInteraction("cqAGRANDIR"); + calqueDeplacementVue_=calquesPanel_.getController().getCalqueInteraction("cqDEPLACEMENT_VUE-I"); + calqueAbscisseCurviligne_=new ZCalqueAbscisseCurviligneInteraction(this); + calqueAbscisseCurviligne_.setGele(true); + calquesPanel_.addCalqueInteraction(calqueAbscisseCurviligne_); + calqueAbscisseCurviligne_.addPropertyChangeListener("gele", this); + setEnabled(false); + } + + public String getEnableCondition() { + return EbliResource.EBLI.getString("<p>selectionner une polyligne ou un polygone.</p>"); + } + + @Override + public void changeAction() { + if (isSelected()) { + calquesPanel_.setCalqueInteractionActif(calqueAbscisseCurviligne_); + if (palette_==null) + // Cr\xE9ation de l'internal frame affichant l'information curviligne + palette_=new BPaletteAbscisseCurviligne(calqueAbscisseCurviligne_, calquesPanel_.getController().getEbliFormatter(), + calquesPanel_); + if(interFrame_==null){ + interFrame_=new BuPalette(); + interFrame_.setResizable(true); + interFrame_.setContent((BPaletteAbscisseCurviligne)palette_); + interFrame_.setClosable(true); + interFrame_.pack(); + interFrame_.addInternalFrameListener(this); + } + ((FSigVisuPanel)calquesPanel_).getImpl().getMainPanel().getDesktop().addInternalFrame(interFrame_); + } + else { + calquesPanel_.unsetCalqueInteractionActif(calqueAbscisseCurviligne_); + ((FSigVisuPanel)calquesPanel_).getImpl().getMainPanel().getDesktop().removeInternalFrame(interFrame_); + if (calquesPanel_.getController().getCqSelectionI()!=null) + calquesPanel_.getController().getCqSelectionI().setGele(false); + } + } + + public void propertyChange(PropertyChangeEvent _evt) { + // Cas un autre calque que celui du zoom, du deplacement de vue et d'edition + // est d\xE9gel\xE9 donc on ferme le pannel d'edition si il \xE9tait ouvert. + if (_evt.getSource()!=calqueZoom_&&_evt.getSource()!=calqueDeplacementVue_&&_evt.getSource()!=calqueAbscisseCurviligne_ + &&!((Boolean)_evt.getNewValue()).booleanValue()&&isSelected()) { + setSelected(false); + ((FSigVisuPanel)calquesPanel_).getImpl().getMainPanel().getDesktop().removeInternalFrame(interFrame_); + } + } + + /* (non-Javadoc) + * @see org.fudaa.ebli.calque.ZSelectionListener#selectionChanged(org.fudaa.ebli.calque.ZSelectionEvent) + */ + public void selectionChanged(ZSelectionEvent _evt) { + /* + * Si une seule g\xE9om\xE9trie est selectionn\xE9e et que cette g\xE9om\xE9trie est une + * polyligne ou un polygone, alors l'action de calcul d'abcisses curvilignes + * est activable et un ref\xE9rence sur cette g\xE9om\xE9trie est concerv\xE9e dans + * 'selectedGeometry_'. + */ + if (scene_.isOnlyOneObjectSelected()) { + int idxGeom=scene_.getSelectionHelper().getUniqueSelectedIdx(); + ZCalqueAffichageDonneesInterface calque=scene_.getLayerForId(idxGeom); + Geometry geom=((ZModeleGeometry)calque.modeleDonnees()).getGeomData().getGeometry(scene_.sceneId2LayerId(idxGeom)); + setEnabled(calque.isOnlyOneObjectSelected()&&(geom instanceof GISPolyligne||geom instanceof GISPolygone)); + if (isEnabled()) + selectedGeometry_=((LineString)geom); + else + selectedGeometry_=null; + } + else { + setEnabled(false); + selectedGeometry_=null; + } + } + + /** + * Est appel\xE9 par le calque d'interaction pour indiquer le point click\xE9. + * @param _coord la coordonn\xE9 r\xE9el. + */ + public void coordinateClicked(Coordinate _coord, double tolerance){ + Point ptClick=new GeometryFactory().createPoint(_coord); + if (selectedGeometry_!=null&&selectedGeometry_.distance(ptClick)<tolerance) { + // Recherche de l'index du dernier point de la polyligne \xE0 prendre en + // compte. + boolean fini=false; + int i=-1; + CoordinateSequence coordSeq=selectedGeometry_.getCoordinateSequence(); + while (!fini&&++i<selectedGeometry_.getNumPoints()-1) + fini=(GISGeometryFactory.INSTANCE + .createLineString(new Coordinate[]{coordSeq.getCoordinate(i), coordSeq.getCoordinate(i+1)})).distance(ptClick)<tolerance; + // Calcule de l'abscisse curviligne + double valueCurviligne=0; + for (int j=1; j<=i; j++) + valueCurviligne+=Math.sqrt(Math.pow(coordSeq.getOrdinate(j, 0)-coordSeq.getOrdinate(j-1, 0), 2) + +Math.pow(coordSeq.getOrdinate(j, 1)-coordSeq.getOrdinate(j-1, 1), 2)); + valueCurviligne+=Math.sqrt(Math.pow(coordSeq.getOrdinate(i, 0)-ptClick.getX(), 2) + +Math.pow(coordSeq.getOrdinate(i, 1)-ptClick.getY(), 2)); + ((BPaletteAbscisseCurviligne)palette_).setAbcisseCurviligne(valueCurviligne); + } + } + + public void internalFrameClosed(InternalFrameEvent e){ + // Lorsque la palette est ferm\xE9e, on d\xE9selectionne l'action, d\xE9active le + // calque, supprime l'internal frame et active la selection + setSelected(false); + calquesPanel_.unsetCalqueInteractionActif(calqueAbscisseCurviligne_); + ((FSigVisuPanel)calquesPanel_).getImpl().getMainPanel().getDesktop().removeInternalFrame(interFrame_); + if (calquesPanel_.getController().getCqSelectionI()!=null) + calquesPanel_.getController().getCqSelectionI().setGele(false); + } + + /** + * M\xE9thode non utilis\xE9 dans cette classe : l'impl\xE9mentation de changeAction() ne fait pas de super. + */ + @Override + public JComponent buildContentPane() { + return null; + } +} \ No newline at end of file Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/SceneAbscisseCurviligneAction.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/BPaletteAbscisseCurviligne.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/BPaletteAbscisseCurviligne.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/BPaletteAbscisseCurviligne.java 2008-11-21 16:29:32 UTC (rev 4234) @@ -0,0 +1,106 @@ +/* + * @creation 20 nov. 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.BorderLayout; +import java.awt.Container; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; + +import org.fudaa.ctulu.gui.CtuluDialogPanel; +import org.fudaa.ebli.calque.ZEbliCalquesPanel; +import org.fudaa.ebli.commun.BPalettePanelInterface; +import org.fudaa.ebli.commun.EbliFormatterInterface; +import org.fudaa.ebli.commun.EbliLib; + +import com.memoire.bu.BuButton; +import com.memoire.bu.BuLabel; + +/** + * Palette affichant un abscisse curviligne. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class BPaletteAbscisseCurviligne extends CtuluDialogPanel implements ActionListener, BPalettePanelInterface, PropertyChangeListener { + + /** Label affichant l'abscisse curviligne. */ + protected BuLabel lblCoordonneeCurviligne_=new BuLabel(); + /** Le calque qui contient les informations curvilignes. */ + protected ZCalqueAbscisseCurviligneInteraction calqueAbscisseCurviligne_; + /** Le bouton 'reprise'. */ + protected BuButton btReprise_=new BuButton(EbliLib.getS("Reprise")); + protected EbliFormatterInterface formatter_; + private ZEbliCalquesPanel calquesPanel_; + + public BPaletteAbscisseCurviligne(ZCalqueAbscisseCurviligneInteraction _calqueAbscisseCurviligne, EbliFormatterInterface _formatter, ZEbliCalquesPanel _calquesPanel){ + calquesPanel_=_calquesPanel; + calqueAbscisseCurviligne_=_calqueAbscisseCurviligne; + calqueAbscisseCurviligne_.addPropertyChangeListener("gele", this); + formatter_=_formatter; + // Construction du panel \\ + setLayout(new BorderLayout()); + // Titre + BuLabel lblTitre=new BuLabel("<html><b>"+EbliLib.getS("Abscisse curviligne")+"</b></html>"); + lblTitre.setHorizontalAlignment(BuLabel.CENTER); + add(lblTitre, BorderLayout.NORTH); + // Contenu + Container body=new Container(); + body.setLayout(new GridLayout(1, 2, 2, 2)); + body.add(new BuLabel("Valeur curviligne : ")); + body.add(lblCoordonneeCurviligne_); + add(body, BorderLayout.CENTER); + // Bouton reprise + add(btReprise_, BorderLayout.SOUTH); + btReprise_.addActionListener(this); + btReprise_.setEnabled(false); + // Affichage + setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + setVisible(true); + // Valeurs \\ + setAbcisseCurviligne(0); + } + + public boolean valide(){ + return true; + } + + public JComponent getComponent() { + return this; + } + + public boolean setPalettePanelTarget(Object _target) { + return false; + } + + public void paletteDeactivated() {} + + public void doAfterDisplay() {} + + public void propertyChange(PropertyChangeEvent evt) { + if(evt.getPropertyName().equals("gele")) + btReprise_.setEnabled((Boolean) evt.getNewValue()); + } + + /* (non-Javadoc) + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + public void actionPerformed(ActionEvent e) { + calquesPanel_.setCalqueInteractionActif(calqueAbscisseCurviligne_); + } + + public void setAbcisseCurviligne(double _value){ + lblCoordonneeCurviligne_.setText(formatter_.getXYFormatter().format(_value)); + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/BPaletteAbscisseCurviligne.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/ZCalqueAbscisseCurviligneInteraction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/ZCalqueAbscisseCurviligneInteraction.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/ZCalqueAbscisseCurviligneInteraction.java 2008-11-21 16:29:32 UTC (rev 4234) @@ -0,0 +1,82 @@ +/* + * @creation 20 nov. 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.Cursor; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import org.fudaa.ebli.calque.BCalqueInteraction; +import org.fudaa.ebli.geometrie.GrPoint; +import org.fudaa.ebli.ressource.EbliResource; +import org.fudaa.fudaa.modeleur.action.SceneAbscisseCurviligneAction; + +import com.memoire.bu.BuResource; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Permet de capter des \xE9v\xE9nements souris pour calculer un abscisse curviligne. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class ZCalqueAbscisseCurviligneInteraction extends BCalqueInteraction implements MouseListener { + + /** L'action g\xE9rant le calcule de l'abcisse curviligne. */ + private SceneAbscisseCurviligneAction controller_; + + public ZCalqueAbscisseCurviligneInteraction(SceneAbscisseCurviligneAction _controller){ + setName("cqInteractifAbscisseCurviligne"); + controller_=_controller; + } + + /** Converti une coordonn\xE9e \xE9cran en coordonn\xE9e r\xE9el. */ + protected Coordinate ecranToReel(Coordinate coord){ + GrPoint tmp=new GrPoint(coord.x, coord.y, 0); + tmp.autoApplique(getVersReel()); + return new Coordinate(tmp.x_, tmp.y_); + } + + public Cursor getSpecificCursor() { + return EbliResource.EBLI.getCursor("curseur_distance", -1, new Point(2, 2)); + } + + public boolean alwaysPaint() { + return true; + } + + public String getDescription() { + return BuResource.BU.getString("Calculer un abscisse curviligne."); + } + + // M\xE9thodes g\xE9rant les \xE9v\xE9nements. \\ + + public void mouseClicked(final MouseEvent _evt) {} + + public void mouseEntered(final MouseEvent _evt) {} + + public void mousePressed(final MouseEvent _evt) {} + + public void mouseExited(final MouseEvent _evt) {} + + public void mouseReleased(final MouseEvent _evt) { + if (!isGele()&&_evt.getButton()==MouseEvent.BUTTON1){ + // Calcule de la tol\xE9rance au click + double tolerance; + GrPoint p1=new GrPoint(0, 0, 0); + GrPoint p2=new GrPoint(1, 1, 0); + tolerance=p1.distance(p2)*5; + p1.autoApplique(getVersEcran()); + p2.autoApplique(getVersEcran()); + tolerance/=p1.distance(p2); + // Mise a jour de l'action + controller_.coordinateClicked(ecranToReel(new Coordinate(_evt.getX(), _evt.getY())), tolerance); + } + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/layer/ZCalqueAbscisseCurviligneInteraction.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. |