Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYFaceModelerPickEditor.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) <2012> <EDF-R&D> <FRANCE>
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10  * See the GNU General Public License for more details.
11  * You should have received a copy of the GNU General Public License along
12  * with this program; if not, write to the Free Software Foundation, Inc.,
13  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
14  */
15 
21 #include <math.h>
22 #include <qdialog.h>
23 #include <qpushbutton.h>
24 #include <qlabel.h>
25 #include <qlayout.h>
26 #include <qmenu.h>
27 #include <qcursor.h>
28 #include <qinputdialog.h>
29 #include <QMessageBox>
30 // Added by qt3to4:
31 #include <QHBoxLayout>
32 #include <QBoxLayout>
33 #include <QGridLayout>
34 #include <QPixmap>
35 
50 
51 #define TR(id) OLocalizator::getString("TYFaceModelerPickEditor", (id))
52 #define IMG(id) OLocalizator::getPicture("TYPickEditor", (id))
53 
55 
57 
58 void TYFaceModelerPickEditor::showPopupMenu(std::shared_ptr<LPTYElementArray> pElts)
59 {
60  if (!pElts)
61  {
62  return;
63  }
64 
65  QMenu* pPopup = new QMenu(NULL);
66  TYAcousticRectangleNode* pParent = NULL;
67  std::map<QAction*, int> retCodes;
68  std::map<QAction*, LPTYGeometryNode> posRetCodes;
69  std::map<QAction*, TYAcousticRectangle*> dimAccRectRetCodes;
70  std::map<QAction*, TYAcousticRectangle*> remAccRectRetCodes;
71  QAction* code = NULL;
72  unsigned int i = 0;
73 
74  while ((i < pElts->size()) && (i + 1 < pElts->size()))
75  {
76  if (dynamic_cast<TYAcousticRectangle*>(pElts->at(i)._pObj) != nullptr)
77  {
78  // Proprietes
79  QFont font = pPopup->font();
80  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_editeelt"))),
81  TYWidget::getDisplayName(pElts->at(i)));
82  font.setBold(true);
83  code->setFont(font);
84 
85  retCodes[code] = i;
86 
87  // Dimensions
88  if (dynamic_cast<TYAcousticSurfaceNode*>(pElts->at(i + 1)._pObj) != nullptr)
89  {
90  pParent = (LPTYAcousticRectangleNode&)pElts->at(i + 1);
91  code = pPopup->addAction(TR("id_popup_dimension"));
92  dimAccRectRetCodes[code] = (LPTYAcousticRectangle&)pElts->at(i);
93  }
94 
95  // Position via le parent (GeoNode)
96  if (dynamic_cast<TYAcousticSurfaceNode*>(pElts->at(i + 1)._pObj) != nullptr)
97  {
98  pParent = (LPTYAcousticRectangleNode&)pElts->at(i + 1);
99  code = pPopup->addAction(QIcon(IMG("id_icon_moving")), TR("id_popup_position"));
100  posRetCodes[code] =
101  (TYGeometryNode*)pParent->findAcousticSurf((LPTYAcousticSurface&)pElts->at(i));
102  }
103 
104  // Suppression
105  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_del"))), TR("id_popup_remove"));
106  remAccRectRetCodes[code] = (LPTYAcousticRectangle&)pElts->at(i);
107 
108  pPopup->addSeparator();
109  }
110  else if (dynamic_cast<TYAcousticRectangleNode*>(pElts->at(i)._pObj) != nullptr)
111  {
112  // Face parent
113  code = pPopup->addAction(QIcon(QPixmap(IMG("id_icon_editeelt"))),
114  TYWidget::getDisplayName(pElts->at(i)));
115  retCodes[code] = i;
116 
117  // On a la sous-face et son parent
118  break;
119  }
120 
121  // Increment
122  i++;
123  }
124 
125  QAction* popupRet = pPopup->exec(QCursor::pos());
126 
127  if (retCodes.find(popupRet) != retCodes.end())
128  {
129  pElts->at(retCodes[popupRet])->edit(_pModeler);
130  }
131  else if (dimAccRectRetCodes.find(popupRet) != dimAccRectRetCodes.end())
132  {
133  showDimensionsDialog(dimAccRectRetCodes[popupRet]->getShape(), pParent);
134  }
135  else if (posRetCodes.find(popupRet) != posRetCodes.end())
136  {
137  showPositionDialog(posRetCodes[popupRet].getRealPointer(), false);
138  if (pParent)
139  {
140  pParent->updateGrid();
141  }
142  }
143  else if (remAccRectRetCodes.find(popupRet) != remAccRectRetCodes.end())
144  {
146  {
147  LPTYAcousticSurfaceGeoNode pGeoNode = pParent->findAcousticSurf(remAccRectRetCodes[popupRet]);
148 
149  pParent->remAcousticSurf(remAccRectRetCodes[popupRet]);
150  pParent->setIsGeometryModified(true);
151  pParent->updateGraphicTree();
152 
153  TYAction* pAction =
154  new TYRemAccSurfToAccSurfNodeAction(pGeoNode, pParent, _pModeler, TR("id_action_remface"));
155  _pModeler->getActionManager()->addAction(pAction);
156  }
157  }
158 
159  // Deselection
160  resetPicker();
161 
162  // Update
163  getTYMainWnd()->updateModelers(false, false);
164 
165  delete pPopup;
166 }
167 
169  TYAcousticRectangleNode* pParent /*=NULL*/)
170 {
171  if (!pRect)
172  {
173  return;
174  }
175 
176  TYFormDialog* pDlg = new TYFormDialog(_pModeler);
177  pDlg->setWindowTitle(TR("id_popup_dimension"));
178 
179  QGridLayout* pLayout = new QGridLayout();
180  pDlg->setLayout(pLayout);
181 
182  QBoxLayout* pEditLayout = new QHBoxLayout();
183  pEditLayout->setContentsMargins(10, 10, 10, 10);
184  pLayout->addLayout(pEditLayout, 0, 1);
185 
186  TYLineEdit* pXLineEdit = NULL;
187  TYLineEdit* pYLineEdit = NULL;
188 
189  float sizeX = NAN, sizeY = NAN;
190  pRect->getSize(sizeX, sizeY);
191 
192  // Size X
193  QLabel* pXLabelName = new QLabel(pDlg);
194  pXLabelName->setText(TR("id_x_label"));
195  pEditLayout->addWidget(pXLabelName);
196  pXLineEdit = new TYLineEdit(pDlg);
197  pXLineEdit->setFixedWidth(60);
198  pXLineEdit->setText(QString().setNum(sizeX, 'f', 2));
199  pEditLayout->addWidget(pXLineEdit);
200 
201  // Size Y
202  pEditLayout->addSpacing(10);
203  QLabel* pYLabelName = new QLabel(pDlg);
204  pYLabelName->setText(TR("id_y_label"));
205  pEditLayout->addWidget(pYLabelName);
206  pYLineEdit = new TYLineEdit(pDlg);
207  pYLineEdit->setFixedWidth(60);
208  pYLineEdit->setText(QString().setNum(sizeY, 'f', 2));
209  pEditLayout->addWidget(pYLineEdit);
210 
211  QBoxLayout* pBtnLayout = new QHBoxLayout();
212  pLayout->addLayout(pBtnLayout, 1, 1);
213 
214  pBtnLayout->addStretch(1);
215 
216  QPushButton* pButtonOK = new QPushButton(TR("id_ok_btn"), pDlg);
217  pButtonOK->setDefault(true);
218  QObject::connect(pButtonOK, &QPushButton::clicked, pDlg, &QDialog::accept);
219  pBtnLayout->addWidget(pButtonOK);
220 
221  QPushButton* pButtonCancel = new QPushButton(TR("id_cancel_btn"), pDlg);
222  pButtonCancel->setShortcut(Qt::Key_Escape);
223  QObject::connect(pButtonCancel, &QPushButton::clicked, pDlg, &QDialog::reject);
224  pBtnLayout->addWidget(pButtonCancel);
225 
226  // Affiche la boite de dialogue
227  int ret = pDlg->exec();
228 
229  // Applique les modificatins si necessaire
230  if (ret == QDialog::Accepted)
231  {
233  {
234  float sizeX = pXLineEdit->text().toDouble();
235  float sizeY = pYLineEdit->text().toDouble();
236 
237  if (sizeX <= 1E-4 || sizeY <= 1.E-4) // Eviter les surfaces nulles
238  {
239  QMessageBox::warning(_pModeler, "Tympan", TR("id_warning_size_not_ok"),
240  QMessageBox::Yes); //, QMessageBox::No);
241  return;
242  }
243 
244  TYAction* pAction =
245  new TYResizeRectAction(pRect, sizeX, sizeY, _pModeler, TR("id_action_resizeface"));
246  _pModeler->getActionManager()->addAction(pAction);
247 
248  pRect->setSize(sizeX, sizeY);
249 
250  if (pParent)
251  {
252  pParent->updateGrid();
253  }
254 
255  // Refresh
256  pRect->updateGraphicTree();
257  }
258  }
259 
260  delete pBtnLayout;
261  delete pEditLayout;
262 }
fichier contenant differents types d'actions (fichier header)
TYMainWindow * getTYMainWnd()
Retourne le pointeur sur la fenetre principale.
pour l'application Tympan (fichier header)
#define IMG(id)
#define TR(id)
gestion du picking des faces (fichier header)
Parent class of Tympan Qt dialogs of type form (geader file)
outil IHM pour une entrée utilisateur (fichier header)
Fenetre principale de l'application Tympan (fichier header)
Classe generique pour une fenetre de modeleur (fichier header)
Objet pour le picking graphique (fichier header)
outil IHM pour un objet metier de type TYElement (fichier header)
TYModelerFrame * _pModeler
Le modeler associe a cet editor.
virtual bool remAcousticSurf(const LPTYAcousticSurfaceGeoNode pAccSurfGeoNode)
LPTYAcousticSurfaceGeoNode findAcousticSurf(const LPTYAcousticSurface pAccSurf)
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
virtual void setIsGeometryModified(bool isModified)
Definition: TYElement.cpp:253
TYFaceModelerPickEditor(TYModelerFrame *pModeler)
void showDimensionsDialog(TYRectangle *pRect, TYAcousticRectangleNode *pParent=NULL)
virtual void showPopupMenu(std::shared_ptr< LPTYElementArray > pElts)
void updateModelers(bool clipping=true, bool axesAndGrid=true, bool displayList=true)
Classe generique pour une fenetre de modeleur.
TYActionManager * getActionManager()
bool askForResetResultat()
gestion de l'element actionne par picking
Definition: TYPickEditor.h:40
void resetPicker()
Definition: TYPickEditor.h:112
void showPositionDialog(TYGeometryNode *pGeoNode, bool activeHeight)
void setSize(float sizeX, float sizeY)
void getSize(float &sizeX, float &sizeY)
suppression d'une surface acoustique a un ensemble de surfaces acoustiques
Definition: TYActions.h:108
Action de redimensionnement d'un rectangle.
Definition: TYActions.h:462
static QString getDisplayName(TYElement *pElt)
Definition: TYWidget.cpp:118