Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYSilosEditor.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) <2012> <EDF-R&D> <FRANCE>
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10  * See the GNU General Public License for more details.
11  * You should have received a copy of the GNU General Public License along
12  * with this program; if not, write to the Free Software Foundation, Inc.,
13  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
14  */
15 
21 #include <math.h>
22 #include <qinputdialog.h>
23 
24 #include "Tympan/core/logging.h"
37 #include "TYSilosEditor.h"
38 
39 #define TR(id) OLocalizator::getString("TYSilosEditor", (id))
40 
42 {
45  OColor oLineColor;
46  oLineColor.r = 1.0;
47  oLineColor.g = 0.0;
48  oLineColor.b = 0.0;
49  _pOGLRectangleElement->setColor(oLineColor);
50  _pOGLRectangleElement->setPoint0(OPoint3D(0.0, 0.0, 0.0));
51  _pOGLRectangleElement->setPoint1(OPoint3D(0.0, 0.0, 0.0));
52  _pOGLRectangleElement->setPoint2(OPoint3D(0.0, 0.0, 0.0));
53  _pOGLRectangleElement->setPoint3(OPoint3D(0.0, 0.0, 0.0));
55 
56  _moving = false;
57  _active = false;
59 }
60 
62 {
64  delete _pOGLRectangleElement;
65 }
66 
68 
70 {
71  _moving = false;
72  _active = false;
73 
74  showText(false);
75 
78 }
79 
81 {
82  cancel();
83 }
84 
86 
88 {
89  if (view == TYModelerFrame::TopView)
90  {
91  _active = true;
92  }
93  else
94  {
95  _active = false;
96  }
97 }
98 
99 void TYSilosEditor::slotMousePressed(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
100 {
101  if ((button == Qt::LeftButton) && _active)
102  {
103  // Init points
104  _pOGLRectangleElement->setPoint0(OPoint3D(x, _pInteractor->height() - y, 0.0));
105  _pOGLRectangleElement->setPoint1(OPoint3D(x, _pInteractor->height() - y, 0.0));
106  _pOGLRectangleElement->setPoint2(OPoint3D(x, _pInteractor->height() - y, 0.0));
107  _pOGLRectangleElement->setPoint3(OPoint3D(x, _pInteractor->height() - y, 0.0));
108  _moving = true;
109  }
110 }
111 
112 void TYSilosEditor::slotMouseReleased(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
113 {
114  if ((button == Qt::LeftButton) && _active && _moving)
115  {
116  _moving = false;
117 
118  float pt0[2], pt1[2], pt2[2];
128  pt0[0] = point0.x;
129  pt0[1] = point0.z;
130  pt1[0] = point1.x;
131  pt1[1] = point1.z;
132  pt2[0] = point2.x;
133  pt2[1] = point2.z;
134 
135  double diameter = ABS(pt1[0] - pt0[0]);
136 
137  // Si la grille magnetique est activee
139  {
140  double dummy = NAN;
141  snapToGrid(diameter, dummy, dummy, _gridMagnStep);
142  }
143 
144  if (diameter == 0.0)
145  {
146  return;
147  }
148  else if (diameter != 0.0)
149  {
150  TYAction* pAction = NULL;
151  // 2 cas :
152  // - le modeleur est un modeleur de site
153  // - le modeleur est un modeleur de batiment
154  if (QString(_pModeler->metaObject()->className()).compare("TYBatimentModelerFrame") == 0)
155  {
156  // Nouveau cylindre
157  LPTYAcousticCylinderGeoNode pCylGeoNode =
159  LPTYAcousticCylinder pCyl = TYAcousticCylinder::safeDownCast(pCylGeoNode->getElement());
160  pCyl->setDiameter(diameter);
161  pCyl->setHauteur(2.0);
162 
163  // Position
164  TYPoint org((pt0[0] + (pt1[0] - pt0[0]) / 2.0), -(pt1[1] + (pt2[1] - pt1[1]) / 2.0),
165  pCyl->getHauteur() / 2.0);
166 
167  // Si la grille magnetique est activee
169  {
170  snapToGrid(org._x, org._y, org._z, _gridMagnStep);
171  }
172 
173  pCylGeoNode->getORepere3D()._origin = org;
174 
175  // Ajout au batiment
176  LPTYBatiment pBat = getBatiment();
177  if (pBat != NULL)
178  {
179  pBat->addAcousticVol((LPTYAcousticVolumeGeoNode&)pCylGeoNode);
180  pBat->updateGraphicTree();
181  }
182 
183  pAction = new TYAddAccVolToAccVolNodeAction((LPTYAcousticVolumeGeoNode&)pCylGeoNode,
184  getBatiment(), _pModeler, TR("id_action_addcyl"));
185  }
186  else if (QString(_pModeler->metaObject()->className()).compare("TYSiteModelerFrame") == 0)
187  {
188  // Creation du cylindre
189  LPTYAcousticCylinderGeoNode pCylGeoNode =
191  LPTYAcousticCylinder pCyl = TYAcousticCylinder::safeDownCast(pCylGeoNode->getElement());
192  pCyl->setDiameter(diameter);
193  pCyl->setHauteur(2.0);
194 
195  // Creation d'un nouveau batiment a partir du silos
196  LPTYBatimentGeoNode pBatNode = new TYBatimentGeoNode(new TYBatiment());
197 
198  // Ajout du cylindre au batiment
199  TYBatiment::safeDownCast(pBatNode->getElement())->addAcousticVol(pCylGeoNode, false);
200 
201  // Gestion de la position de l'objet
202  // Position
203  TYPoint org((pt0[0] + (pt1[0] - pt0[0]) / 2.0), -(pt1[1] + (pt2[1] - pt1[1]) / 2.0),
204  pCyl->getHauteur() / 2.0);
205 
206  // Si la grille magnetique est activee
208  {
209  snapToGrid(org._x, org._y, org._z, _gridMagnStep);
210  }
211 
212  ORepere3D repere = pBatNode->getORepere3D();
213 
214  repere._origin = org;
215 
216  pBatNode->setRepere(repere);
217 
218  // Ajout dans l'infrastructure
219  LPTYSiteNode pSite = getSite();
220  if (pSite != NULL)
221  {
222  // Ajout du atiment dans l'infrastructure
223  pSite->getInfrastructure()->addBatiment(pBatNode);
224 
225  pSite->updateGraphicTree();
226  }
227 
228  pAction = new TYAddElementToInfraAction(pBatNode, pSite->getInfrastructure(), _pModeler,
229  TR("id_action_addetage"));
230  }
231 
232  if (pAction != NULL)
233  {
234  _pModeler->getActionManager()->addAction(pAction);
235  }
237 
238  // repasse en mode camera selection
240  }
241 
242  showText(false);
243 
246 
248 
250  }
251 }
252 
253 void TYSilosEditor::slotMouseMoved(int x, int y, Qt::MouseButtons button, Qt::KeyboardModifiers state)
254 {
255  if (_active && _moving)
256  {
257  float w = NAN;
258 
259  w = ABS(x - _pOGLRectangleElement->getPoint0()[0]);
260 
265 
266  float pt0[2], pt1[2];
276  pt0[0] = point0.x;
277  pt0[1] = point0.z;
278  pt1[0] = point1.x;
279  pt1[1] = point1.z;
280 
281  double diameter = ABS(pt1[0] - pt0[0]);
282 
283  // Si la grille magnetique est activee
285  {
286  double dummy = NAN;
287  snapToGrid(diameter, dummy, dummy, _gridMagnStep);
288  }
289 
290  updateText(
291  QString(TR("id_diameter_info")).arg(diameter, 0, 'f', 2),
292  (int)(_pOGLRectangleElement->getPoint0()[0] +
294  (int)(_pOGLRectangleElement->getPoint1()[1] +
296 
299  }
300 }
301 
303 {
304  Q_CHECK_PTR(_pModeler);
305  LPTYBatiment pBatiment = NULL;
306 
307  if (QString(_pModeler->metaObject()->className()).compare("TYBatimentModelerFrame") == 0)
308  {
309  pBatiment = ((TYBatimentModelerFrame*)_pModeler)->getBatiment();
310  }
311 
312  Q_CHECK_PTR(pBatiment);
313 
314  return pBatiment;
315 }
316 
318 {
319  Q_CHECK_PTR(_pModeler);
320 
321  LPTYSiteNode pSite = NULL;
322 
323  if (QString(_pModeler->metaObject()->className()).compare("TYSiteModelerFrame") == 0)
324  {
325  pSite = ((TYSiteModelerFrame*)_pModeler)->getSite();
326  }
327 
328  Q_CHECK_PTR(pSite);
329 
330  return pSite;
331 }
double ABS(double a)
Return the absolute value.
Definition: 3d.h:67
TYGeometryNode TYAcousticCylinderGeoNode
Noeud geometrique de type TYAcousticCylinder.
fichier contenant differents types d'actions (fichier header)
TYMainWindow * getTYMainWnd()
Retourne le pointeur sur la fenetre principale.
pour l'application Tympan (fichier header)
Modeler specialisee pour l'edition des batiments (fichier header)
TYGeometryNode TYBatimentGeoNode
Noeud geometrique de type TYBatiment.
Definition: TYBatiment.h:90
Fenetre principale de l'application Tympan (fichier header)
Classe generique pour une fenetre de modeleur (fichier header)
Le role de cette classe est limite a emettre des signaux pouvant etre utilise pour interagir sur le r...
#define TR(id)
gestion de l'edition d'un silo (fichier header)
Classe Modeler specialisee pour l'edition des sites (fichier header)
Definition: NxVec3.h:23
NxReal z
Definition: NxVec3.h:80
NxReal x
Definition: NxVec3.h:80
Definition: color.h:31
float b
Definition: color.h:33
float r
Definition: color.h:33
float g
Definition: color.h:33
double _y
y coordinate of OCoord3D
Definition: 3d.h:283
double _z
z coordinate of OCoord3D
Definition: 3d.h:284
double _x
x coordinate of OCoord3D
Definition: 3d.h:282
static NxVec3 displayToWorld(NxVec3 display)
Definition: OGLCamera.cpp:699
void setVisibility(bool bVisible)
Definition: OGLElement.h:51
void setColor(const OColor &oColor)
void setPoint2(const OPoint3D &point2)
void setPoint3(const OPoint3D &point3)
void setPoint0(const OPoint3D &point0)
void setPoint1(const OPoint3D &point1)
The 3D point class.
Definition: 3d.h:487
static OPrototype * safeDownCast(OPrototype *pObject)
Definition: TYElement.cpp:71
3D frame with a point and 3 vectors.
Definition: 3d.h:1211
OPoint3D _origin
The origin point.
Definition: 3d.h:1279
Classe abstraite pour la gestion de l'interaction entre la vue graphique (2D ou 3D) et le clavier et ...
double _gridMagnStep
Pas de la grille magnétique de positionnement.
void refreshSiteFrame()
Rafraichit l'arborescence du TYSiteFrame.
static void snapToGrid(float &x, float &y, float &z, float &gridMagnStep)
Methode utilitaire qui adapte les coordonnees d'un point pour que celui-ci soit aligne avec la grille...
void updateText(QString msg="", int posX=0, int posY=0, bool show=true)
Mets a jour le texte informatif sur la vue 3D.
TYModelerFrame * _pModeler
Le modeler associe a cet editor.
void showText(bool show=true)
Affiche ou pas le texte informatif sur la vue 3D.
TYRenderWindowInteractor * _pInteractor
La vue graphique associee a cet editor.
void setHauteur(double hauteur)
void setDiameter(double diameter)
bool addAcousticVol(LPTYAcousticVolumeGeoNode pAccVolGeoNode, bool recursif=true)
void addAction(TYAction *pAction)
Ajoute une nouvelle action a l'historique.
Definit une action, necessaire pour la gestion de l'undo.
Definition: TYAction.h:37
ajout d'un volume acoustique a un ensemble de volumes acoustiques
Definition: TYActions.h:146
Ajout d'un element a une infrastructure.
Definition: TYActions.h:398
Classe Modeler specialisee pour l'edition des batiments.
static void setIsSavedOk(const bool &toSave)
Definition: TYElement.h:915
bool addBatiment(LPTYBatimentGeoNode pBatimentGeoNode)
void setDefaultCameraMode()
Classe generique pour une fenetre de modeleur.
TYRenderWindowInteractor * getView()
bool getSnapGridActive()
TYActionManager * getActionManager()
virtual void updateView(bool clipping=true, bool axesAndGrid=true)
void updateDisplayList(void)
void addOGLElement(OGLElement *pOGLElement)
void removeOGLElement(OGLElement *pOGLElement)
virtual void updateGL()
TYOpenGLRenderer * getRenderer()
virtual void close()
virtual void slotKeyPressed(int key)
TYSilosEditor(TYModelerFrame *pModeler)
OGLRectangleElement * _pOGLRectangleElement
Pour le dessin de construction.
Definition: TYSilosEditor.h:62
virtual void slotMouseReleased(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
LPTYSiteNode getSite()
virtual void slotMousePressed(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
LPTYBatiment getBatiment()
virtual void cancel()
virtual void init()
virtual void slotViewTypeChanged(int view)
bool _active
Indique si cet editor est actif.
Definition: TYSilosEditor.h:59
virtual void slotMouseMoved(int x, int y, Qt::MouseButtons button, Qt::KeyboardModifiers state)
Classe Modeler specialisee pour l'edition des sites.
LPTYInfrastructure getInfrastructure()
Definition: TYSiteNode.h:173