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