Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYPickEditor.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 <qdialog.h>
22 #include <qpushbutton.h>
23 #include <qcheckbox.h>
24 #include <qlineedit.h>
25 #include <qlabel.h>
26 #include <qlayout.h>
27 #include <qmenu.h>
28 #include <qpainter.h>
29 #include <qcursor.h>
30 #include <qinputdialog.h>
31 #include <QMessageBox>
32 #include <QBoxLayout>
33 #include <QPixmap>
34 #include <QGridLayout>
35 #include <QHBoxLayout>
36 #include <QMdiArea>
37 #include <QMdiSubWindow>
38 
39 #include "Tympan/core/logging.h"
64 #include "TYPickEditor.h"
65 
66 #define TR(id) OLocalizator::getString("TYPickEditor", (id))
67 #define IMG(id) OLocalizator::getPicture("TYPickEditor", (id))
68 
69 using namespace Qt;
70 
72 {
73  _useHighlight = true;
74  _usePopup = true;
75 
76  // On recupere le pointeur sur le picker du modeler
78 
79  setPickTolerance(3.0f);
81 
83 }
84 
86 
87 void TYPickEditor::slotMousePressed(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
88 {
89  if (_pModeler->hasFocus() && _pLastRolloverElt)
90  {
91  if (dynamic_cast<TYMaillage*>(_pLastRolloverElt) != nullptr)
92  {
93  hidePanel();
95  }
96  }
97 
98  _lastPressedCurPos.setX(x);
99  _lastPressedCurPos.setY(y);
100 }
101 
102 void TYPickEditor::slotMouseReleased(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
103 {
104  if ((x >= _lastPressedCurPos.x() + _pickTolerance) || (x <= _lastPressedCurPos.x() - _pickTolerance) ||
106  {
107  return;
108  }
109 
110  bool doPick = false;
111 
112  if ((button == Qt::RightButton) || (button == Qt::LeftButton))
113  {
114  // Connections
115  if (_useHighlight || (button == Qt::RightButton))
116  {
119  doPick = true;
120  }
121  if ((button == Qt::RightButton) && _usePopup)
122  {
123  QObject::connect(_pPicker, &TYElementPicker::elementCollectionPicked, this,
125  doPick = true;
126  }
127 
128  // Picking
129  if (doPick)
130  {
131  if (!_pPicker->pick(x, _pInteractor->height() - y))
132  {
133  resetPicker();
134  }
135 
136  // Deconnections
137  QObject::disconnect(_pPicker, &TYElementPicker::elementPicked, _pPicker,
139  QObject::disconnect(_pPicker, &TYElementPicker::elementCollectionPicked, this,
141  }
142  }
143 }
144 
145 void TYPickEditor::slotMouseMoved(int x, int y, Qt::MouseButtons button, Qt::KeyboardModifiers state)
146 {
147  // Si un bouton est enfonce, on retourne
148  if ((button == Qt::RightButton) || (button == Qt::LeftButton))
149  {
150  return;
151  }
152 
153  _lastMovedCurPos.setX(x);
154  _lastMovedCurPos.setY(y);
155 
156  // Si le modeleur peut contenir un maillage (TYSiteModelerFrame)
157  if ((QString(_pModeler->metaObject()->className()).compare("TYSiteModelerFrame") == 0) &&
158  _pModeler->hasFocus())
159  {
160  // On cherche a savoir si au moins un maillage est visible
161  bool hasMaillage = false;
162  LPTYProjet pProj = getTYApp()->getCurProjet();
163  if (pProj != nullptr)
164  {
165  TYTabMaillageGeoNode& pMaillages = pProj->getMaillages();
166  for (int i = 0; i < pMaillages.size(); ++i)
167  {
168  if (pMaillages[i]->getGraphicObject()->getVisible())
169  {
170  hasMaillage = true;
171  break;
172  }
173  }
174  }
175 
176  // Si au moins un maillage est visible
177  if (hasMaillage)
178  {
179  // Si le modeleur n'est pas en vue en perspective
181  {
182  // Si aucun bouton n'est enfonce
183  if (state == Qt::NoButton)
184  {
185  // Connection
186  QObject::connect(_pPicker, &TYElementPicker::elementPicked, this,
188 
189  // Picking
190  if (!_pPicker->pick(x, _pInteractor->height() - y))
191  {
192  hidePanel();
193  }
194 
195  // Deconnection
196  QObject::disconnect(_pPicker, &TYElementPicker::elementPicked, this,
198 
199  // On met a jour la vue
200  _pModeler->getView()->updateGL();
201  }
202  }
203  }
204  }
205 }
206 
207 void TYPickEditor::slotWheeled(int x, int y, int delta, Qt::KeyboardModifiers state)
208 {
209  if (_pModeler->hasFocus() && _pLastRolloverElt)
210  {
211  if (dynamic_cast<TYMaillage*>(_pLastRolloverElt) != nullptr)
212  {
213  hidePanel();
214  _pModeler->getView()->updateGL();
215  }
216  }
217 }
218 
220 {
221  if (key == Qt::Key_Escape)
222  {
223  // (un updateGL est fait dans le reset)
224  resetPicker();
225  }
226 }
227 
229 {
230  if (_pModeler->hasFocus() && _pLastRolloverElt)
231  {
232  if (dynamic_cast<TYMaillage*>(_pLastRolloverElt) != nullptr)
233  {
234  hidePanel();
235  _pModeler->getView()->updateGL();
236  }
237  }
238 }
239 
240 // TODO : What's this monster ?!? Circa 1300 lines of code full of if ?!?
241 void TYPickEditor::showPopupMenu(std::shared_ptr<LPTYElementArray> pElts)
242 {
243  if (!pElts)
244  {
245  return;
246  }
247 
248  if (QString(_pModeler->metaObject()->className()).compare("TYSiteModelerFrame") == 0)
249  {
250  siteModelerPopupMenu(pElts);
251  }
252  else if (QString(_pModeler->metaObject()->className()).compare("TYMachineModelerFrame") == 0)
253  {
255  }
256  else if (QString(_pModeler->metaObject()->className()).compare("TYBatimentModelerFrame") == 0)
257  {
259  }
260 
261  // Deselection
262  resetPicker();
263 
264  TYProjet* pProjet = getTYApp()->getCurProjet();
265  if (pProjet)
266  {
267  pProjet->getSite()->getTopographie()->updateGraphicTree();
268  }
269  // Update
270  getTYMainWnd()->updateModelers(true, true, true); // xbh++
271 }
272 
273 void TYPickEditor::siteModelerPopupMenu(std::shared_ptr<LPTYElementArray> pElts)
274 {
275  // Check site existance
276  TYSiteModelerFrame* pModelerFrame = dynamic_cast<TYSiteModelerFrame*>(_pModeler);
277  TYSiteNode* pModelerSite = nullptr;
278  if (pModelerFrame)
279  {
280  pModelerSite = pModelerFrame->getSite();
281  }
282  if (pModelerSite == nullptr)
283  {
284  return;
285  }
286 
287  QMenu* pPopup = new QMenu(NULL);
288 
289  std::map<QAction*, int> retCodes;
290  std::map<QAction*, TYGeometryNode*> posRetCodes;
291  std::map<QAction*, TYGeometryNode*> rotRetCodes;
292  std::map<QAction*, TYSiteNode*> copySiteNodeRetCodes;
293  std::map<QAction*, TYSiteNode*> remSiteNodeRetCodes;
294  std::map<QAction*, TYAcousticVolumeNode*> calculVolNodeRetCodes;
295  QAction* inverseNormales = NULL;
296  std::map<QAction*, TYMaillage*> copyMaillageRetCodes;
297  std::map<QAction*, TYMaillage*> remMaillageRetCodes;
298  std::map<QAction*, TYPointControl*> copyPtControlRetCodes;
299  std::map<QAction*, TYPointControl*> remPtControlRetCodes;
300  QAction* split = NULL;
301  std::map<QAction*, TYElement*> copyTopoRetCodes;
302  std::map<QAction*, TYElement*> remTopoRetCodes;
303  std::map<QAction*, TYElement*> copyInfraRetCodes;
304  std::map<QAction*, TYElement*> remInfraRetCodes;
305  QAction* code = NULL;
306 
307  LPTYElement pRemovedEltParent = NULL;
308  LPTYElement pAddedElt = NULL;
309 
310  int volumeFound = -2, levelCurveFound = -2;
311 
312  QFont font = pPopup->font();
313  font.setBold(true);
314  TYElement* elem_0 = nullptr; // Currrent element
315  TYElement* elem_1 = nullptr; // next in queue
316  TYElement* elem_2 = nullptr; // 2nd level next in queue
317  for (unsigned int i = 0; i < pElts->size(); i++)
318  {
319  elem_0 = pElts->at(i); // Currrent element
320  if ((i + 1) < pElts->size())
321  {
322  elem_1 = pElts->at(i + 1)._pObj;
323  }
324  if ((i + 2) < pElts->size())
325  {
326  elem_2 = pElts->at(i + 2)._pObj;
327  }
328 
329  TYSiteNode* pCurrentSite = dynamic_cast<TYSiteNode*>(elem_0);
330 
331  // Edition des proprietes de l'element (quelque soit l'element)
332  QString labelTxt;
333  if ((pCurrentSite != nullptr) && (pCurrentSite->getRoot()))
334  {
335  labelTxt = TR("id_popup_siteroot");
336  }
337  else
338  {
339  labelTxt = TYWidget::getDisplayName(pElts->at(i));
340  }
341  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_editeelt"))), labelTxt);
342  code->setFont(font);
343  retCodes[code] = i;
344 
345  if (pCurrentSite != nullptr) // Current element is a site
346  {
347  // Recherche du site parent
348  TYSiteNode* pCurrentSiteParent = nullptr;
349  if (i + 1 < pElts->size())
350  {
351  pCurrentSiteParent = dynamic_cast<TYSiteNode*>(elem_1);
352  }
353 
354  if (pCurrentSiteParent == pModelerSite)
355  {
356  // GeoNode
357  TYGeometryNode* pEltGeoNode = TYGeometryNode::GetGeoNode(pCurrentSite);
358 
359  // Position
360  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_moving"))), TR("id_popup_position"));
361  posRetCodes[code] = pEltGeoNode;
362 
363  // Rotation
364  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_rotation"))), TR("id_popup_rotation"));
365  rotRetCodes[code] = pEltGeoNode;
366 
367  // Duplication
368  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_duplicate"))), TR("id_popup_duplicate"));
369  copySiteNodeRetCodes[code] = pCurrentSite;
370 
371  // Suppression
372  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
373  remSiteNodeRetCodes[code] = pCurrentSite;
374  }
375  }
376 
377  if (dynamic_cast<TYAcousticVolume*>(elem_0) != nullptr)
378  {
379  // Dans tous les cas, on offre la possibilite d'inverser la normales des faces
380  volumeFound = i;
381  inverseNormales = pPopup->addAction(TR("id_popup_normales"));
382  }
383 
384  TYMaillage* pMaillage = dynamic_cast<TYMaillage*>(elem_0);
385  if (pMaillage != nullptr)
386  {
387  // Calcul parent
388  if (dynamic_cast<TYProjet*>(elem_1) != nullptr)
389  {
390  // Si le maillage est bien present dans le calcul
391  TYMaillageGeoNode* pMaillageGeoNode = TYGeometryNode::GetGeoNode(elem_0);
392  if (pMaillageGeoNode != nullptr)
393  {
394  // Position via le parent (GeoNode)
395  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_moving"))), TR("id_popup_position"));
396  posRetCodes[code] = dynamic_cast<TYGeometryNode*>(pMaillageGeoNode);
397 
398  // Rotation via le parent (GeoNode)
399  code =
400  pPopup->addAction(QIcon(QPixmap(IMG("id_icon_rotation"))), TR("id_popup_rotation"));
401  rotRetCodes[code] = dynamic_cast<TYGeometryNode*>(pMaillageGeoNode);
402 
403  // Duplication
404  code =
405  pPopup->addAction(QIcon(QPixmap(IMG("id_icon_duplicate"))), TR("id_popup_duplicate"));
406  copyMaillageRetCodes[code] = pMaillage;
407 
408  // Suppression
409  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
410  remMaillageRetCodes[code] = pMaillage;
411  }
412  }
413  }
414 
415  TYPointControl* pPointCtrl = dynamic_cast<TYPointControl*>(pElts->at(i)._pObj);
416  if (pPointCtrl != nullptr)
417  {
418  // Projet parent
419  if (dynamic_cast<TYProjet*>(elem_1) != nullptr)
420  {
421  // Suppression
422  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
423  remPtControlRetCodes[code] = pPointCtrl;
424  }
425  }
426 
427  if (dynamic_cast<TYTopographie*>(elem_1) != nullptr)
428  {
429 
430  TYSiteNode* pSite = dynamic_cast<TYSiteNode*>(elem_2);
431  if (pSite == pModelerSite)
432  {
433  // On ne peut dupliquer ou supprimer que dans le modeler de son site
434  if (dynamic_cast<TYCourbeNiveau*>(pElts->at(i)._pObj) != nullptr)
435  {
436  split = pPopup->addAction(TR("id_popup_split"));
437  levelCurveFound = i;
438  }
439  // Duplication
440  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_duplicate"))), TR("id_popup_duplicate"));
441  copyTopoRetCodes[code] = pElts->at(i);
442 
443  // Suppression
444  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
445  remTopoRetCodes[code] = pElts->at(i);
446  }
447  }
448 
449  if (dynamic_cast<TYInfrastructure*>(elem_1) != nullptr)
450  {
451  // Acoustic computation is always possible
452  if (dynamic_cast<TYAcousticVolumeNode*>(elem_0))
453  {
454  // Calcul acoustique
455  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_calcul"))), TR("id_popup_calculer"));
456  calculVolNodeRetCodes[code] = dynamic_cast<TYAcousticVolumeNode*>(elem_0);
457  }
458 
459  // Geometric changes only possible in parent site meodeler
460  TYSiteNode* pSite = dynamic_cast<TYSiteNode*>(elem_2);
461  if (pSite == pModelerSite)
462  {
463  // GeoNode
464  TYGeometryNode* pEltGeoNode = TYGeometryNode::GetGeoNode(elem_0);
465 
466  // Position via le parent (GeoNode)
467  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_moving"))), TR("id_popup_position"));
468  posRetCodes[code] = pEltGeoNode;
469 
470  // Rotation via le parent (GeoNode)
471  if (dynamic_cast<TYUserSourcePonctuelle*>(elem_0) ==
472  nullptr) // a user_source cannot be oriented
473  {
474  code =
475  pPopup->addAction(QIcon(QPixmap(IMG("id_icon_rotation"))), TR("id_popup_rotation"));
476  rotRetCodes[code] = pEltGeoNode;
477  }
478 
479  // Duplication
480  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_duplicate"))), TR("id_popup_duplicate"));
481  copyInfraRetCodes[code] = elem_0;
482 
483  // Suppression
484  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
485  remInfraRetCodes[code] = elem_0;
486  }
487  }
488  // Ajoute un separateur entre les elements
489  pPopup->addSeparator();
490  }
491 
492  // Gestion du choix de l'utilisateur
493  pPopup->setMouseTracking(true);
494  QAction* popupRet = pPopup->exec(QCursor::pos());
495  if (popupRet == NULL)
496  {
497  return;
498  }
499  qApp->processEvents();
500 
501  if (retCodes.find(popupRet) != retCodes.end())
502  {
503  TYElement* pElement = pElts->at(retCodes[popupRet]);
504  manageProperties(pElement);
505  }
506  else if (posRetCodes.find(popupRet) != posRetCodes.end())
507  {
508  bool bHeight = true;
509  if (dynamic_cast<TYGeometryNode*>(posRetCodes[popupRet])->getElement()->isA("TYSiteNode"))
510  {
511  bHeight = false;
512  }
513  showPositionDialog(posRetCodes[popupRet], bHeight);
514  }
515  else if (rotRetCodes.find(popupRet) != rotRetCodes.end())
516  {
517  showRotationDialog(rotRetCodes[popupRet]);
518  }
519  else if (popupRet == inverseNormales)
520  {
521  inverseNormal(pElts->at(volumeFound)._pObj);
522  }
523  else if (_pModeler->askForResetResultat())
524  {
525  if (copySiteNodeRetCodes.find(popupRet) != copySiteNodeRetCodes.end())
526  {
527  copySite(copySiteNodeRetCodes[popupRet]);
528  }
529  else if (remSiteNodeRetCodes.find(popupRet) != remSiteNodeRetCodes.end())
530  {
531  remSite(remSiteNodeRetCodes[popupRet]);
532  }
533  else if (calculVolNodeRetCodes.find(popupRet) != calculVolNodeRetCodes.end())
534  {
535  getTYApp()->getCalculManager()->updateAcoustic(calculVolNodeRetCodes[popupRet]);
536  }
537  else if (popupRet == split)
538  {
539  splitCurve(pElts->at(levelCurveFound)._pObj);
540  }
541  else if (copyMaillageRetCodes.find(popupRet) != copyMaillageRetCodes.end())
542  {
543  copyMaillage(copyMaillageRetCodes[popupRet]);
544  }
545  else if (remMaillageRetCodes.find(popupRet) != remMaillageRetCodes.end())
546  {
547  remMaillage(remMaillageRetCodes[popupRet]);
548  }
549  else if (copyPtControlRetCodes.find(popupRet) != copyPtControlRetCodes.end())
550  {
551  copyPtCtrl(copyPtControlRetCodes[popupRet]);
552  }
553  else if (remPtControlRetCodes.find(popupRet) != remPtControlRetCodes.end())
554  {
555  remPtCtrl(remPtControlRetCodes[popupRet]);
556  }
557  else if (remTopoRetCodes.find(popupRet) != remTopoRetCodes.end())
558  {
559  remTopoElmt(remTopoRetCodes[popupRet]);
560  }
561  else if (copyTopoRetCodes.find(popupRet) != copyTopoRetCodes.end())
562  {
563  copyTopoElmt(copyTopoRetCodes[popupRet]);
564  }
565  else if (remInfraRetCodes.find(popupRet) != remInfraRetCodes.end())
566  {
567  remInfraElmt(remInfraRetCodes[popupRet]);
568  }
569  else if (copyInfraRetCodes.find(popupRet) != copyInfraRetCodes.end())
570  {
571  copyInfraElmt(copyInfraRetCodes[popupRet]);
572  }
573  }
574 
575  delete pPopup;
576 }
577 
578 void TYPickEditor::machineModelerPopupMenu(std::shared_ptr<LPTYElementArray> pElts)
579 {
580  QMenu* pPopup = new QMenu(NULL);
581 
582  std::map<QAction*, int> retCodes;
583  std::map<QAction*, TYAcousticVolumeNode*> calculVolNodeRetCodes;
584  QAction* inverseNormales = NULL;
585  std::map<QAction*, TYGeometryNode*> posRetCodes;
586  std::map<QAction*, TYGeometryNode*> rotRetCodes;
587  std::map<QAction*, TYAcousticVolume*> dimVolRetCodes;
588  std::map<QAction*, TYAcousticVolume*> remVolRetCodes;
589  std::map<QAction*, TYAcousticVolume*> copyVolRetCodes;
590  QAction* editFace = NULL;
591  QAction* code = NULL;
592 
593  LPTYElement pRemovedEltParent = NULL;
594  LPTYElement pAddedElt = NULL;
595 
596  int rectFound = -2, volumeFound = -2;
597 
598  QFont font = pPopup->font();
599  font.setBold(true);
600  for (unsigned int i = 0; i < pElts->size(); i++)
601  {
602  // Edition des proprietes de l'element
603  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_editeelt"))),
604  TYWidget::getDisplayName(pElts->at(i)));
605  code->setFont(font);
606  retCodes[code] = i;
607 
608  // Calcul des proprietes acoustiques
609  if (dynamic_cast<TYAcousticVolumeNode*>(pElts->at(i)._pObj))
610  {
611  // Calcul acoustique
612  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_calcul"))), TR("id_popup_calculer"));
613  calculVolNodeRetCodes[code] = (LPTYAcousticVolumeNode&)pElts->at(i);
614  }
615  else if (dynamic_cast<TYAcousticVolume*>(pElts->at(i)._pObj) != nullptr)
616  {
617  // Dans tous les cas, on offre la possibilite d'inverser la normales des faces
618  volumeFound = i;
619  inverseNormales = pPopup->addAction(TR("id_popup_normales"));
620 
621  // Gestion position / rotation
622  TYGeometryNode* pEltGeoNode = TYGeometryNode::GetGeoNode(pElts->at(i)._pObj);
623  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_moving"))), TR("id_popup_position"));
624  posRetCodes[code] = pEltGeoNode;
625 
626  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_rotation"))), TR("id_popup_rotation"));
627  rotRetCodes[code] = pEltGeoNode;
628 
629  // Dimensions
630  code = pPopup->addAction(TR("id_popup_dimension"));
631  dimVolRetCodes[code] = (LPTYAcousticVolume&)pElts->at(i);
632 
633  // Duplication
634  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_duplicate"))), TR("id_popup_duplicate"));
635  copyVolRetCodes[code] = (LPTYAcousticVolume&)pElts->at(i);
636 
637  // Suppression
638  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
639  remVolRetCodes[code] = (LPTYAcousticVolume&)pElts->at(i);
640  }
641  else if (dynamic_cast<TYAcousticRectangleNode*>(pElts->at(i)._pObj) != nullptr)
642  {
643  // On permet d'editer une face uniquement dans un modeleur de batiment ou de machine
644  rectFound = i;
645  editFace = pPopup->addAction(TR("id_popup_editface"));
646  }
647 
648  // Ajoute un separateur entre les elements
649  pPopup->addSeparator();
650  }
651 
652  // Gestion du choix de l'utilisateur
653  pPopup->setMouseTracking(true);
654  QAction* popupRet = pPopup->exec(QCursor::pos());
655  if (popupRet == NULL)
656  {
657  return;
658  }
659  qApp->processEvents();
660 
661  if (retCodes.find(popupRet) != retCodes.end())
662  {
663  TYElement* pElement = pElts->at(retCodes[popupRet]);
664  manageProperties(pElement);
665  }
666  else if (posRetCodes.find(popupRet) != posRetCodes.end())
667  {
668  showPositionDialog(posRetCodes[popupRet], false);
669  }
670  else if (rotRetCodes.find(popupRet) != rotRetCodes.end())
671  {
672  showRotationDialog(rotRetCodes[popupRet]);
673  }
674  else if (dimVolRetCodes.find(popupRet) != dimVolRetCodes.end())
675  {
676  TYElement* pElement = dimVolRetCodes[popupRet];
677  setVolumeSize(pElement);
678  }
679  else if (popupRet == editFace)
680  {
681  TYElement* pElement = pElts->at(rectFound)._pObj;
682  openFaceModeler(pElement);
683  }
684  else if (popupRet == inverseNormales)
685  {
686  inverseNormal(pElts->at(volumeFound)._pObj);
687  }
688  else if (_pModeler->askForResetResultat())
689  {
690  if (calculVolNodeRetCodes.find(popupRet) != calculVolNodeRetCodes.end())
691  {
692  getTYApp()->getCalculManager()->updateAcoustic(calculVolNodeRetCodes[popupRet]);
693  }
694  else if (remVolRetCodes.find(popupRet) != remVolRetCodes.end())
695  {
696  removeVolume(remVolRetCodes[popupRet]);
697  }
698  else if (copyVolRetCodes.find(popupRet) != copyVolRetCodes.end())
699  {
700  copyVolume(copyVolRetCodes[popupRet]);
701  }
702  }
703 
704  delete pPopup;
705 }
706 
707 void TYPickEditor::batimentModelerPopupMenu(std::shared_ptr<LPTYElementArray> pElts)
708 {
709  QMenu* pPopup = new QMenu(NULL);
710 
711  QAction* code = NULL;
712  std::map<QAction*, int> retCodes;
713  std::map<QAction*, TYAcousticVolumeNode*> calculVolNodeRetCodes;
714  QAction* inverseNormales = NULL;
715  std::map<QAction*, TYGeometryNode*> posRetCodes;
716  std::map<QAction*, TYGeometryNode*> rotRetCodes;
717  QAction* hauteurEtage = NULL;
718  QAction* hauteurEcran = NULL;
719  QAction* epaisseurEcran = NULL;
720  QAction* editFace = NULL;
721  std::map<QAction*, TYAcousticVolume*> remVolRetCodes;
722  std::map<QAction*, TYAcousticVolume*> copyVolRetCodes;
723  std::map<QAction*, TYAcousticVolume*> dimVolRetCodes;
724 
725  LPTYElement pRemovedEltParent = NULL;
726  LPTYElement pAddedElt = NULL;
727 
728  int etageFound = -2, ecranFound = -2, rectFound = -2, volumeFound = -2;
729 
730  QFont font = pPopup->font();
731  font.setBold(true);
732  for (unsigned int i = 0; i < pElts->size(); i++)
733  {
734  // Edition des proprietes de l'element
735  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_editeelt"))),
736  TYWidget::getDisplayName(pElts->at(i)));
737  code->setFont(font);
738  retCodes[code] = i;
739 
740  // Calcul des proprietes acoustiques
741  if (dynamic_cast<TYAcousticVolumeNode*>(pElts->at(i)._pObj))
742  {
743  // Calcul acoustique
744  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_calcul"))), TR("id_popup_calculer"));
745  calculVolNodeRetCodes[code] = (LPTYAcousticVolumeNode&)pElts->at(i);
746  }
747  else if (dynamic_cast<TYAcousticVolume*>(pElts->at(i)._pObj) != nullptr)
748  {
749  // Dans tous les cas, on offre la possibilite d'inverser la normales des faces
750  volumeFound = i;
751  inverseNormales = pPopup->addAction(TR("id_popup_normales"));
752 
753  // Gestion position / rotation
754  TYGeometryNode* pEltGeoNode = TYGeometryNode::GetGeoNode(pElts->at(i)._pObj);
755 
756  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_moving"))), TR("id_popup_position"));
757  posRetCodes[code] = pEltGeoNode;
758 
759  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_rotation"))), TR("id_popup_rotation"));
760  rotRetCodes[code] = pEltGeoNode;
761 
762  // Dimensions
763  if (pElts->at(i)->isA("TYEtage"))
764  {
765  etageFound = i;
766  hauteurEtage = pPopup->addAction(TR("id_popup_hauteur"));
767  }
768  else if (pElts->at(i)->isA("TYEcran"))
769  {
770  ecranFound = i;
771  hauteurEcran = pPopup->addAction(TR("id_popup_hauteur"));
772  epaisseurEcran = pPopup->addAction(TR("id_popup_epaisseur"));
773  }
774  else if (pElts->at(i)->isA("TYAcousticCylinder"))
775  {
776  code = pPopup->addAction(TR("id_popup_dimension"));
777  dimVolRetCodes[code] = (LPTYAcousticVolume&)pElts->at(i);
778  }
779 
780  // Duplication
781  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_duplicate"))), TR("id_popup_duplicate"));
782  copyVolRetCodes[code] = (LPTYAcousticVolume&)pElts->at(i);
783 
784  // Suppression
785  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
786  remVolRetCodes[code] = (LPTYAcousticVolume&)pElts->at(i);
787  }
788  else if (dynamic_cast<TYAcousticRectangleNode*>(pElts->at(i)._pObj) != nullptr)
789  {
790  // On permet d'editer une face uniquement dans un modeleur de batiment ou de machine
791  rectFound = i;
792  editFace = pPopup->addAction(TR("id_popup_editface"));
793  }
794 
795  // Ajoute un separateur entre les elements
796  pPopup->addSeparator();
797  }
798 
799  // Gestion du choix de l'utilisateur
800  pPopup->setMouseTracking(true);
801  QAction* popupRet = pPopup->exec(QCursor::pos());
802  if (popupRet == NULL)
803  {
804  return;
805  }
806  qApp->processEvents();
807 
808  if (retCodes.find(popupRet) != retCodes.end())
809  {
810  TYElement* pElement = pElts->at(retCodes[popupRet]);
811  manageProperties(pElement);
812  }
813  else if (posRetCodes.find(popupRet) != posRetCodes.end())
814  {
815  bool bHeight = false;
816  if (posRetCodes[popupRet]->isA("TYMachine"))
817  {
818  bHeight = true;
819  }
820  showPositionDialog(posRetCodes[popupRet], bHeight);
821  }
822  else if (rotRetCodes.find(popupRet) != rotRetCodes.end())
823  {
824  showRotationDialog(rotRetCodes[popupRet]);
825  }
826  else if (popupRet == editFace)
827  {
828  TYElement* pElement = pElts->at(rectFound)._pObj;
829  openFaceModeler(pElement);
830  }
831  else if (popupRet == hauteurEtage)
832  {
833  floorHeight(pElts->at(etageFound)._pObj);
834  }
835  else if (popupRet == hauteurEcran)
836  {
837  screenHeight(pElts->at(ecranFound)._pObj);
838  }
839  else if (popupRet == epaisseurEcran)
840  {
841  screenThick(pElts->at(ecranFound)._pObj);
842  }
843  else if (popupRet == inverseNormales)
844  {
845  inverseNormal(pElts->at(volumeFound)._pObj);
846  }
847  else if (dimVolRetCodes.find(popupRet) != dimVolRetCodes.end())
848  {
849  TYElement* pElement = dimVolRetCodes[popupRet];
850  setVolumeSize(pElement);
851  }
852  else if (_pModeler->askForResetResultat())
853  {
854  if (calculVolNodeRetCodes.find(popupRet) != calculVolNodeRetCodes.end())
855  {
856  getTYApp()->getCalculManager()->updateAcoustic(calculVolNodeRetCodes[popupRet]);
857  }
858  else if (remVolRetCodes.find(popupRet) != remVolRetCodes.end())
859  {
860  removeVolume(remVolRetCodes[popupRet]);
861  }
862  else if (copyVolRetCodes.find(popupRet) != copyVolRetCodes.end())
863  {
864  copyVolume(copyVolRetCodes[popupRet]);
865  }
866  }
867 
868  delete pPopup;
869 }
870 
871 void TYPickEditor::showPositionDialog(TYGeometryNode* pGeoNode, bool activeHeight)
872 {
873  assert(pGeoNode);
874 
875  // Si c'est une source ponctuelle on fait autrement.
876  if (pGeoNode->getElement()->isA("TYUserSourcePonctuelle"))
877  {
878  pGeoNode->getElement()->edit(_pModeler);
879  return;
880  }
881 
882  // Recuperation de la hauteur de l'element
883  double hauteur = pGeoNode->getHauteur();
884 
885  // On doit presenter la position de l'origine du GeoNode selectionne.
886  // Cette position doit etre dans le repere du modeler frame.
887  TYElement* pRootTYElement = _pModeler->getElement();
888  TYGeometryNode* pRootGeometryNode = TYGeometryNode::GetGeoNode(pRootTYElement);
889 
890  // On a besoin du type d'element point par le geonode
891  TYElement* pElement = pGeoNode->getElement();
892 
893  // On cree un geonode temporaire copie du geonode transmis (uniquement les elements geometrique)
894  TYGeometryNode* pTempGeoNode = new TYGeometryNode();
895  // pTempGeoNode->deepCopy(pGeoNode, true);
896  pTempGeoNode->setRepere(pGeoNode->getORepere3D());
897  pTempGeoNode->setElement(pElement);
898 
899  TYPoint oldZero(0, 0, 0);
900  oldZero = pGeoNode->localToGlobal() * oldZero;
901  if (pRootGeometryNode)
902  {
903  oldZero = pRootGeometryNode->globalToLocal() * oldZero;
904  pTempGeoNode->getORepere3D()._origin = oldZero;
905  }
906 
907  // Affectation de la hauteur au geoNode temporaire
908  pTempGeoNode->setHauteur(hauteur);
909 
910  // Affiche la boite de dialogue
911  TYPositionDialog* pDlg = new TYPositionDialog(pTempGeoNode, _pModeler);
912  pDlg->setHauteurEnabled(
913  activeHeight); // Activation ou non de la hauteur pour les elements de volumes nodes
914 
915  int ret = pDlg->exec();
916 
917  // Applique les modificatins si necessaire
918  if (ret == QDialog::Accepted)
919  {
921  {
922  // On a bouge l'origine (exprime dans le repere root)
923  OPoint3D newZero = pTempGeoNode->getORepere3D()._origin;
924 
925  // On passe newZero dans le repere local s'il y a lieu
926  if (pRootGeometryNode)
927  {
928  newZero = pRootGeometryNode->localToGlobal() * newZero;
929  }
930 
931  // exprimons newZero dans le repere du GeoNode:
932  newZero = pGeoNode->globalToLocal() * newZero;
933 
934  // on modifie l'origine du GeoNode de newZero:
935  ORepere3D repere = pGeoNode->getORepere3D();
936  TYPoint oldOrg = repere._origin;
937  repere._origin._x = repere._origin._x + newZero._x;
938  repere._origin._y = repere._origin._y + newZero._y;
939  repere._origin._z = repere._origin._z + newZero._z;
940  pGeoNode->setRepere(repere);
941 
942  pGeoNode->setHauteur(pTempGeoNode->getHauteur());
943 
944  TYAction* pAction = new TYMoveGeoNodeAction(pGeoNode, oldOrg, repere._origin, _pModeler,
945  TR("id_action_setposition"));
946  _pModeler->getActionManager()->addAction(pAction);
947 
948  // Refresh
949  pGeoNode->setIsGeometryModified(true);
950  pGeoNode->updateGraphicTree();
951  // (un updateGL est fait dans le reset)
952  resetPicker();
953 
954  // La scene a ete modifiee
956  }
957  }
958 
959  delete pTempGeoNode;
960  pTempGeoNode = NULL;
961  delete pDlg;
962  pDlg = NULL;
963 }
964 
966 {
967  if (!pGeoNode)
968  {
969  return;
970  }
971 
972  // On doit une vue de la matrice du GeoNode selectionne, dans le repere du modeler frame.
973  TYElement* pRootTYElement = _pModeler->getElement();
974  TYGeometryNode* pRootGeometryNode = TYGeometryNode::GetGeoNode(pRootTYElement);
975 
976  OMatrix oldTyMat = pGeoNode->localToGlobal();
977  if (pRootGeometryNode)
978  {
979  oldTyMat = oldTyMat *
980  pRootGeometryNode
981  ->globalToLocal(); // origin est maintenant exprime dans le repere pRootGeometryNode
982  }
983 
984  // Get rotations from transform matrix
985  OPoint3D vec;
986  vec._x = oldTyMat._m[0][1];
987  vec._y = oldTyMat._m[1][1];
988  vec._z = oldTyMat._m[2][1];
989 
990  // Get X-vector for roll calculation
991  OPoint3D xv;
992  xv._x = oldTyMat._m[0][0];
993  xv._y = oldTyMat._m[1][0];
994  xv._z = oldTyMat._m[2][0];
995 
996  // Calculate PRH (x = pitch, y = roll, z = heading)
997  OPoint3D rotTmp(-atan2(vec._z, sqrt(vec._x * vec._x + vec._y * vec._y)), xv._z, -atan2(-vec._x, vec._y));
998 
999  // Set up vars
1000  double pitch = RADTODEG(rotTmp._x); // Pitch
1001  double yaw = -RADTODEG(rotTmp._z); // Heading
1002  double roll = RADTODEG(rotTmp._y); // Roll
1003 
1004  // Affiche la boite de dialogue
1005  OPoint3D rot(pitch, roll, yaw);
1006  TYRotationDialog* pDlg = new TYRotationDialog(&rot, _pModeler);
1007  if ((dynamic_cast<TYMaillage*>(pGeoNode->getElement()) != nullptr) ||
1008  (dynamic_cast<TYSiteNode*>(pGeoNode->getElement()) != nullptr))
1009  {
1010  pDlg->lockXY();
1011  }
1012 
1013  int ret = pDlg->exec();
1014 
1015  // Applique les modifications si necessaire
1016  if (ret == QDialog::Accepted)
1017  {
1019  {
1020  ORepere3D Repere = pGeoNode->getORepere3D();
1021  ORepere3D oldRepere = Repere;
1022  OMatrix tyMat;
1023  OMatrix tyMatTmpX;
1024  OMatrix tyMatTmpY;
1025  OMatrix tyMatTmpZ;
1026  OMatrix tyMatTmpConcat;
1027 
1028  // On applique la rotation
1029  double dRotateX = rot._x;
1030  double dRotateY = rot._y;
1031  double dRotateZ = rot._z;
1032  if (pDlg->getConcatenateStatus())
1033  {
1034  dRotateX -= pitch;
1035  dRotateY -= roll;
1036  dRotateZ -= yaw;
1037  }
1038 
1039  tyMatTmpX.setRotationOx(-DEGTORAD(dRotateX));
1040  tyMatTmpY.setRotationOy(-DEGTORAD(dRotateY));
1041  tyMatTmpZ.setRotationOz(DEGTORAD(dRotateZ));
1042 
1043  if (pDlg->getConcatenateStatus()) // az--
1044  {
1045  tyMat = Repere.asMatrix();
1046  tyMatTmpConcat = tyMat;
1047  }
1048 
1049  tyMat = tyMat * tyMatTmpZ * tyMatTmpY * tyMatTmpX * tyMatTmpConcat;
1050 
1051  OPoint3D org = Repere._origin; // On conserve l'origine de depart
1052  Repere.set(tyMat);
1053  Repere._origin = org;
1054 
1055  pGeoNode->setRepere(Repere);
1056 
1057  TYAction* pAction = new TYRotateGeoNodeAction(pGeoNode, oldRepere, Repere, _pModeler,
1058  TR("id_action_setrotation"));
1059  _pModeler->getActionManager()->addAction(pAction);
1060 
1061  pGeoNode->setIsGeometryModified(true);
1062  pGeoNode->getElement()->getParent()->setIsGeometryModified(true);
1063 
1064  // Refresh
1065  pGeoNode->getElement()->getParent()->updateGraphic();
1066  // (un updateGL est fait dans le reset)
1067  resetPicker();
1068 
1069  // La scene a ete modifiee
1071  }
1072  }
1073 
1074  delete pDlg;
1075  pDlg = NULL;
1076 }
1077 
1079 {
1080  if (!pAccVol)
1081  {
1082  return;
1083  }
1084 
1085  TYAcousticVolume* pBackupVolume = dynamic_cast<TYAcousticVolume*>(pAccVol->clone());
1086 
1087  TYDimensionDialog* pDlg = new TYDimensionDialog(pAccVol, _pModeler);
1088 
1089  // Affiche la boite de dialogue
1090  int ret = pDlg->exec();
1091 
1092  // Applique les modificatins si necessaire
1093  if (ret == QDialog::Accepted)
1094  {
1096  {
1097  *pAccVol = *pBackupVolume;
1098  }
1099  else
1100  {
1101  pAccVol->setIsGeometryModified(true);
1102  pAccVol->getParent()->setIsGeometryModified(true);
1103 
1104  // Refresh
1105  pAccVol->getParent()->updateGraphic();
1106  // (un updateGL est fait dans le reset)
1107  _pPicker->reset();
1108 
1109  // La scene a ete modifiee
1111  }
1112  }
1113 }
1114 
1116 {
1117  hidePanel();
1118 
1119  if (!pElt)
1120  {
1121  return;
1122  }
1123 
1124  LPTYMaillage pMaillage = dynamic_cast<TYMaillage*>(pElt);
1125  if (pMaillage != nullptr)
1126  {
1127  LPTYPanel pPanel = pMaillage->getPanel();
1128 
1129  // Position du curseur (repere modeleur)
1130  double x = _lastMovedCurPos.x();
1131  double y = _pInteractor->height() - _lastMovedCurPos.y();
1132  TYElementGraphic* pTYElementGraphic = pPanel->getGraphicObject();
1133  ((TYPanelGraphic*)pTYElementGraphic)->setPosX(x);
1134  ((TYPanelGraphic*)pTYElementGraphic)->setPosY(y);
1135  pTYElementGraphic->setVisible();
1136 
1137  // Position dans le repère "monde"
1138  OPoint3D pt;
1139  if (realWorldPosition(pt) == false)
1140  {
1141  return;
1142  }
1143  double X = pt._x, Y = pt._y, Z = pt._z;
1144 
1145  switch (_pModeler->getCurrentView())
1146  {
1148  pPanel->setFirstPos("X : " + doubleToStrPre(X, 1));
1149  pPanel->setSecondPos("Y : " + doubleToStrPre(Y, 1));
1150  break;
1152  pPanel->setFirstPos("Y : " + doubleToStrPre(Y, 1));
1153  pPanel->setSecondPos("Z : " + doubleToStrPre(Z, 1));
1154  break;
1156  pPanel->setFirstPos("X : " + doubleToStrPre(X, 1));
1157  pPanel->setSecondPos("Z : " + doubleToStrPre(Z, 1));
1158  break;
1159  }
1160 
1161  // Valeur
1162  LPTYMaillageGeoNode pMaillageGeoNode =
1163  dynamic_cast<TYProjet*>(pMaillage->getParent())->findMaillage(pMaillage);
1164 
1165  // On recupere la premiere distance
1166  OPoint3D coord;
1167  double minDistSquare = 0.0;
1168  LPTYPointCalcul pPtCalcul = pMaillage->getPtsCalcul().front();
1169  LPTYPointCalcul pResult = 0;
1170  if (pPtCalcul)
1171  {
1172  // coord = pMaillageGeoNode->localToGlobal() * OCoord3D(pPtCalcul->_x, pPtCalcul->_y, 0.0);
1173  coord = pMaillageGeoNode->localToGlobal() * OPoint3D(pPtCalcul->_x, pPtCalcul->_y, 0.0);
1174  switch (_pModeler->getCurrentView())
1175  {
1177  minDistSquare = std::sqrt(std::pow(coord._x - X, 2) + std::pow(coord._y - Y, 2));
1178  break;
1180  minDistSquare = std::sqrt(std::pow(coord._y - Y, 2) + std::pow(coord._z - Z, 2));
1181  break;
1183  minDistSquare = std::sqrt(std::pow(coord._x - X, 2) + std::pow(coord._z - Z, 2));
1184  break;
1185  }
1186 
1187  pResult = pPtCalcul;
1188  }
1189 
1190  // On teste les suivantes pour trouver le point de calcul le plus proche
1191  for (unsigned int i = 1; i < pMaillage->getPtsCalcul().size(); i++)
1192  {
1193  pPtCalcul = pMaillage->getPtsCalcul()[i];
1194  coord = pMaillageGeoNode->localToGlobal() * OPoint3D(pPtCalcul->_x, pPtCalcul->_y, 0.0);
1195 
1196  double distSquare = 0.0;
1197  switch (_pModeler->getCurrentView())
1198  {
1200  distSquare = std::sqrt(std::pow(coord._x - X, 2) + std::pow(coord._y - Y, 2));
1201  break;
1203  distSquare = std::sqrt(std::pow(coord._y - Y, 2) + std::pow(coord._z - Z, 2));
1204  break;
1206  distSquare = std::sqrt(std::pow(coord._x - X, 2) + std::pow(coord._z - Z, 2));
1207  break;
1208  }
1209 
1210  if (distSquare < minDistSquare)
1211  {
1212  pResult = pPtCalcul;
1213  minDistSquare = distSquare;
1214  }
1215  }
1216 
1217  std::string value = "dB : N/A";
1218  if (pResult)
1219  {
1220  switch (pMaillage->getDataType())
1221  {
1223  value = "dB(A) : " + doubleToStrPre(pResult->getValA(), 1);
1224  break;
1226  value = "dB(Lin) : " + doubleToStrPre(pResult->getValLin(), 1);
1227  break;
1228  case TYMaillage::DataFreq:
1229  value = "dB(Freq) : " +
1230  doubleToStrPre(pResult->getSpectre()->getValueReal(pMaillage->getDataFreq()), 1);
1231  break;
1232  }
1233  }
1234 
1235  pPanel->setValue(value);
1236 
1237  // On met a jour uniquement le maillage
1239  }
1240  else
1241  {
1242  hidePanel();
1243  }
1244 
1245  _pLastRolloverElt = pElt;
1246 }
1247 
1249 {
1250  if (!_pLastRolloverElt)
1251  {
1252  return;
1253  }
1254 
1255  LPTYMaillage pMaillage = dynamic_cast<TYMaillage*>(_pLastRolloverElt);
1256  if (pMaillage != nullptr)
1257  {
1258  pMaillage->getPanel()->getGraphicObject()->setVisible(false);
1259 
1260  // On met a jour uniquement le maillage
1262  _pLastRolloverElt = 0;
1263  }
1264 }
1265 
1267 {
1268  dynamic_cast<TYModelerFrame*>(_pModeler)->updateView();
1269 
1270  // Position dans la scene 3D
1271  QPoint curPos = _lastMovedCurPos;
1272 
1273  // Calcul des coords
1274  float* pos = new float[3];
1275 
1276  if (!(_pModeler->computeCurPos(curPos.x(), curPos.y(), pos)))
1277  {
1278  delete[] pos;
1279  return false;
1280  }
1281 
1282  pt._x = pos[0];
1283  pt._y = -pos[2];
1284  pt._z = pos[1];
1285 
1286  delete[] pos;
1287 
1288  return true;
1289 }
1290 
1292 {
1293  if ((pElement != nullptr) && (pElement->edit(_pModeler) == QDialog::Accepted))
1294  {
1295  // Mise a jour du projet
1296  TYProjet* pProjet = getTYApp()->getCurProjet();
1297  if (pProjet)
1298  {
1299  TYSiteNode* pSite = pProjet->getSite();
1300  if (pSite)
1301  {
1302  pSite->update(pElement);
1304  }
1305  }
1306 
1307  pElement->updateGraphicTree();
1308  }
1309 }
1310 
1312 {
1313  if (pElement == nullptr)
1314  {
1315  return;
1316  }
1317 
1318  TYElement* pParent = pElement->getParent();
1319 
1320  if (pParent == nullptr)
1321  {
1322  return;
1323  }
1324 
1325  TYSiteNodeGeoNode* pGeoNode = TYGeometryNode::GetGeoNode(pElement);
1326 
1327  // Nouvel element du meme type que l'objet a dupliquer (clone)
1328  LPTYSiteNodeGeoNode pCopy = new TYSiteNodeGeoNode(dynamic_cast<TYSiteNode*>(pElement->clone()));
1329 
1330  // Duplication
1331  pCopy->deepCopy(pGeoNode, false);
1332  pCopy->setParent(pElement->getParent());
1333 
1334  // Ajout
1335  if (dynamic_cast<TYSiteNode*>(pParent)->addSiteNode(pCopy))
1336  {
1337  ORepere3D repere = pCopy->getORepere3D();
1338  // Offset
1339  repere._origin._x += 100.0;
1340  repere._origin._y -= 100.0;
1341 
1342  pCopy->setRepere(repere);
1343 
1344  LPTYCalcul pCalc = NULL;
1345  TYSiteNode* pSite = NULL;
1346  pSite = dynamic_cast<TYSiteNode*>(pCopy->getElement());
1347  if (getTYApp()->getCurProjet() && pSite)
1348  {
1349  pCalc = getTYApp()->getCurProjet()->getCurrentCalcul();
1350  if (pCalc)
1351  {
1352  pCalc->getCalculElements(pSite);
1353  }
1354  }
1355 
1356  // Update Graphic
1357  pCopy->updateGraphicTree();
1358 
1359  // Action
1360  TYAction* pAction = new TYAddSiteNodeToSiteNodeAction(pCopy, dynamic_cast<TYSiteNode*>(pParent),
1361  _pModeler, TR("id_action_addsitenode"));
1362  _pModeler->getActionManager()->addAction(pAction);
1363  }
1364 
1365  updateSiteFrame();
1366 
1367  // La scene a ete modifiee
1369 }
1370 
1372 {
1373  if (pElement == nullptr)
1374  {
1375  return;
1376  }
1377  TYElement* pParent = pElement->getParent();
1378  if (pParent == nullptr)
1379  {
1380  return;
1381  }
1382 
1383  LPTYSiteNode pSiteParent = dynamic_cast<TYSiteNode*>(pParent);
1384  LPTYSiteNodeGeoNode pGeoNode = TYGeometryNode::GetGeoNode(pElement);
1385 
1386  if (pSiteParent->remSiteNode((LPTYSiteNode&)pElement))
1387  {
1388  TYAction* pAction =
1389  new TYRemSiteNodeToSiteNodeAction(pGeoNode, pSiteParent, _pModeler, TR("id_action_remsitenode"));
1390  _pModeler->getActionManager()->addAction(pAction);
1391  }
1392 
1393  updateSiteFrame();
1394 
1395  // La scene a ete modifiee
1397 }
1398 
1400 {
1401  OPoint3D pt;
1402  if (realWorldPosition(pt))
1403  {
1404  TYCourbeNiveau* pCurrentCurve = dynamic_cast<TYCourbeNiveau*>(pElement);
1405  TYTopographie* pTopo = dynamic_cast<TYTopographie*>(pCurrentCurve->getParent());
1406 
1407  if (pCurrentCurve != nullptr)
1408  {
1409  LPTYCourbeNiveau newCurve = pCurrentCurve->split(pt);
1410  if (newCurve._pObj != nullptr)
1411  {
1412  // Copie du geonode de l'actuelle courbe
1413  TYGeometryNode* pCurrentGeoNode = TYGeometryNode::GetGeoNode(pCurrentCurve);
1414  LPTYGeometryNode pNewGeoNode = new TYGeometryNode();
1415  pNewGeoNode->deepCopy(pCurrentGeoNode, false);
1416 
1417  // Association du geonode avec la nouvelle courbe
1418  pNewGeoNode->setElement((LPTYElement)newCurve);
1419 
1420  // Ajout de la nouvelle courbe au projet
1421  if (pTopo != nullptr)
1422  {
1423  pTopo->addCrbNiv(pNewGeoNode);
1424  }
1425  }
1426 
1427  pTopo->updateGraphicTree();
1428  pTopo->updateGraphic();
1429  updateSiteFrame();
1430  // La scene a ete modifiee
1432  }
1433  }
1434 }
1435 
1437 {
1438  if (pElement == nullptr)
1439  {
1440  return;
1441  }
1442  TYElement* pParent = pElement->getParent();
1443  if (pParent == nullptr)
1444  {
1445  return;
1446  }
1447 
1448  TYMaillageGeoNode* pGeoNode = TYGeometryNode::GetGeoNode(pElement);
1449 
1450  // Nouvel element du meme type que l'objet a dupliquer (clone)
1451  LPTYMaillageGeoNode pCopy = new TYMaillageGeoNode(dynamic_cast<TYMaillage*>(pElement->clone()));
1452 
1453  // Duplication
1454  pCopy->deepCopy(pGeoNode, false);
1455  pCopy->setParent(pParent);
1456 
1457  // Nettoyage
1458  dynamic_cast<TYMaillage*>(pCopy->getElement())->clearResult();
1459 
1460  // Ajout
1461  if ((dynamic_cast<TYProjet*>(pParent))->addMaillage(pCopy))
1462  {
1463  TYRectangularMaillage* pMaillage = dynamic_cast<TYRectangularMaillage*>(pCopy->getElement());
1464  double x = 10., y = 10.;
1465  if (pMaillage != nullptr)
1466  {
1467  LPTYRectangle pRect = pMaillage->getRectangle();
1468  x = pRect->getSizeX() / 2.;
1469  y = pRect->getSizeY() / 2.;
1470  }
1471 
1472  ORepere3D repere = pCopy->getORepere3D();
1473  // Offset
1474  repere._origin._x += x;
1475  repere._origin._y -= y;
1476 
1477  pCopy->setRepere(repere);
1478 
1479  // Update Graphic
1480  pCopy->updateGraphicTree();
1481 
1482  // Action
1483  TYAction* pAction = new TYAddMaillageToProjetAction(pCopy, (dynamic_cast<TYProjet*>(pParent)),
1484  _pModeler, TR("id_action_addmaillage"));
1485  _pModeler->getActionManager()->addAction(pAction);
1486 
1487  // Mise à jour du modeleur
1488  dynamic_cast<TYSiteModelerFrame*>(_pModeler)->updateSelectMaillageBox();
1489  dynamic_cast<TYSiteModelerFrame*>(_pModeler)->updateElementGraphic(true);
1490 
1491  // Mise à jour de l'arborescence de projet
1493  }
1494 
1495  // La scene a ete modifiee
1497 }
1498 
1500 {
1501  if (pElement == nullptr)
1502  {
1503  return;
1504  }
1505  TYElement* pParent = pElement->getParent();
1506  if (pParent == nullptr)
1507  {
1508  return;
1509  }
1510 
1511  LPTYMaillageGeoNode pGeoNode = TYGeometryNode::GetGeoNode(pElement);
1512  LPTYProjet pProjet = getTYApp()->getCurProjet();
1513 
1514  if (pProjet && pProjet->remMaillage(dynamic_cast<TYMaillage*>(pElement)))
1515  {
1516  TYAction* pAction =
1517  new TYRemMaillageToProjetAction(pGeoNode, pProjet, _pModeler, TR("id_action_remmaillage"));
1518  _pModeler->getActionManager()->addAction(pAction);
1519  }
1520 
1521  dynamic_cast<TYSiteModelerFrame*>(_pModeler)->updateSelectMaillageBox();
1522  dynamic_cast<TYSiteModelerFrame*>(_pModeler)->updateElementGraphic(true);
1523 
1525 
1526  // La scene a ete modifiee
1528 }
1529 
1531 {
1532  if (pElement == nullptr)
1533  {
1534  return;
1535  }
1536  TYElement* pParent = pElement->getParent();
1537  if (pParent == nullptr)
1538  {
1539  return;
1540  }
1541 
1542  // Nouvel element du meme type que l'objet a dupliquer (clone)
1543  LPTYPointControl pCopy = dynamic_cast<TYPointControl*>(pElement->clone());
1544 
1545  // Duplication
1546  pCopy->deepCopy(dynamic_cast<TYPointControl*>(pElement), false);
1547  pCopy->setParent(pElement->getParent());
1548 
1549  // Ajout
1550  if ((dynamic_cast<TYProjet*>(pParent))->addPointControl(pCopy))
1551  {
1552  // Offset
1553  pCopy->_x += 10.0;
1554  pCopy->_y -= 10.0;
1555 
1556  // Update Graphic
1557  pCopy->updateGraphicTree();
1558 
1560 
1561  // Action
1562  TYAction* pAction = new TYAddPointControlAction(dynamic_cast<TYProjet*>(pParent), pCopy, _pModeler,
1563  TR("id_action_addptcontrol"));
1564  _pModeler->getActionManager()->addAction(pAction);
1565  }
1566 
1568  getTYMainWnd()->updateModelers(false);
1569 
1570  // La scene a ete modifiee
1572 }
1574 {
1575  if (pElement == nullptr)
1576  {
1577  return;
1578  }
1579  LPTYProjet pParent = dynamic_cast<TYProjet*>(pElement->getParent());
1580  if (pParent == nullptr)
1581  {
1582  return;
1583  }
1584 
1585  if (pParent->remPointControl(dynamic_cast<TYPointControl*>(pElement)))
1586  {
1587  TYAction* pAction = new TYRemPointControlAction(pParent, dynamic_cast<TYPointControl*>(pElement),
1588  _pModeler, TR("id_action_remptcontrol"));
1589  _pModeler->getActionManager()->addAction(pAction);
1590  }
1591 
1593  getTYMainWnd()->updateModelers(false);
1594 
1595  // La scene a ete modifiee
1597 }
1599 {
1600  if (pElement == nullptr)
1601  {
1602  return;
1603  }
1604  TYTopographie* pTopo = dynamic_cast<TYTopographie*>(pElement->getParent());
1605  if (pTopo == nullptr)
1606  {
1607  return;
1608  }
1609 
1610  // On recupere le site parent
1611  TYAction* pAction = new TYRemElementToTopoAction(pElement, pTopo, _pModeler, TR("id_action_remelttopo"));
1612  _pModeler->getActionManager()->addAction(pAction);
1613 
1614  if (pElement->isA("TYCourbeNiveau"))
1615  {
1616  pTopo->remCrbNiv((LPTYCourbeNiveau&)pElement);
1617  }
1618  else if (pElement->isA("TYTerrain"))
1619  {
1620  pTopo->remTerrain((LPTYTerrain&)pElement);
1621  }
1622  else if (pElement->isA("TYCoursEau"))
1623  {
1624  pTopo->remCrsEau((LPTYCoursEau&)pElement);
1625  }
1626  else if (pElement->isA("TYPlanEau"))
1627  {
1628  pTopo->remPlanEau((LPTYPlanEau&)pElement);
1629  }
1630 
1631  updateSiteFrame();
1632 
1633  // La scene a ete modifiee
1635 }
1637 {
1638  if (pElement == nullptr)
1639  {
1640  return;
1641  }
1642  TYTopographie* pTopo = dynamic_cast<TYTopographie*>(pElement->getParent());
1643  if (pTopo == nullptr)
1644  {
1645  return;
1646  }
1647 
1648  SmartPtr<TYGeometryNode> pCopyTmp = NULL;
1649 
1650  if (pElement->isA("TYCourbeNiveau"))
1651  {
1652  // Nouvelle element
1654  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1655 
1656  // Duplication
1657  pCopy->deepCopy(pTopo->findCrbNiv((LPTYCourbeNiveau&)pElement), false);
1658  pCopy->setParent(pElement->getParent());
1659 
1660  // Ajout
1661  pTopo->addCrbNiv(pCopy);
1662 
1663  // Offset
1664  TYCourbeNiveau* courbeNiveau = TYCourbeNiveau::safeDownCast(pCopy->getElement());
1665  courbeNiveau->offsetListPoints();
1666  }
1667  else if (pElement->isA("TYTerrain"))
1668  {
1669  // Nouvelle element
1671  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1672 
1673  // Duplication
1674  pCopy->deepCopy(pTopo->findTerrain((LPTYTerrain&)pElement), false);
1675  pCopy->setParent(pElement->getParent());
1676 
1677  // Ajout
1678  pTopo->addTerrain(pCopy);
1679 
1680  // Offset
1681  TYTerrain* terrain = TYTerrain::safeDownCast(pCopy->getElement());
1682  terrain->offsetListPoints();
1683  }
1684  else if (pElement->isA("TYCoursEau"))
1685  {
1686  // Nouvelle element
1688  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1689 
1690  // Duplication
1691  pCopy->deepCopy(pTopo->findCrsEau((LPTYCoursEau&)pElement), false);
1692  pCopy->setParent(pElement->getParent());
1693 
1694  // Ajout
1695  pTopo->addCrsEau(pCopy);
1696  }
1697  else if (pElement->isA("TYPlanEau"))
1698  {
1699  // Nouvelle element
1701  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1702 
1703  // Duplication
1704  pCopy->deepCopy(pTopo->findPlanEau((LPTYPlanEau&)pElement), false);
1705  pCopy->setParent(pElement->getParent());
1706 
1707  // Ajout
1708  pTopo->addPlanEau(pCopy);
1709 
1710  // Offset
1711  TYPlanEau* planEau = TYPlanEau::safeDownCast(pCopy->getElement());
1712  planEau->offsetListPoints();
1713  }
1714 
1715  // if (pCopyTmp)
1716  //{
1717  // ORepere3D repere = pCopyTmp->getORepere3D();
1718  // // Offset
1719  // repere._origin._x += 50.0;
1720  // repere._origin._y -= 50.0;
1721  // pCopyTmp->setRepere(repere);
1722 
1723  // // Action
1724  // TYAction* pAction = new TYAddElementToTopoAction(pCopyTmp, pTopo, _pModeler,
1725  // TR("id_action_addelttopo")); _pModeler->getActionManager()->addAction(pAction);
1726 
1727  // // Update graphic
1728  // pCopyTmp->updateGraphicTree();
1729  //}
1730 
1731  updateSiteFrame();
1732 
1733  // La scene a ete modifiee
1735 }
1737 {
1738  if (pElement == nullptr)
1739  {
1740  return;
1741  }
1742  TYInfrastructure* pInfra = dynamic_cast<TYInfrastructure*>(pElement->getParent());
1743  if (pInfra == nullptr)
1744  {
1745  return;
1746  }
1747 
1748  TYAction* pAction =
1749  new TYRemElementToInfraAction(pElement, pInfra, _pModeler, TR("id_action_remeltinfra"));
1750  _pModeler->getActionManager()->addAction(pAction);
1751 #if WITH_NMPB
1752  if (pElement->isA("TYRoute"))
1753  {
1754  pInfra->remRoute((LPTYRoute&)pElement);
1755  }
1756 #endif
1757  if (pElement->isA("TYReseauTransport"))
1758  {
1759  pInfra->remResTrans((LPTYReseauTransport&)pElement);
1760  }
1761  else if (pElement->isA("TYBatiment"))
1762  {
1763  pInfra->remBatiment((LPTYBatiment&)pElement);
1764  }
1765  else if (pElement->isA("TYMachine"))
1766  {
1767  pInfra->remMachine((LPTYMachine&)pElement);
1768  }
1769  else if (pElement->isA("TYUserSourcePonctuelle"))
1770  {
1771  pInfra->remSrc((LPTYUserSourcePonctuelle&)pElement);
1772  }
1773 
1774  updateSiteFrame(); // Mise a jour de l'arborescence du site
1775 
1776  // La scene a ete modifiee
1778 }
1780 {
1781  if (pElement == nullptr)
1782  {
1783  return;
1784  }
1785  TYInfrastructure* pInfra = dynamic_cast<TYInfrastructure*>(pElement->getParent());
1786  if (pInfra == nullptr)
1787  {
1788  return;
1789  }
1790 
1791  SmartPtr<TYGeometryNode> pCopyTmp = NULL;
1792  TYBox boundBox;
1793 
1794  LPTYGeometryNode pCopy = nullptr;
1795 #if WITH_NMPB
1796  if (pElement->isA("TYRoute"))
1797  {
1798  // Nouvelle element
1799  pCopy = new TYRouteGeoNode(new TYRoute);
1800  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1801 
1802  // Duplication
1803  pCopy->deepCopy(pInfra->findRoute((LPTYRoute&)pElement), false);
1804  pCopy->setParent(pElement->getParent());
1805 
1806  // Ajout
1807  pInfra->addRoute(pCopy);
1808  }
1809 #endif
1810  if (pElement->isA("TYReseauTransport"))
1811  {
1812  // Nouvel element
1814  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1815 
1816  // Duplication
1817  pCopy->deepCopy(pInfra->findResTrans((LPTYReseauTransport&)pElement), false);
1818  pCopy->setParent(pElement->getParent());
1819 
1820  // Ajout
1821  pInfra->addResTrans(pCopy);
1822  }
1823  else if (pElement->isA("TYBatiment"))
1824  {
1825  // Nouvelle element
1826  pCopy = new TYBatimentGeoNode(new TYBatiment);
1827  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1828 
1829  // Duplication
1830  pCopy->deepCopy(pInfra->findBatiment((LPTYBatiment&)pElement), false);
1831  pCopy->setParent(pElement->getParent());
1832  updateCopyPosition(pCopy);
1833 
1834  // Ajout
1835  pInfra->addBatiment(pCopy);
1836 
1837  // Message d'alerte sur le fonctionnement des machine dupliquees
1839  "**********************************************************************\n");
1841  "* ATTENTION !!! *\n\n\n");
1843  "* Les machines a l'interieur du batiment duplique ne sont pas active *\n\n");
1845  "* PENSEZ A LES REACTIVER *\n\n");
1847  "**********************************************************************\n");
1848  }
1849  else if (pElement->isA("TYMachine"))
1850  {
1851  // Nouvelle element
1852  pCopy = new TYMachineGeoNode(new TYMachine);
1853  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1854 
1855  // Duplication
1856  pCopy->deepCopy(pInfra->findMachine((LPTYMachine&)pElement), false);
1857  pCopy->setParent(pElement->getParent());
1858  updateCopyPosition(pCopy);
1859 
1860  // Ajout
1861  pInfra->addMachine(pCopy);
1862  }
1863  else if (pElement->isA("TYUserSourcePonctuelle"))
1864  {
1865  // Nouvelle element
1867  pCopyTmp = (SmartPtr<TYGeometryNode>&)pCopy;
1868 
1869  // Duplication
1870  pCopy->deepCopy(pInfra->findSrc((LPTYUserSourcePonctuelle&)pElement), false, true);
1871  pCopy->setParent(pElement->getParent());
1872 
1873  // Ajout
1874  pInfra->addSrc(pCopy);
1875 
1876  // Offset
1877  TYUserSourcePonctuelle::safeDownCast(pCopy->getElement())->getPos()->_x += 10;
1878  TYUserSourcePonctuelle::safeDownCast(pCopy->getElement())->getPos()->_y -= 10;
1879  }
1880 
1881  // if (pCopyTmp)
1882  //{
1883  // if (!pElement->isA("TYUserSourcePonctuelle"))
1884  // {
1885  // ORepere3D repere = pCopyTmp->getORepere3D();
1886 
1887  // // Offset proportionnel a la taille de l'objet
1888  // repere._origin._x += boundBox._sizeX; //10.0;
1889  // repere._origin._y -= boundBox._sizeY; //10.0;
1890 
1891  // pCopyTmp->setRepere(repere);
1892  // }
1893 
1894  // // Action
1895  // TYAction* pAction = new TYAddElementToInfraAction(pCopyTmp, pInfra, _pModeler,
1896  // TR("id_action_addeltinfra")); _pModeler->getActionManager()->addAction(pAction);
1897  //}
1898 
1899  // On l'ajoute dans le calcul courant (si calcul courant il y a !)
1900  if (pCopy && getTYApp()->getCurProjet() && getTYApp()->getCurProjet()->getCurrentCalcul())
1901  {
1903  }
1904 
1905  updateSiteFrame(); // Mise a jour de l'arborescence du site
1906 
1907  // La scene a ete modifiee
1909 }
1911 {
1912  if (pElement == nullptr)
1913  {
1914  return;
1915  }
1916  // On preserve la dimension en hauteur de l'objet
1917  TYAcousticVolume* pVol = dynamic_cast<TYAcousticVolume*>(pElement);
1918  if (pVol == nullptr)
1919  {
1920  return;
1921  }
1922 
1923  float sizeX = 0, sizeY = 0, sizeZ = 0;
1924 
1925  if (pVol != NULL)
1926  {
1927  if (pVol->isA("TYAcousticBox"))
1928  {
1929  TYAcousticBox* pBox = (TYAcousticBox*)pVol;
1930  pBox->getDimension(sizeX, sizeY, sizeZ);
1931  }
1932  else if (pVol->isA("TYAcousticCylinder"))
1933  {
1934  sizeZ = ((TYAcousticCylinder*)pVol)->getHauteur();
1935  }
1936  else if (pVol->isA("TYAcousticSemiCylinder"))
1937  {
1938  sizeZ = ((TYAcousticSemiCylinder*)pVol)->getHauteur();
1939  }
1940  }
1941 
1942  // Affichage de la boite de dialogue
1943  showDimensionsDialog(pVol);
1944 
1945  // Modification de la position pour tenir compte des nouvelles dimensions
1947  LPTYAcousticVolumeGeoNode pGeoNode = pParent->findAcousticVol(pVol);
1948 
1949  if (pGeoNode)
1950  {
1951  ORepere3D repere = pGeoNode->getORepere3D();
1952  TYPoint org = repere._origin;
1953  // On retire l'ancienne hauteur
1954  org._z -= sizeZ / 2;
1955 
1956  // on ajoute la nouvelle
1957  if (pVol->isA("TYAcousticBox"))
1958  {
1959  TYAcousticBox* pAccBox = (TYAcousticBox*)pVol;
1960  pAccBox->getDimension(sizeX, sizeY, sizeZ);
1961  }
1962  else if (pVol->isA("TYAcousticCylinder"))
1963  {
1964  sizeZ = ((TYAcousticCylinder*)pVol)->getHauteur();
1965  }
1966  else if (pVol->isA("TYAcousticSemiCylinder"))
1967  {
1968  sizeZ = ((TYAcousticSemiCylinder*)pVol)->getHauteur();
1969  }
1970 
1971  org._z += sizeZ / 2;
1972 
1973  repere._origin = org;
1974  pGeoNode->setRepere(repere);
1975  }
1976 }
1978 {
1979  if (pElement == nullptr)
1980  {
1981  return;
1982  }
1983  TYAcousticVolumeNode* pParent = dynamic_cast<TYAcousticVolumeNode*>(pElement->getParent());
1984  if (pParent == nullptr)
1985  {
1986  return;
1987  }
1988  TYAcousticVolumeGeoNode* pGeoNode = pParent->findAcousticVol(dynamic_cast<TYAcousticVolume*>(pElement));
1989  if (pGeoNode == nullptr)
1990  {
1991  return;
1992  }
1993 
1994  // The action is added to the ActionManager before the object is deleted
1995  TYAction* pAction =
1996  new TYRemAccVolToAccVolNodeAction(pGeoNode, pParent, _pModeler, TR("id_action_remvol"));
1997  _pModeler->getActionManager()->addAction(pAction);
1998  pParent->remAcousticVol(dynamic_cast<TYAcousticVolume*>(pElement));
1999  updateSiteFrame();
2000 
2001  // La scene a ete modifiee
2003 }
2005 {
2006  if (pElement == nullptr)
2007  {
2008  return;
2009  }
2010  TYAcousticVolumeNode* pVolParent = dynamic_cast<TYAcousticVolumeNode*>(pElement->getParent());
2011  if (pVolParent == nullptr)
2012  {
2013  return;
2014  }
2016  if (pGeoNode == nullptr)
2017  {
2018  return;
2019  }
2020 
2021  // Nouvel element du meme type que l'objet a dupliquer (clone)
2023  new TYAcousticVolumeGeoNode(dynamic_cast<TYAcousticVolume*>(pElement->clone()));
2024 
2025  // Duplication
2026  pCopy->deepCopy(pGeoNode, false);
2027 
2028  // Ajout
2029  if (pVolParent->addAcousticVol(pCopy))
2030  {
2031  // Offset
2032  ORepere3D repere = pCopy->getORepere3D();
2033 
2034  if (dynamic_cast<TYEtage*>(pCopy->getElement()) != nullptr)
2035  {
2036  TYElement* pElt = pCopy->getElement();
2037  repere._origin._z += ((TYEtage*)pElt)->getHauteur();
2038  }
2039  else
2040  {
2041  repere._origin._x += 20.0;
2042  repere._origin._y -= 20.0;
2043  }
2044 
2045  pCopy->setRepere(repere);
2046  // Update Graphic
2047  pCopy->updateGraphicTree();
2048 
2049  // Action
2050  TYAction* pAction =
2051  new TYAddAccVolToAccVolNodeAction(pCopy, pVolParent, _pModeler, TR("id_action_addvol"));
2052  _pModeler->getActionManager()->addAction(pAction);
2053  }
2054 
2055  updateSiteFrame();
2056 
2057  // La scene a ete modifiee
2059 }
2061 {
2062  if (pElement == nullptr)
2063  {
2064  return;
2065  }
2066  TYAcousticRectangleNode* pAccRectNode = dynamic_cast<TYAcousticRectangleNode*>(pElement);
2067  if (pAccRectNode == nullptr)
2068  {
2069  return;
2070  }
2071 
2072  TYFaceModelerFrame* pFaceMdF;
2073  pFaceMdF = new TYFaceModelerFrame(pAccRectNode, getTYMainWnd()->getWorkspace(), "face modeler");
2074  pFaceMdF->setAttribute(Qt::WA_DeleteOnClose);
2075  getTYMainWnd()->getWorkspace()->addSubWindow(pFaceMdF)->setObjectName("TYFaceModelerFrame");
2076 
2077  pFaceMdF->showMaximized();
2078  pFaceMdF->fit();
2079 }
2081 {
2082  if (pElement == nullptr)
2083  {
2084  return;
2085  }
2086  TYAcousticVolume* pVol = dynamic_cast<TYAcousticVolume*>(pElement);
2087 
2088  if (pVol)
2089  {
2090  pVol->inverseNormales();
2091  }
2092  pVol->setNormalStatus();
2093 }
2095 {
2097  {
2098  if (pElement == nullptr)
2099  {
2100  return;
2101  }
2102  TYEtage* pEtage = dynamic_cast<TYEtage*>(pElement);
2103  if (pEtage == nullptr)
2104  {
2105  return;
2106  }
2107 
2108  bool ok = false;
2109  double hauteur =
2110  TYModelerFrame::getDouble("", TR("id_msg_gethauteur"), 0.0, 1000.0, pEtage->getHauteur(), ok);
2111 
2112  if (ok)
2113  {
2114  pEtage->setHauteur(hauteur);
2115  pEtage->updateGraphic();
2116  }
2117  }
2118 }
2120 {
2122  {
2123  TYEcran* pEcran = dynamic_cast<TYEcran*>(pElement);
2124 
2125  bool ok = false;
2126  double hauteur = TYModelerFrame::getDouble("", TR("id_msg_gethauteur_ecran"), 0.0, 1000.0,
2127  pEcran->getHauteur(), ok);
2128 
2129  if (ok)
2130  {
2131  pEcran->setHauteur(hauteur);
2132  pEcran->updateGeometry();
2133  pEcran->updateGraphic();
2134  }
2135  }
2136 }
2138 {
2140  {
2141  TYEcran* pEcran = dynamic_cast<TYEcran*>(pElement);
2142 
2143  bool ok = false;
2144  double epaisseur = TYModelerFrame::getDouble("", TR("id_msg_getepaisseur_ecran"), 0.0, 1000.0,
2145  pEcran->getEpaisseur(), ok);
2146 
2147  if (ok)
2148  {
2149  pEcran->setEpaisseur(epaisseur);
2150  pEcran->updateGeometry();
2151  pEcran->updateGraphic();
2152  }
2153  }
2154 }
2155 
2157 {
2158  TYBox boundBox = dynamic_cast<TYAcousticVolumeNode*>(pNode->getElement())->volEnglob();
2159 
2160  pNode->getORepere3D()._origin =
2161  pNode->getORepere3D()._origin + OCoord3D(boundBox._sizeX / 2., boundBox._sizeY / 2., 0.);
2162 }
double RADTODEG(double a)
Converts an angle from radians to degrees.
Definition: 3d.h:137
double DEGTORAD(double a)
Converts an angle from degrees to radians.
Definition: 3d.h:126
TYGeometryNode TYAcousticVolumeGeoNode
Noeud geometrique de type TYAcousticVolume.
fichier contenant differents types d'actions (fichier header)
TYApplication * getTYApp()
Retourne le pointeur sur l'application.
TYMainWindow * getTYMainWnd()
Retourne le pointeur sur la fenetre principale.
pour l'application Tympan (fichier header)
TYGeometryNode TYBatimentGeoNode
Noeud geometrique de type TYBatiment.
Definition: TYBatiment.h:90
TYGeometryNode TYCourbeNiveauGeoNode
Noeud geometrique de type TYCourbeNiveau.
TYGeometryNode TYCoursEauGeoNode
Noeud geometrique de type TYCoursEau.
Definition: TYCoursEau.h:66
boite de dialogue pour la gestion des dimensions des volumes (fichier header)
Classe Modeler specialisee pour l'edition des faces (fichier header)
TYGeometryNode TYMachineGeoNode
Noeud geometrique de type TYMachine.
Definition: TYMachine.h:164
TYGeometryNode TYMaillageGeoNode
Noeud geometrique de type TYMaillage.
Definition: TYMaillage.h:434
std::vector< LPTYMaillageGeoNode > TYTabMaillageGeoNode
Collection de noeuds geometriques de type TYMaillage.
Definition: TYMaillage.h:438
Fenetre principale de l'application Tympan (fichier header)
gestion des items de menu avec une police et des styles particuliers (gras, italique....
Classe generique pour une fenetre de modeleur (fichier header)
Representation graphique d'un panel d'informations (fichier header)
#define IMG(id)
#define TR(id)
gestion de l'element actionne par picking (fichier header)
Objet pour le picking graphique (fichier header)
TYGeometryNode TYPlanEauGeoNode
Noeud geometrique de type TYPlanEau.
Definition: TYPlanEau.h:198
boite de dialogue pour la gestion de la position selon les modes 'moving', 'rotation',...
Representation graphique d'un maillage rectangulaire (fichier header)
Le role de cette classe est limite a emettre des signaux pouvant etre utilise pour interagir sur le r...
TYGeometryNode TYReseauTransportGeoNode
Noeud geometrique de type TYReseauTransport.
Boite de dialogue pour la saisie de la l'angle des objets (fichier header)
TYGeometryNode TYRouteGeoNode
Geometrical node of type TYRoute.
Definition: TYRoute.h:33
Frame pour la gestion de site (fichier header)
Classe Modeler specialisee pour l'edition des sites (fichier header)
TYGeometryNode TYSiteNodeGeoNode
Noeud geometrique de type TYSiteNode.
Definition: TYSiteNode.h:36
TYGeometryNode TYSourcePonctuelleGeoNode
Noeud geometrique de type TYSourcePonctuelle.
TYGeometryNode TYTerrainGeoNode
Noeud geometrique de type TYTerrain.
Definition: TYTerrain.h:177
outil IHM pour un objet metier de type TYElement (fichier header)
The 3D coordinate class.
Definition: 3d.h:226
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
The 4x4 matrix class.
Definition: 3d.h:625
int setRotationOz(double a)
Update a rotation matrix (Oz axis).
Definition: 3d.cpp:688
int setRotationOy(double a)
Update a rotation matrix (Oy axis).
Definition: 3d.cpp:676
int setRotationOx(double a)
Update a rotation matrix (Ox axis).
Definition: 3d.cpp:664
double _m[4][4]
The 4x4 matrix array.
Definition: 3d.h:922
static OMessageManager * get()
Definition: logging.cpp:108
virtual void info(const char *message,...)
Definition: logging.cpp:143
The 3D point class.
Definition: 3d.h:487
virtual OPrototype * clone() const =0
static OPrototype * safeDownCast(OPrototype *pObject)
Definition: TYElement.cpp:71
bool isA(const char *className) const
Definition: TYElement.cpp:65
3D frame with a point and 3 vectors.
Definition: 3d.h:1211
OPoint3D _origin
The origin point.
Definition: 3d.h:1279
double getValueReal(double freq)
Definition: spectre.cpp:959
Frame class.
Definition: Repere.h:26
void set(vec3 _U, vec3 _V, vec3 _W, vec3 _O)
Set global coordinates of local axis U,V,W and origin O.
Definition: Repere.h:41
T * _pObj
The real pointer, must derived IRefCount.
Definition: smartptr.h:307
Classe abstraite pour la gestion de l'interaction entre la vue graphique (2D ou 3D) et le clavier et ...
void refreshProjectFrame()
Rafraichit l'arborescence du TYProjectFrame.
void updateSiteFrame()
Reconstruit l'arborescence du TYSiteFrame.
TYModelerFrame * _pModeler
Le modeler associe a cet editor.
TYRenderWindowInteractor * _pInteractor
La vue graphique associee a cet editor.
void getDimension(float &larg, float &lon, float &haut)
bool addAcousticVol(LPTYAcousticVolumeGeoNode pAccVolGeoNode, bool recursif=true)
LPTYAcousticVolumeGeoNode findAcousticVol(const LPTYAcousticVolume pAccVol)
bool remAcousticVol(const LPTYAcousticVolumeGeoNode pAccVolGeoNode)
virtual void inverseNormales()
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
Action d'ajout d'un point de controle.
Definition: TYActions.h:875
Action d'ajout d'un site a un ensemble de sites.
Definition: TYActions.h:989
LPTYProjet getCurProjet()
Set/Get du projet courant.
TYCalculManager * getCalculManager()
Get du gestionnaire de calculs.
Definition: TYApplication.h:99
Definition: TYBox.h:34
double _sizeX
Dimension en X.
Definition: TYBox.h:128
double _sizeY
Dimension en Y.
Definition: TYBox.h:130
bool updateAcoustic(TYElement *pElement)
Appelle la methode de calcul acoustique du volume node passe.
bool askForResetResultat()
Previent l'utilisateur que le resultat va etre efface, si celui-ci est valide.
void getCalculElements(LPTYSiteNode pSite)
Recover all the elements of the scene which take part in the calculation.
Definition: TYCalcul.cpp:1037
bool addToSelection(TYUUID id)
Adds the item to the selection of this Calculation.
Definition: TYCalcul.cpp:872
LPTYCourbeNiveau split(const TYPoint &pt)
return a new level curve by spliting the actual one at indicated point
boite de dialogue pour la gestion des dimensions des volumes
void setEpaisseur(double epaisseur)
Definition: TYEcran.cpp:353
void updateGeometry()
Definition: TYEcran.cpp:372
double getHauteur() const
Definition: TYEcran.cpp:362
double getEpaisseur() const
Definition: TYEcran.cpp:367
void setHauteur(double hauteur)
Definition: TYEcran.cpp:344
classe graphique pour un element de base
void setVisible(bool visible=true)
void elementPicked(TYElement *pElt)
Indique qu'un element a ete picke, sans connaitre son type. Celui-ci sera de type "bas niveau".
void reset()
Retourne dans son etat initial.
void highlightElement(TYElement *pElt)
Dessine la boite englobante de l'element passe.
bool pick(int x, int y)
Effectue un picking en (x, y).
void elementCollectionPicked(std::shared_ptr< LPTYElementArray > pElts)
Indique qu'un element a ete picke, sans connaitre son type. La collection d'elements pickes est compo...
TYElement * getParent() const
Definition: TYElement.h:699
static void setIsSavedOk(const bool &toSave)
Definition: TYElement.h:915
void setParent(TYElement *pParent)
Definition: TYElement.h:692
virtual void setIsGeometryModified(bool isModified)
Definition: TYElement.cpp:253
double getHauteur() const
Definition: TYEtage.cpp:1018
void setHauteur(double hauteur)
Definition: TYEtage.cpp:994
Classe Modeler specialisee pour l'edition des faces.
const ORepere3D & getORepere3D() const
OMatrix localToGlobal() const
OMatrix globalToLocal() const
void setHauteur(const double &hauteur)
Set the heigth above the ground.
void setElement(LPTYElement pElt)
double getHauteur()
Get the height above the ground.
TYElement * getElement() const
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
static TYGeometryNode * GetGeoNode(TYElement *pElement)
void setRepere(const ORepere3D &repere)
bool remSrc(const LPTYUserSourcePonctuelle pSrc)
LPTYMachineGeoNode findMachine(const LPTYMachine pMachine)
bool addBatiment(LPTYBatimentGeoNode pBatimentGeoNode)
bool addMachine(LPTYMachineGeoNode pMachineGeoNode)
LPTYBatimentGeoNode findBatiment(const LPTYBatiment pBatiment)
bool addSrc(LPTYUserSourcePonctuelle pSrc)
bool remResTrans(const LPTYReseauTransportGeoNode pResTransGeoNode)
bool remMachine(const LPTYMachine pMachine)
LPTYUserSourcePonctuelleGeoNode findSrc(const LPTYUserSourcePonctuelle pSrc)
bool remBatiment(const LPTYBatimentGeoNode pBatimentGeoNode)
LPTYReseauTransportGeoNode findResTrans(const LPTYReseauTransport pResTrans)
bool addResTrans(LPTYReseauTransportGeoNode pResTransGeoNode)
Classe de definition d'un maillage.
Definition: TYMaillage.h:51
@ ValGlobalDBLin
Definition: TYMaillage.h:299
void updateModelers(bool clipping=true, bool axesAndGrid=true, bool displayList=true)
TYSiteFrame * getSiteFrame()
Definition: TYMainWindow.h:80
QMdiArea * getWorkspace()
Definition: TYMainWindow.h:66
Classe generique pour une fenetre de modeleur.
LPTYElement getElement()
virtual bool computeCurPos(int x, int y, float *pos)
TYRenderWindowInteractor * getView()
TYElementPicker * getElementPicker()
TYActionManager * getActionManager()
bool askForResetResultat()
static double getDouble(const QString &title, const QString &txt, double min, double max, double val, bool &ok, int dec=2)
Actions de deplacement d'un GeometryNode.
Definition: TYActions.h:575
void updateDisplayList(void)
classe graphique pour un panel d'informations
void setFirstPos(const std::string &firstPos)
Set de la premiere position.
Definition: TYPanel.h:96
void setValue(const std::string &value)
Set de la valeur.
Definition: TYPanel.h:134
void setSecondPos(const std::string &secondPos)
Set de la seconde position.
Definition: TYPanel.h:115
void remSite(TYElement *pElement)
void copyTopoElmt(TYElement *pElement)
void screenThick(TYElement *pElement)
void openFaceModeler(TYElement *pElement)
void inverseNormal(TYElement *pElement)
void copyMaillage(TYElement *pElement)
void updateCopyPosition(LPTYGeometryNode &pNode)
void copySite(TYElement *pElement)
void screenHeight(TYElement *pElement)
virtual void showPopupMenu(std::shared_ptr< LPTYElementArray > pElts)
void resetPicker()
Definition: TYPickEditor.h:112
void showRotationDialog(TYGeometryNode *pGeoNode)
void manageProperties(TYElement *pElement)
virtual void slotKeyPressed(int key)
bool realWorldPosition(OPoint3D &pt)
TYPickEditor(TYModelerFrame *pModeler)
void setVolumeSize(TYElement *pElement)
void showDimensionsDialog(TYAcousticVolume *pAccVol)
void removeVolume(TYElement *pElement)
void copyVolume(TYElement *pElement)
void batimentModelerPopupMenu(std::shared_ptr< LPTYElementArray > pElts)
void setRolloverTolerance(float tolerance)
Definition: TYPickEditor.h:74
void setPickTolerance(float tolerance)
Definition: TYPickEditor.h:59
virtual void slotMousePressed(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
virtual void slotMouseLeave()
virtual void slotMouseReleased(int x, int y, Qt::MouseButton button, Qt::KeyboardModifiers state)
void floorHeight(TYElement *pElement)
void showPositionDialog(TYGeometryNode *pGeoNode, bool activeHeight)
void remTopoElmt(TYElement *pElement)
void copyInfraElmt(TYElement *pElement)
TYElementPicker * _pPicker
Le picker du modeler.
Definition: TYPickEditor.h:154
void siteModelerPopupMenu(std::shared_ptr< LPTYElementArray > pElts)
TYElement * _pLastRolloverElt
Definition: TYPickEditor.h:161
QPoint _lastPressedCurPos
Derniere position de la souris.
Definition: TYPickEditor.h:157
float _pickTolerance
Tolerance du picking.
Definition: TYPickEditor.h:169
void remPtCtrl(TYElement *pElement)
void machineModelerPopupMenu(std::shared_ptr< LPTYElementArray > pElts)
void remInfraElmt(TYElement *pElement)
QPoint _lastMovedCurPos
Definition: TYPickEditor.h:158
void remMaillage(TYElement *pElement)
void splitCurve(TYElement *pElement)
void copyPtCtrl(TYElement *pElement)
virtual void slotMouseMoved(int x, int y, Qt::MouseButtons button, Qt::KeyboardModifiers state)
bool _useHighlight
Flag pour l'activation du highlight.
Definition: TYPickEditor.h:164
void showPanel(TYElement *pElt)
bool _usePopup
Flag pour l'activation du popup menu.
Definition: TYPickEditor.h:166
virtual void slotWheeled(int x, int y, int delta, Qt::KeyboardModifiers state)
void offsetListPoints()
Definition: TYPlanEau.cpp:158
double getValLin()
Get de la valeur globale Lin au point.
virtual LPTYSpectre getSpectre()
Get du spectre resultat d'un calcul donne.
double getValA()
Get de la valeur globale A au point.
Classe de definition d'un point de controle.Le point de controle est un point de calcul avec une haut...
virtual bool deepCopy(const TYElement *pOther, bool copyId=true, bool pUseCopyTag=false)
boite de dialogue pour la gestion de la position selon les modes 'moving', 'rotation',...
void setHauteurEnabled(const bool &enable)
Get/Set de l'etat de la zone de saisie des hauteurs.
classe de definition d'un projet.
Definition: TYProjet.h:45
TYTabMaillageGeoNode & getMaillages()
Get de la collection de maillages.
Definition: TYProjet.h:261
bool remPointControl(LPTYPointControl pPointControl)
Definition: TYProjet.cpp:412
bool remMaillage(const LPTYMaillageGeoNode pMaillageGeoNode)
Suppression d'un maillage.
Definition: TYProjet.cpp:818
LPTYSiteNode getSite()
Get du site.
Definition: TYProjet.h:169
LPTYCalcul getCurrentCalcul()
Set/Get du pointeur du Calcul courant.
Definition: TYProjet.h:426
float getSizeX()
float getSizeY()
Classe de definition d'un maillage rectangulaire.
LPTYRectangle getRectangle() const
Retourne le rectangle associe a ce maillage.
suppression d'un volume acoustique a un ensemble de volumes acoustiques
Definition: TYActions.h:177
Suppression d'un element a une infrastructure.
Definition: TYActions.h:430
Suppression d'un element a la topographie.
Definition: TYActions.h:367
Action de suppression d'un point de controle.
Definition: TYActions.h:901
Action de suppression d'un site a un ensemble de sites.
Definition: TYActions.h:1020
virtual void updateGL()
TYOpenGLRenderer * getRenderer()
Actions de rotation d'un GeometryNode.
Definition: TYActions.h:607
Boite de dialogue pour la saisie de la l'angle des objets.
void lockXY()
Empeche les rotations selon X et Y (utile pour les sites ...)
bool getConcatenateStatus()
Retourne l'etat du checkbox de concatenation des rotations.
void updateList()
Classe Modeler specialisee pour l'edition des sites.
LPTYSiteNode getSite()
LPTYTopographie getTopographie()
Definition: TYSiteNode.h:148
bool remSiteNode(const LPTYSiteNodeGeoNode pSiteNodeGeoNode)
void update(const bool &force=false)
bool getRoot() const
Definition: TYSiteNode.h:311
void offsetListPoints()
Definition: TYTerrain.cpp:279
LPTYCourbeNiveauGeoNode findCrbNiv(const LPTYCourbeNiveau pCrbNiv)
LPTYTerrainGeoNode findTerrain(const LPTYTerrain pTerrain)
bool remCrbNiv(const LPTYCourbeNiveauGeoNode pCrbNivGeoNode)
bool addCrsEau(LPTYCoursEauGeoNode pCoursEauGeoNode)
LPTYPlanEauGeoNode findPlanEau(const LPTYPlanEau pPlanEau)
bool remPlanEau(const LPTYPlanEauGeoNode pPlanEauGeoNode)
LPTYCoursEauGeoNode findCrsEau(const LPTYCoursEau pCrsEau)
bool addCrbNiv(LPTYCourbeNiveauGeoNode pCrbNivGeoNode)
bool addPlanEau(LPTYPlanEauGeoNode pPlanEauGeoNode)
bool remCrsEau(const LPTYCoursEauGeoNode pCoursEauGeoNode)
bool addTerrain(LPTYTerrainGeoNode pTerGeoNode)
bool remTerrain(const LPTYTerrainGeoNode pTerGeoNode)
static QString getDisplayName(TYElement *pElt)
Definition: TYWidget.cpp:118
std::string doubleToStrPre(double val, int precision=2)
Definition: macros.h:205