Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYProjetWidget.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 
26 #include <qmenu.h>
27 // Added by qt3to4:
28 #include <QGridLayout>
29 #include <QDateEdit>
30 #include <QTextEdit>
31 #include <QLabel>
32 #include <QTreeWidget>
33 #include <QTreeWidgetItem>
34 #include <QContextMenuEvent>
35 #include <QHeaderView>
36 #include <QtWidgets>
37 #include <QRadioButton>
38 
39 #include "TYProjetWidget.h"
40 #include "TYElementWidget.h"
41 
42 #define TR(id) OLocalizator::getString("TYProjetWidget", (id))
43 
44 TYProjetWidget::TYProjetWidget(TYProjet* pElement, QWidget* _pParent /*=NULL*/) : TYWidget(pElement, _pParent)
45 {
46 
47  _elmW = new TYElementWidget(pElement, this);
48 
49  resize(300, 460);
50  setWindowTitle(TR("id_caption"));
51  _projetLayout = new QGridLayout();
52  setLayout(_projetLayout);
53  _projetLayout->addWidget(_elmW, 0, 0);
54 
55  // Tab organization
56  _tabWidget = new QTabWidget(this);
57 
58  // Groupe identification (Auteur, Date creation/modification, commentaire)
59  _groupBox = new QGroupBox(this);
60  _groupBox->setTitle(TR(""));
61  QGridLayout* _groupBoxLayout = new QGridLayout();
62  _groupBox->setLayout(_groupBoxLayout);
63 
64  _lineEditAuteur = new QLineEdit(_groupBox);
65  _groupBoxLayout->addWidget(_lineEditAuteur, 0, 1);
66 
67  _labelAuteur = new QLabel(_groupBox);
68  _labelAuteur->setText(TR("id_auteur_label"));
69  _groupBoxLayout->addWidget(_labelAuteur, 0, 0);
70 
71  QDate date;
72 
73  _editDateCreation = new QDateEdit(_groupBox);
74  if (getElement()->getDateCreation() == "2001-10-01")
75  {
76  getElement()->setDateCreation(date.currentDate().toString(Qt::ISODate));
77  }
78  _editDateCreation->setDate(date.fromString(getElement()->getDateCreation(), Qt::ISODate));
79  _groupBoxLayout->addWidget(_editDateCreation, 2, 1);
80 
81  _labelDateCreation = new QLabel(_groupBox);
82  _labelDateCreation->setText(TR("id_datecreation_label"));
83  _groupBoxLayout->addWidget(_labelDateCreation, 2, 0);
84 
85  _labelDateModif = new QLabel(_groupBox);
86  _labelDateModif->setText(TR("id_datemodif_label"));
87  _groupBoxLayout->addWidget(_labelDateModif, 3, 0);
88 
89  _editDateModif = new QDateEdit(_groupBox);
90  if (getElement()->getDateModif() == "2001-10-01")
91  {
92  getElement()->setDateModif(date.currentDate().toString(Qt::ISODate));
93  }
94  _editDateModif->setDate(date.fromString(getElement()->getDateModif(), Qt::ISODate));
95  _groupBoxLayout->addWidget(_editDateModif, 3, 1);
96 
97  _lineEditComment = new QTextEdit(_groupBox);
98  _groupBoxLayout->addWidget(_lineEditComment, 5, 0, 1, 2);
99 
100  _labelComment = new QLabel(_groupBox);
101  _labelComment->setText(TR("id_comment_label"));
102  _groupBoxLayout->addWidget(_labelComment, 4, 0);
103 
104  _tabWidget->addTab(_groupBox, TR("id_tab_info"));
105 
106  // Onglet Acoustique ---
107  _groupBoxAcoustique = new QGroupBox(this);
108  _groupBoxAcoustique->setTitle(QString()); // pas de titre pour l’onglet lui-même
109 
110  QGridLayout* acoustiqueLayout = new QGridLayout();
111  acoustiqueLayout->setAlignment(Qt::AlignTop);
112  _groupBoxAcoustique->setLayout(acoustiqueLayout);
113 
114  // Section encadrée avec titre localisé
116  _groupBoxAcoustiqueForm->setTitle(TR("id_acoustique_section_title"));
117  QGridLayout* acoustiqueFormLayout = new QGridLayout();
118  acoustiqueFormLayout->setAlignment(Qt::AlignTop);
119  _groupBoxAcoustiqueForm->setLayout(acoustiqueFormLayout);
120 
121  // Ligne radios (même libellés que TYSpectreWidget)
122  QWidget* spectreFormRow = new QWidget(_groupBoxAcoustiqueForm);
123  QHBoxLayout* spectreFormLayout = new QHBoxLayout(spectreFormRow);
124  spectreFormLayout->setContentsMargins(0, 0, 0, 0);
125 
126  _radioSpectreTiers = new QRadioButton(spectreFormRow);
127  _radioSpectreOctave = new QRadioButton(spectreFormRow);
128  _radioSpectreTiers->setText(TR("id_radiobutton_tiers"));
129  _radioSpectreOctave->setText(TR("id_radiobutton_octave"));
130 
131  // Par défaut: tiers d’octave
132  _radioSpectreTiers->setChecked(true);
133 
134  spectreFormLayout->addWidget(_radioSpectreTiers);
135  spectreFormLayout->addWidget(_radioSpectreOctave);
136  spectreFormLayout->addStretch(1);
137 
138  acoustiqueFormLayout->addWidget(spectreFormRow, 0, 0, 1, 1);
139 
140  // Ajoute la section à l’onglet
141  acoustiqueLayout->addWidget(_groupBoxAcoustiqueForm, 0, 0, 1, 1);
142  _tabWidget->addTab(_groupBoxAcoustique, TR("id_tab_acoustique"));
143 
144  // Onglet Site
145  _groupBoxSite = new QGroupBox(this);
146  QGridLayout* groupBoxSiteLayout = new QGridLayout();
147  _groupBoxSite->setLayout(groupBoxSiteLayout);
148 
149  QPushButton* _pushButtonSite = new QPushButton(_groupBoxSite);
150  _pushButtonSite->setText(TR("id_proprietes_button"));
151  groupBoxSiteLayout->addWidget(_pushButtonSite, 0, 1);
152 
153  _lineEditNomSite = new QLineEdit(_groupBoxSite);
154  _lineEditNomSite->setEnabled(false);
155  groupBoxSiteLayout->addWidget(_lineEditNomSite, 0, 0);
156 
157  _labelDistMax = new QLabel(_groupBoxSite);
158  _labelDistMax->setText(TR("id_distMax_label"));
159  groupBoxSiteLayout->addWidget(_labelDistMax, 1, 0);
160 
162  groupBoxSiteLayout->addWidget(_lineEditDistMax, 1, 1);
163 
165  _labelDelaunayTolerence->setText(TR("id_delaunay_label"));
166  groupBoxSiteLayout->addWidget(_labelDelaunayTolerence, 2, 0);
167 
169  groupBoxSiteLayout->addWidget(_lineEditDelaunayTolerence, 2, 1);
170 
171  _labelUseDefault = new QLabel(_groupBoxSite);
172  _labelUseDefault->setText(TR("id_useDefault_label"));
173  groupBoxSiteLayout->addWidget(_labelUseDefault, 3, 0);
174 
175  QPushButton* _pushButtonUseDefault = new QPushButton(_groupBoxSite);
176  _pushButtonUseDefault->setText(TR("id_default_button"));
177  groupBoxSiteLayout->addWidget(_pushButtonUseDefault, 3, 1);
178 
179  _tabWidget->addTab(_groupBoxSite, TR("id_site"));
180 
181  // Onglet calcul
182  QGroupBox* groupBoxCalculs = new QGroupBox(this);
183  QGridLayout* groupBoxCalculsLayout = new QGridLayout();
184  groupBoxCalculs->setLayout(groupBoxCalculsLayout);
185 
186  _groupBoxCurCalcul = new QGroupBox(groupBoxCalculs);
187  _groupBoxCurCalcul->setTitle(TR("id_curcalcul"));
188  QGridLayout* groupBoxCurCalculLayout = new QGridLayout();
189  _groupBoxCurCalcul->setLayout(groupBoxCurCalculLayout);
190 
191  QPushButton* _pushButtonCurCalcul = new QPushButton(_groupBoxCurCalcul);
192  _pushButtonCurCalcul->setText(TR("id_proprietes_button"));
193  groupBoxCurCalculLayout->addWidget(_pushButtonCurCalcul, 0, 1);
194 
195  _lineEditNomCurCalcul = new QLineEdit(_groupBoxCurCalcul);
196  _lineEditNomCurCalcul->setEnabled(false);
197 
198  groupBoxCurCalculLayout->addWidget(_lineEditNomCurCalcul, 0, 0);
199 
200  groupBoxCalculsLayout->addWidget(_groupBoxCurCalcul, 0, 0);
201 
202  // Groupe tableau des calculs
203  _groupBoxTab = new QGroupBox(groupBoxCalculs);
204  _groupBoxTab->setTitle(TR("id_tabCalcul_box"));
205  QGridLayout* groupBoxTabLayout = new QGridLayout();
206  _groupBoxTab->setLayout(groupBoxTabLayout);
207 
208  _listViewTabCalcul = new QTreeWidget(_groupBoxTab);
209  _listViewTabCalcul->setColumnCount(2);
210  QStringList stringList;
211  stringList.append(TR(""));
212  stringList.append(TR("id_calcul"));
213  _listViewTabCalcul->setHeaderLabels(stringList);
214  _listViewTabCalcul->setRootIsDecorated(true);
215  //_listViewTabCalcul->setHeaderHidden(true);
216 
217  groupBoxTabLayout->addWidget(_listViewTabCalcul, 0, 0);
218 
219  groupBoxCalculsLayout->addWidget(_groupBoxTab, 1, 0);
220 
221  _tabWidget->addTab(groupBoxCalculs, TR("id_calcul"));
222 
223  // Onglet des points de controle
224  _tableauPointsControle = new QTableWidget();
225  _tableauPointsControle->setColumnCount(5);
226  _tableauPointsControle->setHorizontalHeaderItem(0, new QTableWidgetItem(TR("id_nom_pc")));
227  _tableauPointsControle->setHorizontalHeaderItem(1, new QTableWidgetItem(TR("id_pos_x")));
228  _tableauPointsControle->setHorizontalHeaderItem(2, new QTableWidgetItem(TR("id_pos_y")));
229  _tableauPointsControle->setHorizontalHeaderItem(3, new QTableWidgetItem(TR("id_pos_h")));
230  _tableauPointsControle->setHorizontalHeaderItem(4, new QTableWidgetItem(TR("id_actif")));
231 
232  _tabWidget->addTab(_tableauPointsControle, TR("id_opt_pc"));
233 
234  // DEFINITION DE L'ONGLET MAILLAGES
235  _tableauMaillages = new QTableWidget();
236  _tableauMaillages->setColumnCount(2);
237  _tableauMaillages->setHorizontalHeaderItem(0, new QTableWidgetItem(TR("id_nom_pc")));
238  _tableauMaillages->setHorizontalHeaderItem(1, new QTableWidgetItem(TR("id_actif")));
239 
240  _tabWidget->addTab(_tableauMaillages, TR("id_opt_maillage"));
241 
242  _projetLayout->addWidget(_tabWidget, 1, 0);
243 
244  updateContent();
245 
246  connect(_pushButtonCurCalcul, &QPushButton::clicked, this, &TYProjetWidget::editCurCalcul);
247  connect(_pushButtonSite, &QPushButton::clicked, this, &TYProjetWidget::editSite);
248  connect(_pushButtonUseDefault, &QPushButton::clicked, this, &TYProjetWidget::updateDefault);
249 }
250 
252 
254 {
255  QDate date;
256 
257  _elmW->updateContent();
258 
259  _lineEditAuteur->setText(getElement()->getAuteur());
260  _lineEditNomSite->setText(QString(getElement()->getSite()->getName()));
261  if (getElement()->getCurrentCalcul() != NULL)
262  {
263  _groupBoxCurCalcul->setEnabled(true);
264  _lineEditNomCurCalcul->setText(QString(getElement()->getCurrentCalcul()->getName()));
265  }
266  else
267  {
268  _groupBoxCurCalcul->setEnabled(false);
269  }
270 
271  _lineEditComment->setPlainText(getElement()->getComment());
272  _editDateModif->setDate(date.currentDate());
273  _editDateCreation->setDate(date.fromString(getElement()->getDateCreation(), Qt::ISODate));
274 
275  _lineEditDistMax->setText(QString().setNum(getElement()->getDMax()));
276  _lineEditDelaunayTolerence->setText(QString().setNum(getElement()->getDelaunayTolerence()));
277 
278  _listViewTabCalcul->clear();
279  for (unsigned int i = 0; i < getElement()->getListCalcul().size(); i++)
280  {
281  QTreeWidgetItem* item = new QTreeWidgetItem(_listViewTabCalcul, 0);
282  item->setText(0, QString().setNum(i));
283  item->setText(1, getElement()->getListCalcul().at(i)->getName());
284  }
285 
286  // Remplissage du tableau des points de controle
287  TYProjet* pProjet = getElement();
288  if (pProjet)
289  {
292  }
293  // --- Synchro des radios depuis le projet ---
294  if (getElement()->displaySpectrumInOctaveForm())
295  {
296  _radioSpectreOctave->setChecked(true);
297  _radioSpectreTiers->setChecked(false);
298  }
299  else
300  {
301  _radioSpectreTiers->setChecked(true);
302  _radioSpectreOctave->setChecked(false);
303  }
304 }
305 
307 {
308  TYTabLPPointControl& tabPoints = getElement()->getPointsControl();
309  unsigned int nbPoints = static_cast<uint32>(tabPoints.size());
310  _tableauPointsControle->setRowCount(nbPoints);
311 
312  QString msg;
313  unsigned int row = 0;
314  for (row = 0; row < nbPoints; row++)
315  {
316  _tableauPointsControle->setItem(row, 0, new QTableWidgetItem(tabPoints[row]->getName()));
317 
318  msg = QString(TR("id_cell_posx")).arg(tabPoints[row]->_x, 7, 'f', 1);
319  _tableauPointsControle->setItem(row, 1, new QTableWidgetItem(msg));
320 
321  msg = QString(TR("id_cell_posy")).arg(tabPoints[row]->_y, 7, 'f', 1);
322  _tableauPointsControle->setItem(row, 2, new QTableWidgetItem(msg));
323 
324  msg = QString(TR("id_cell_posh")).arg(tabPoints[row]->getHauteur(), 7, 'f', 1);
325  _tableauPointsControle->setItem(row, 3, new QTableWidgetItem(msg));
326 
327  QTableWidgetItem* pCheckItemActif = new QTableWidgetItem("");
328 
329  if (tabPoints[row]->etat())
330  {
331  pCheckItemActif->setCheckState(Qt::Checked);
332  }
333  else
334  {
335  pCheckItemActif->setCheckState(Qt::Unchecked);
336  }
337 
338  _tableauPointsControle->setItem(row, 4, pCheckItemActif);
339 
340  _tableauPointsControle->setRowHeight(row, 30);
341  }
342 }
343 
345 {
346  int nbPoints = static_cast<uint32>(getElement()->getMaillages().size());
347  _tableauMaillages->setRowCount(nbPoints);
348 
349  LPTYMaillage pMaillage = nullptr;
350 
351  for (int row = 0; row < nbPoints; row++)
352  {
353  pMaillage = getElement()->getMaillage(row);
354  _tableauMaillages->setItem(row, 0, new QTableWidgetItem(pMaillage->getName()));
355 
356  QTableWidgetItem* pCheckItemActif = new QTableWidgetItem("");
357  if (pMaillage->etat(getElement()->getCurrentCalcul()) == true)
358  {
359  pCheckItemActif->setCheckState(Qt::Checked);
360  }
361  else
362  {
363  pCheckItemActif->setCheckState(Qt::Unchecked);
364  }
365  _tableauMaillages->setItem(row, 1, pCheckItemActif);
366 
367  _tableauMaillages->setRowHeight(row, 30);
368  }
369 }
370 
372 {
373  _elmW->apply();
374 
375  getElement()->setComment(_lineEditComment->toPlainText());
376  getElement()->setAuteur(_lineEditAuteur->text());
377  getElement()->setDateModif(_editDateModif->date().currentDate().toString(Qt::ISODate));
378  getElement()->setDateCreation(_editDateCreation->date().toString(Qt::ISODate));
379 
380  getElement()->setDMax(_lineEditDistMax->text().toDouble());
381  getElement()->setDelaunayTolerence(_lineEditDelaunayTolerence->text().toDouble());
382 
383  getElement()->setIsGeometryModified(true);
384  getElement()->getSite()->setIsGeometryModified(true);
385 
386  // Mise a jour des points de controles
387  TYTabLPPointControl& tabPoints = getElement()->getPointsControl();
388  double x = 0., y = 0., h = 0.;
389  bool need_to_rebuild_result(false), ok(false);
390  for (int row = 0; row < _tableauPointsControle->rowCount(); row++)
391  {
392  // Mise a jur du nom du point
393  tabPoints[row]->setName(_tableauPointsControle->item(row, 0)->text());
394 
395  // Relecture des coordonnées du point
396  x = _tableauPointsControle->item(row, 1)->text().toDouble(&ok);
397  y = _tableauPointsControle->item(row, 2)->text().toDouble(&ok);
398  h = _tableauPointsControle->item(row, 3)->text().toDouble(&ok);
399  tabPoints[row]->setCoords(x, y, 0.);
400  tabPoints[row]->setHauteur(h);
401 
402  // Activation / desactivation du point
403  QTableWidgetItem* pCheck = (QTableWidgetItem*)_tableauPointsControle->item(row, 4);
404  if (pCheck->checkState() == Qt::Checked)
405  {
406  tabPoints[row]->setEtat(getElement()->getCurrentCalcul()->getID(), true);
407  need_to_rebuild_result |= getElement()->getCurrentCalcul()->addPtCtrlToResult(tabPoints[row]);
408  }
409  else
410  {
411  tabPoints[row]->setEtat(getElement()->getCurrentCalcul()->getID(), false);
412  need_to_rebuild_result |= getElement()->getCurrentCalcul()->remPtCtrlFromResult(tabPoints[row]);
413  }
414  }
415 
416  if (need_to_rebuild_result)
417  {
418  getElement()->getCurrentCalcul()->getResultat()->buildMatrix();
419  }
420 
421  // Mise à jour des noise maps
422  for (int row = 0; row < _tableauMaillages->rowCount(); row++)
423  {
424  // Select or deselect
425  QTableWidgetItem* pCheck = (QTableWidgetItem*)_tableauMaillages->item(row, 1);
426  if (pCheck->checkState() == Qt::Checked)
427  {
428  getElement()->getCurrentCalcul()->addMaillage(getElement()->getMaillage(row));
429  }
430  else
431  {
432  getElement()->getCurrentCalcul()->remMaillage(getElement()->getMaillage(row));
433  }
434 
435  // Rename
436  getElement()->getMaillage(row)->setName(_tableauMaillages->item(row, 0)->text());
437  }
438 
439  // --- Appliquer la forme de spectre au projet ---
440  if (_radioSpectreOctave->isChecked())
441  {
442  getElement()->setSpectreForm(SPECTRE_FORM_OCT);
443  }
444  else
445  {
446  // défaut: tiers
447  getElement()->setSpectreForm(SPECTRE_FORM_TIERS);
448  }
449  emit modified();
450 }
451 
453 {
454  int ret = getElement()->getCurrentCalcul()->edit(this);
455 
456  if (ret == QDialog::Accepted)
457  {
458  _lineEditNomCurCalcul->setText(getElement()->getCurrentCalcul()->getName());
459  }
460 }
461 
463 {
464  int ret = getElement()->getSite()->edit(this);
465 
466  if (ret == QDialog::Accepted)
467  {
468  _lineEditNomSite->setText(getElement()->getSite()->getName());
469  }
470 }
471 
472 void TYProjetWidget::editCalcul(QTreeWidgetItem* item)
473 {
474  int ret = getElement()->getListCalcul()[item->text(0).toInt()]->edit(this);
475 
476  if (ret == QDialog::Accepted)
477  {
478  _listViewTabCalcul->clear();
479  for (unsigned int i = 0; i < getElement()->getListCalcul().size(); i++)
480  {
481  QTreeWidgetItem* item = new QTreeWidgetItem(_listViewTabCalcul, 0);
482  item->setText(0, QString().setNum(i));
483  item->setText(1, getElement()->getListCalcul().at(i)->getName());
484  }
485  }
486 }
487 
489 {
490  _lineEditDistMax->setText(QString().setNum(getElement()->getDefaultDMax()));
491  _lineEditDelaunayTolerence->setText(QString().setNum(getElement()->getDefaultDelaunayTolerence()));
492 }
493 
494 void TYProjetWidget::contextMenuEvent(QContextMenuEvent* e)
495 {
496  // si on trouve un item associe
497  QPoint point = _listViewTabCalcul->mapFrom(this, e->pos());
498  QTreeWidgetItem* item =
499  _listViewTabCalcul->itemAt(point.x(), point.y() - _listViewTabCalcul->header()->height());
500 
501  if (item != NULL)
502  {
503  QMenu* pMenu = new QMenu(this);
504 
505  QAction* prop = pMenu->addAction(TR("id_property"));
506  QAction* ret = pMenu->exec(_listViewTabCalcul->mapToGlobal(point));
507 
508  if (ret == prop)
509  {
510  editCalcul(item);
511  }
512  }
513 }
outil IHM pour un element (fichier header)
outil IHM pour une entrée utilisateur (fichier header)
std::vector< LPTYPointControl > TYTabLPPointControl
Collection de Smart Pointer sur TYPointControl.
#define TR(id)
outil IHM pour un projet (fichier header)
classe de l'objet IHM pour un element
virtual void apply()
virtual void updateContent()
TYLineEdit * _lineEditDelaunayTolerence
QLabel * _labelDelaunayTolerence
QGroupBox * _groupBoxCurCalcul
virtual void contextMenuEvent(QContextMenuEvent *e)
QLineEdit * _lineEditAuteur
virtual void apply()
QTreeWidget * _listViewTabCalcul
QGroupBox * _groupBox
QRadioButton * _radioSpectreTiers
QLineEdit * _lineEditNomSite
QLabel * _labelAuteur
QLabel * _labelDistMax
QTabWidget * _tabWidget
QTableWidget * _tableauPointsControle
TYElementWidget * _elmW
QLabel * _labelUseDefault
QGroupBox * _groupBoxAcoustique
QGroupBox * _groupBoxAcoustiqueForm
QLabel * _labelDateModif
QDateEdit * _editDateCreation
QTextEdit * _lineEditComment
QGroupBox * _groupBoxSite
QLabel * _labelComment
QDateEdit * _editDateModif
QPushButton * _pushButtonSite
QGroupBox * _groupBoxTab
QGridLayout * _projetLayout
QTableWidget * _tableauMaillages
Onglet des points de controle.
QPushButton * _pushButtonUseDefault
void editCalcul(QTreeWidgetItem *item)
QPushButton * _pushButtonCurCalcul
QLineEdit * _lineEditNomCurCalcul
void updateControlPointsTab()
virtual ~TYProjetWidget()
virtual void updateContent()
TYProjetWidget(TYProjet *pElement, QWidget *_pParent=NULL)
QLabel * _labelDateCreation
TYLineEdit * _lineEditDistMax
QRadioButton * _radioSpectreOctave
classe de definition d'un projet.
Definition: TYProjet.h:45
classe de l'objet IHM pour un objet metier de type TYElement
Definition: TYWidget.h:43
void modified()
unsigned int uint32
Definition: defines.h:75
@ SPECTRE_FORM_TIERS
Definition: spectre.h:37
@ SPECTRE_FORM_OCT
Definition: spectre.h:38