|
From: <bma...@us...> - 2015-04-16 15:30:17
|
Revision: 9109
http://sourceforge.net/p/fudaa/svn/9109
Author: bmarchan
Date: 2015-04-16 15:30:15 +0000 (Thu, 16 Apr 2015)
Log Message:
-----------
Ajout de la visualisation 3D des transects
Modified Paths:
--------------
trunk/soft/fudaa-lspiv/pom.xml
trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivImplementation.java
Added Paths:
-----------
trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivShow3DTransectPanel.java
trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivShow3DTransectAction.java
Modified: trunk/soft/fudaa-lspiv/pom.xml
===================================================================
--- trunk/soft/fudaa-lspiv/pom.xml 2015-04-16 15:28:24 UTC (rev 9108)
+++ trunk/soft/fudaa-lspiv/pom.xml 2015-04-16 15:30:15 UTC (rev 9109)
@@ -86,6 +86,10 @@
<artifactId>fudaa-sig</artifactId>
<version>1.7-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.fudaa.framework.ebli</groupId>
+ <artifactId>ebli-graphe-3D</artifactId>
+ </dependency>
</dependencies>
<build>
<plugins>
Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivImplementation.java
===================================================================
--- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivImplementation.java 2015-04-16 15:28:24 UTC (rev 9108)
+++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivImplementation.java 2015-04-16 15:30:15 UTC (rev 9109)
@@ -56,6 +56,7 @@
import org.fudaa.fudaa.piv.action.PivOrthoParamAction;
import org.fudaa.fudaa.piv.action.PivOrthoVerifyGRPAction;
import org.fudaa.fudaa.piv.action.PivSelectImagesAction;
+import org.fudaa.fudaa.piv.action.PivShow3DTransectAction;
import org.fudaa.fudaa.piv.metier.PivProject;
import org.fudaa.fudaa.piv.metier.PivProjectStateListener;
@@ -808,6 +809,7 @@
mn.add(get2dFrame().getVisuPanel().getRealView().getParamsTransectAction().buildMenuItem(EbliComponentFactory.INSTANCE));
mn.add(new PivComputeFlowAction(this));
mn.add(get2dFrame().getVisuPanel().getShowFlowAction().buildMenuItem(EbliComponentFactory.INSTANCE));
+ mn.add(new PivShow3DTransectAction(this));
mn.addSeparator(PivResource.getS("Vue"));
ButtonGroup bg=new ButtonGroup();
Added: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivShow3DTransectPanel.java
===================================================================
--- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivShow3DTransectPanel.java (rev 0)
+++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivShow3DTransectPanel.java 2015-04-16 15:30:15 UTC (rev 9109)
@@ -0,0 +1,264 @@
+package org.fudaa.fudaa.piv;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+
+import org.fudaa.ctulu.gui.CtuluDialogPanel;
+import org.fudaa.ebli.geometrie.GrPolyligne;
+import org.fudaa.ebli.graphe3D.EG3dGraph;
+import org.fudaa.ebli.graphe3D.data.EG3dLineModelAbstract;
+import org.fudaa.ebli.graphe3D.renderer.EG3dDefaultDataRenderer;
+import org.fudaa.ebli.graphe3D.ui.panel.EG3dGraphPanel;
+import org.fudaa.ebli.trace.TraceLigne;
+import org.fudaa.fudaa.piv.metier.PivFlowResults;
+import org.fudaa.fudaa.piv.metier.PivTransect;
+
+/**
+ * Un panneau de saisie des param\xE8tres du transect pour le calcul des d\xE9bits.
+ *
+ * @author Bertrand Marchand (mar...@de...)
+ * @version $Id$
+ */
+public class PivShow3DTransectPanel extends CtuluDialogPanel {
+ PivImplementation impl_;
+ EG3dGraph pnGraph_;
+ private EG3dDefaultDataRenderer transRenderer_;
+ private EG3dDefaultDataRenderer disRenderer_;
+
+ class TransectModel extends EG3dLineModelAbstract {
+ PivTransect trans_;
+ GrPolyligne pl_;
+
+ public TransectModel(PivTransect _trans) {
+ trans_=_trans;
+ pl_=trans_.getStraight();
+ }
+
+ @Override
+ public int getNbPoints() {
+ return pl_.nombre();
+ }
+
+ @Override
+ public float getX(int _idx) {
+ return (float)pl_.sommet(_idx).x_;
+ }
+
+ @Override
+ public float getY(int _idx) {
+ return (float)pl_.sommet(_idx).y_;
+ }
+
+ @Override
+ public float getZ(int _idx) {
+ return (float)pl_.sommet(_idx).z_;
+ }
+ }
+
+ class DischargeModel extends EG3dLineModelAbstract {
+ PivFlowResults res_;
+ PivTransect trans_;
+ double zniv_;
+ double ratio_;
+
+ public DischargeModel(PivTransect _trans, PivFlowResults _res, double _zniv) {
+ res_=_res;
+ trans_=_trans;
+ zniv_=_zniv;
+
+ double lgArrowMax=Double.NEGATIVE_INFINITY;
+ double vx;
+ double vy;
+ for (int i=0; i<_res.getNombre(); i++) {
+ vx=_res.getVx(i);
+ vy=_res.getVy(i);
+ lgArrowMax=Math.max(lgArrowMax,Math.sqrt(vx*vx+vy*vy));
+ }
+ ratio_=_trans.getStraight().longueurXY()/6./lgArrowMax;
+ }
+
+ // Le nombre est modifi\xE9 pour afficher les fleches + une ligne horizontale
+ @Override
+ public int getNbPoints() {
+ return res_.getNombre()*5+2;
+ }
+
+ @Override
+ public float getX(int _idx) {
+ // 1er point ligne horizontale
+ if (_idx==0) {
+ return (float)trans_.getStraight().sommet(0).x_;
+ }
+ // 2eme point ligne horizontale
+ if (_idx==1) {
+ return (float)trans_.getStraight().sommet(trans_.getStraight().nombre()-1).x_;
+ }
+ _idx-=2;
+
+ double vx;
+ double vy;
+ double lgFleche;
+
+ switch (_idx%5) {
+ // Point d'origine
+ case 0:
+ default:
+ return (float)res_.getX(_idx/5);
+ // Point extremit\xE9
+ case 1:
+ case 3:
+ return (float)(res_.getX(_idx/5)+res_.getVx(_idx/5)*ratio_);
+ // Point extremite 1 fleche
+ case 2:
+ vx=res_.getVx(_idx/5)*ratio_;
+ vy=res_.getVy(_idx/5)*ratio_;
+ lgFleche=Math.sqrt(vx*vx+vy*vy)/10.;
+ double angVit=Math.atan2(vy, vx);
+ double angFleche=angVit+5./6.*Math.PI;
+ return (float)(lgFleche*Math.cos(angFleche)+res_.getX(_idx/5)+vx);
+ // Point extremite 2 fleche
+ case 4:
+ vx=res_.getVx(_idx/5)*ratio_;
+ vy=res_.getVy(_idx/5)*ratio_;
+ lgFleche=Math.sqrt(vx*vx+vy*vy)/10.;
+ angVit=Math.atan2(vy,vx);
+ angFleche=angVit-5./6.*Math.PI;
+ return (float)(lgFleche*Math.cos(angFleche)+res_.getX(_idx/5)+vx);
+ }
+ }
+
+ @Override
+ public float getY(int _idx) {
+ // 1er point ligne horizontale
+ if (_idx==0) {
+ return (float)trans_.getStraight().sommet(0).y_;
+ }
+ // 2eme point ligne horizontale
+ else if (_idx==1) {
+ return (float)trans_.getStraight().sommet(trans_.getStraight().nombre()-1).y_;
+ }
+ _idx-=2;
+
+ double vx;
+ double vy;
+ double lgFleche;
+
+ switch (_idx%5) {
+ // Point d'origine
+ case 0:
+ default:
+ return (float)res_.getY(_idx/5);
+ // Point extremit\xE9
+ case 1:
+ case 3:
+ return (float)(res_.getY(_idx/5)+res_.getVy(_idx/5)*ratio_);
+ // Point extremite 1 fleche
+ case 2:
+ vx=res_.getVx(_idx/5)*ratio_;
+ vy=res_.getVy(_idx/5)*ratio_;
+ lgFleche=Math.sqrt(vx*vx+vy*vy)/10.;
+ double angVit=Math.atan2(vy, vx);
+ double angFleche=angVit+5./6.*Math.PI;
+ return (float)(lgFleche*Math.sin(angFleche)+res_.getY(_idx/5)+vy);
+ // Point extremite 2 fleche
+ case 4:
+ vx=res_.getVx(_idx/5)*ratio_;
+ vy=res_.getVy(_idx/5)*ratio_;
+ lgFleche=Math.sqrt(vx*vx+vy*vy)/10.;
+ angVit=Math.atan2(vy, vx);
+ angFleche=angVit-5./6.*Math.PI;
+ return (float)(lgFleche*Math.sin(angFleche)+res_.getY(_idx/5)+vy);
+ }
+ }
+
+ @Override
+ public float getZ(int _idx) {
+ return (float)zniv_;
+ }
+ }
+
+ /**
+ * Constructeur.
+ */
+ public PivShow3DTransectPanel(PivImplementation _impl) {
+ impl_=_impl;
+ customize();
+ }
+
+ private void customize() {
+ setLayout(new BorderLayout());
+
+ transRenderer_=new EG3dDefaultDataRenderer();
+ transRenderer_.setLineColor(0, Color.ORANGE);
+ transRenderer_.setLineThickness(0, 1.f);
+
+ disRenderer_=new EG3dDefaultDataRenderer() {
+ @Override
+ public int getLineStyle(int _idx) {
+ if (_idx==0)
+ return TraceLigne.TIRETE;
+ if (_idx==1)
+ return TraceLigne.INVISIBLE;
+
+ _idx-=2;
+ if (_idx%5==4)
+ return TraceLigne.INVISIBLE;
+ else
+ return lm.getTypeTrait();
+ }
+ };
+ disRenderer_.setLineColor(0, Color.BLUE.darker());
+ disRenderer_.setLineThickness(0, 1.f);
+
+ EG3dGraphPanel pn=new EG3dGraphPanel();
+ pn.setPreferredSize(new Dimension(700,500));
+
+ pn.getBtnPanel().showSurfaceButton(false);
+
+ pnGraph_=pn.getView();
+// pnGraph_.getViewRenderer().setDisplayGrids(true);
+ pnGraph_.getViewRenderer().getProjector().setDistance(100000.f);
+ pnGraph_.getViewRenderer().getProjector().setRotationAngle(160);
+ pnGraph_.getViewRenderer().getProjector().setElevationAngle(20);
+
+ this.add(pn,BorderLayout.CENTER);
+ setHelpText(PivResource.getS("Clic gauche : Rotation de la vue\nCtrl+clic gauche : D\xE9placement de la vue\nShift+clic gauche : Zoom de la vue"));
+ }
+
+ public void setSelectedTransects(int... _isels) {
+ pnGraph_.removeAllDatas();
+
+ PivTransect[] transects=impl_.getCurrentProject().getTransects();
+
+ for (int i=0; i<_isels.length; i++) {
+ TransectModel mdl=new TransectModel(transects[_isels[i]]);
+ pnGraph_.addData(mdl);
+ pnGraph_.setDataRenderer(i, transRenderer_);
+ }
+
+ PivFlowResults[] res=impl_.getCurrentProject().getFlowResults();
+ if (res!=null) {
+ for (int i=0; i<_isels.length; i++) {
+ DischargeModel mdl=new DischargeModel(transects[_isels[i]],res[_isels[i]], impl_.getCurrentProject().getOrthoParameters().getResolution());
+ pnGraph_.addData(mdl);
+ pnGraph_.setDataRenderer(i+_isels.length, disRenderer_);
+ }
+ }
+
+ // Retaillage des limites de boite pour un ratio identique sur X et Y
+ float[] xrange=pnGraph_.getRangeX();
+ float[] yrange=pnGraph_.getRangeY();
+ float delta=(xrange[1]-xrange[0])-(yrange[1]-yrange[0]);
+ if (delta>0) {
+ yrange[0]-=delta/2.;
+ yrange[1]+=delta/2.;
+ pnGraph_.setRangeY(yrange[0], yrange[1]);
+ }
+ else {
+ xrange[0]+=delta/2.;
+ xrange[1]-=delta/2.;
+ pnGraph_.setRangeX(xrange[0], xrange[1]);
+ }
+ }
+}
Property changes on: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivShow3DTransectPanel.java
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivShow3DTransectAction.java
===================================================================
--- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivShow3DTransectAction.java (rev 0)
+++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivShow3DTransectAction.java 2015-04-16 15:30:15 UTC (rev 9109)
@@ -0,0 +1,72 @@
+/*
+ * @creation 3 juil. 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.piv.action;
+
+import java.awt.event.ActionEvent;
+
+import org.fudaa.ctulu.gui.CtuluDialog;
+import org.fudaa.ebli.calque.BCalque;
+import org.fudaa.ebli.calque.ZSelectionEvent;
+import org.fudaa.ebli.calque.ZSelectionListener;
+import org.fudaa.ebli.calque.edition.ZCalqueLigneBriseeEditable;
+import org.fudaa.ebli.commun.EbliActionSimple;
+import org.fudaa.fudaa.piv.PivImplementation;
+import org.fudaa.fudaa.piv.PivResource;
+import org.fudaa.fudaa.piv.PivShow3DTransectPanel;
+
+/**
+ * Une action pour afficher le transect selectionn\xE9 suivant un graphe 3D.
+ *
+ * @author Bertrand Marchand (mar...@de...)
+ * @version $Id$
+ */
+public class PivShow3DTransectAction extends EbliActionSimple implements ZSelectionListener {
+ PivImplementation impl;
+ PivShow3DTransectPanel pn;
+
+ public PivShow3DTransectAction(PivImplementation _impl) {
+ super(PivResource.getS("Graphe 3D du(des) transect(s)..."), null, "SHOW_3D_GRAPH_TRANS");
+ impl=_impl;
+ _impl.get2dFrame().getVisuPanel().getScene().addSelectionListener(this);
+
+ setEnabled(false);
+ }
+
+ /**
+ * Affiche le panneau des param\xE8tres de calcul.
+ * @param _e L'evenement pour l'action.
+ */
+ @Override
+ public void actionPerformed(final ActionEvent _e) {
+ int[] isels=impl.get2dFrame().getVisuPanel().getRealView().getTransectLayer().getSelectedIndex();
+//
+// if (pn==null)
+ pn=new PivShow3DTransectPanel(impl);
+ pn.setSelectedTransects(isels);
+//
+ pn.afficheModale(impl.getFrame(), PivResource.getS("Vue 3D du(des) transect(s)"),CtuluDialog.OK_OPTION);
+ }
+
+ @Override
+ public String getEnableCondition() {
+ return PivResource.getS("S\xE9lectionner au moins un transect");
+ }
+
+ @Override
+ public void selectionChanged(ZSelectionEvent _evt) {
+ boolean b=false;
+ BCalque cq=impl.get2dFrame().getVisuPanel().getCalqueActif();
+
+ if (cq==impl.get2dFrame().getVisuPanel().getRealView().getTransectLayer() &&
+ ((ZCalqueLigneBriseeEditable)cq).getLayerSelection() !=null &&
+ ((ZCalqueLigneBriseeEditable)cq).getLayerSelection().getNbSelectedIndex()>0) {
+ b=true;
+ }
+ super.setEnabled(b);
+ }
+}
Property changes on: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivShow3DTransectAction.java
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|