Code_TYMPAN  4.4.0
Industrial site acoustic simulation
TYSpectreWidget.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 
23 #include <qtablewidget.h>
24 #include <qtabwidget.h>
25 #include <qpainter.h>
26 #include <QtPrintSupport/QPrinter>
27 #include <QtPrintSupport/QPrintDialog>
28 #include <qfile.h>
29 #include <qtextstream.h>
30 #include <qfiledialog.h>
31 #include <qradiobutton.h>
32 #include <qpixmap.h>
33 #include <qbuttongroup.h>
34 #include <qmessagebox.h>
35 #include <qheaderview.h>
36 #include <QtWidgets>
37 
38 #include "TYSpectreWidget.h"
42 #include "TYHistoWidget.h"
43 #include "TYCourbeWidget.h"
44 #include "TYElementWidget.h"
45 
46 // Added by qt3to4:
47 #include <QHBoxLayout>
48 #include <QLabel>
49 #include <QGridLayout>
50 #include <QFrame>
51 #include <QBoxLayout>
52 
53 // using namespace Qt;
54 
55 #define TR(id) OLocalizator::getString("TYSpectreWidget", (id))
56 
57 // --------------------------------------
58 // Fournisseur global de forme de spectre
59 // --------------------------------------
61 
63 {
64  s_formProvider = p;
65 }
67 {
68  return s_formProvider;
69 }
70 
71 TYSpectreWidget::TYSpectreWidget(TYSpectre* pElement, QWidget* _pParent /*=NULL*/)
72  : TYWidget(pElement, _pParent)
73 {
74  // Par defaut precision prend la valeur affectee a la classe TYSpectre pour le stockage en XML
76 
77  // On utilise une copie du spectre associe a ce widget
78 
79  // Et on conserve ce spectre par ailleurs
80  _pTmpSpectre = pElement;
81 
83 
84  _etatSpectre = "tiersOctave";
85  _pondSpectre = "dB(Z)";
86 
87  resize(450, 700);
88  setWindowTitle(TR("id_caption"));
89 
90  _elmW = new TYElementWidget(getElement(), this);
91 
92  _spectreLayout = new QGridLayout();
93 
94  _spectreLayout->addWidget(_elmW, 0, 0);
95 
96  _groupBox = new QGroupBox(this);
97  _groupBox->setTitle(TR(""));
98  _groupBoxLayout = new QGridLayout();
99  _groupBoxLayout->setAlignment(Qt::AlignTop);
100  _groupBox->setLayout(_groupBoxLayout);
101 
102  _formButtonGroup = new QButtonGroup();
103  _formButtonGroup->setExclusive(true);
104  _pondButtonGroup = new QButtonGroup();
105  _pondButtonGroup->setExclusive(true);
106 
107  _radioButtonTiers = new QRadioButton();
108  _radioButtonTiers->setText(TR("id_radiobutton_tiers"));
109  _radioButtonTiers->setChecked(true);
111 
112  _radioButtonOctave = new QRadioButton();
113  _radioButtonOctave->setText(TR("id_radiobutton_octave"));
115 
116  _radioButtonPondZ = new QRadioButton();
117  _radioButtonPondZ->setText(TR("id_radiobutton_pond_z"));
118  _radioButtonPondZ->setChecked(true);
120 
121  _radioButtonPondA = new QRadioButton();
122  _radioButtonPondA->setText(TR("id_radiobutton_pond_a"));
124 
125  QGridLayout* groupBoxRadioLayout = new QGridLayout();
126  groupBoxRadioLayout->addWidget(_radioButtonTiers, 0, 0);
127  groupBoxRadioLayout->addWidget(_radioButtonOctave, 0, 1);
128  groupBoxRadioLayout->addWidget(_radioButtonPondZ, 1, 0);
129  groupBoxRadioLayout->addWidget(_radioButtonPondA, 1, 1);
130 
131  QGroupBox* groupBoxRadio = new QGroupBox();
132  groupBoxRadio->setTitle("");
133  groupBoxRadio->setLayout(groupBoxRadioLayout);
134 
135  _groupBoxLayout->addWidget(groupBoxRadio, 0, 0, 1, 2);
136 
137  _lineEditRq = new QLineEdit(_groupBox);
138  _lineEditRq->setText(getElement()->getRemarque());
139  _groupBoxLayout->addWidget(_lineEditRq, 2, 1);
140 
141  _labeRq = new QLabel(_groupBox);
142  _labeRq->setText(TR("id_rq_label"));
143  _groupBoxLayout->addWidget(_labeRq, 2, 0);
144 
145  _comboBoxType = new QComboBox(_groupBox);
146  _comboBoxType->insertItem(0, TR("id_spectre_type_att"));
147  _comboBoxType->insertItem(1, TR("id_spectre_type_abso"));
148  _comboBoxType->insertItem(2, TR("id_spectre_type_lw"));
149  _comboBoxType->insertItem(3, TR("id_spectre_type_lp"));
150  _comboBoxType->insertItem(4, TR("id_spectre_type_autre"));
151  _comboBoxType->setCurrentIndex(getElement()->getType());
152  _groupBoxLayout->addWidget(_comboBoxType, 1, 1);
153 
154  _labelType = new QLabel(_groupBox);
155  _labelType->setText(TR("id_type_label"));
156  _groupBoxLayout->addWidget(_labelType, 1, 0);
157 
158  _spectreLayout->addWidget(_groupBox, 1, 0);
159 
160  // Tableau
161  _tableau = new QTableWidget();
162  QStringList stringList;
163  stringList.append(TR("id_freq"));
164  stringList.append("");
165  _tableau->setHorizontalHeaderLabels(stringList);
166  _tableau->setColumnCount(2);
167  _nbFreq = pElement->getNbValues();
168 
169  // histo
170  _histoWidget = new TYHistoWidget(this, false);
171  // courbe
172  _courbeWidget = new TYCourbeWidget(this, false);
173 
174  _tabWidget = new QTabWidget(this);
175  _tabWidget->insertTab(0, _tableau, TR("id_tableau"));
176  _tabWidget->insertTab(1, _histoWidget, TR("id_histogramme"));
177  _tabWidget->insertTab(2, _courbeWidget, TR("id_courbe"));
178 
179  _spectreLayout->addWidget(_tabWidget, 2, 0);
180 
181  QGroupBox* buttonGroupBox = new QGroupBox(this);
182  buttonGroupBox->setTitle(TR(""));
183  QGridLayout* buttonGroupBoxLayout = new QGridLayout();
184  buttonGroupBox->setLayout(buttonGroupBoxLayout);
185  buttonGroupBoxLayout->setAlignment(Qt::AlignTop);
186 
187  _pushButtonImport = new QPushButton(buttonGroupBox);
188  _pushButtonImport->setText(TR("id_import_csv"));
189  buttonGroupBoxLayout->addWidget(_pushButtonImport, 0, 0);
190 
191  _pushButtonExport = new QPushButton(buttonGroupBox);
192  _pushButtonExport->setText(TR("id_export_csv"));
193  buttonGroupBoxLayout->addWidget(_pushButtonExport, 0, 1);
194 
195  _spectreLayout->addWidget(buttonGroupBox, 3, 0);
196 
197  update();
198 
199  _printer = new QPrinter();
200 
201  connect(_radioButtonTiers, &QRadioButton::clicked, this, &TYSpectreWidget::changeOctave);
202  connect(_radioButtonOctave, &QRadioButton::clicked, this, &TYSpectreWidget::changeOctave);
203  connect(_radioButtonPondZ, &QRadioButton::clicked, this, &TYSpectreWidget::changePonderation);
204  connect(_radioButtonPondA, &QRadioButton::clicked, this, &TYSpectreWidget::changePonderation);
205  connect(_pushButtonExport, &QPushButton::clicked, this, &TYSpectreWidget::exportCsv);
206  connect(_pushButtonImport, &QPushButton::clicked, this, &TYSpectreWidget::importCsv);
207  connect(_tableau, &QTableWidget::cellChanged, this, &TYSpectreWidget::tabValueChanged);
208 
209  setLayout(_spectreLayout);
210  updateContent();
211 
212  // Initialisation octave/tiers via provider app (si défini)
214 }
215 
217 {
218  delete _printer;
219 }
220 
222 {
223  _elmW->updateContent();
224 
225  _lineEditRq->setText(_pTmpSpectre->getRemarque());
226  _comboBoxType->setCurrentIndex(_pTmpSpectre->getType());
227 
228  _comboBoxType->setEnabled(false);
229 
230  // Affichage de l'unite
231  QString unite = "dB";
234  {
235  unite = "";
236  _radioButtonPondZ->setEnabled(false);
237  _radioButtonPondA->setEnabled(false);
238  _radioButtonPondZ->setChecked(true);
239  _radioButtonPondA->setChecked(false);
240  }
241  else if (_pondSpectre == "dB(A)")
242  {
243  unite = "dBA";
244  }
245 
247 
248  QStringList stringList;
249  stringList.append(TR("id_freq"));
250  stringList.append(unite);
251  _tableau->setHorizontalHeaderLabels(stringList);
252 
253  // Mise a jour du tableau
255 
256  // Inactivation de la colonne des frequences (toujours !)
257  for (int i = 0; i < _tableau->rowCount(); i++)
258  {
259  _tableau->item(i, 0)->setFlags(QFlag(0));
260  }
261 
262  // Spectre en read only si le mode de calcul est "Calcule"
264  {
265  setContentEnabled(false);
266  }
267 }
268 
270 {
271  _elmW->apply();
272 
273  getElement()->setRemarque(_lineEditRq->text());
274  getElement()->setType((TYSpectreType)_comboBoxType->currentIndex());
275 
276  // On repasse le spectre en Tiers d'octave si necessaire
277  if (!_radioButtonTiers->isChecked())
278  {
279  _radioButtonTiers->setChecked(true);
280  changeOctave();
281  }
282 
283  // Mis a jour du spectre a partir du tableau
285 
286  emit modified();
287 }
288 
289 void TYSpectreWidget::tabValueChanged(int row, int col)
290 {
291  if (col == 1 && _tableau->item(row, col) != nullptr)
292  {
293  // Translate input value to double to see if it's a correct number
294  bool ok = false;
295  QString txt = _tableau->item(row, col)->text();
296  int index = txt.indexOf(',');
297  if (index > 0)
298  {
299  txt.replace(index, 1, '.');
300  _tableau->item(row, col)->setText(txt);
301  }
302  _tableau->item(row, col)->text().toDouble(&ok);
303 
304  // If value is not a valid number, get the original value in the spectrum and return
305  if (!ok)
306  {
307  _tableau->item(row, 1)->setText(
308  QString().setNum(_pTmpSpectre->getTabValReel()[row], 'f', _precision));
309  return;
310  }
311 
312  // Else, we copy value to all the selected cells
313  for (int i = 0; i < _nbFreq; i++)
314  {
315  if ((_tableau->item(i, col)) && ((_tableau->item(i, col))->isSelected()))
316  {
317  _tableau->item(i, col)->setText(_tableau->item(row, col)->text());
318  }
319  }
320 
321  _isModified = true;
322  }
323 }
324 
326 {
327  for (int i = 0; i < _nbFreq; i++)
328  {
329  if (state)
330  {
331  _tableau->item(i, 1)->setFlags(Qt::ItemIsEditable);
332  }
333  else
334  {
335  _tableau->item(i, 1)->setFlags(QFlag(0));
336  }
337  }
338 
339  _pushButtonImport->setEnabled(state);
340 }
341 
343 {
344  std::vector<QString> tmp;
345 
346  QString qFileName = QFileDialog::getOpenFileName(this, "Choose a file", "", "CSV (*.csv)");
347 
348  if (!qFileName.isEmpty())
349  {
350  // On charge les donnees
351  if (!qFileName.endsWith("csv"))
352  {
353  qFileName += ".csv";
354  }
355 
356  std::ifstream file(qFileName.toStdString());
357 
358  if (!file.is_open())
359  {
360  std::cerr << "Failed to open file: " << qFileName.toStdString() << std::endl;
361  return;
362  }
363  std::string line;
364  int i = 0;
365  while (std::getline(file, line))
366  {
367  switch (i)
368  {
369  case 0:
370  break;
371  case 1: // On saute la ligne des labels
372  break;
373  default:
374  tmp.push_back(QString::fromStdString(line));
375  break;
376  }
377 
378  i++;
379  }
380 
381  bool bOctave = true;
382 
383  // récupère la liste des fréquence en fonction du type de spectre
384  std::vector<double> freqListeOctave;
385  std::vector<double> freqListeTiersOctave;
388 
389  // On teste si la forme du spectre est en Octave
390  for (int i = 0; i < tmp.size(); i++)
391  {
392  for (int j = 0; j < freqListeOctave.size(); j++)
393  {
394  if (tmp[i].section(";", 0, 0).toDouble() == freqListeOctave[j])
395  break;
396  else if (j == freqListeOctave.size() - 1)
397  {
398  bOctave = false;
399  }
400  }
401  }
402 
403  // Si la forme n'est pas en octave alors on vérifie que les fréquences correspondent bien à une forme
404  // tiers d'octave
405  if (!bOctave)
406  {
407  for (int i = 0; i < tmp.size(); i++)
408  {
409  for (int j = 0; j < freqListeTiersOctave.size(); j++)
410  {
411  if (tmp[i].section(";", 0, 0).toDouble() == freqListeTiersOctave[j])
412  break;
413  // Si une fréquence est invalide pour la forme tiers d'octave alors on sort sans importer
414  // le spectre
415  else if (j == freqListeTiersOctave.size() - 1)
416  {
417  QMessageBox::warning(this, "Tympan", TR("id_warning_freq_invalid"), QMessageBox::Yes);
418  return;
419  }
420  }
421  }
422  }
423 
424  if (bOctave) // si spectre en octave
425  {
426  // On modifie le checkBox indiquant l'etat octave-1/3 d'octave ce qui convertit le spectre en
427  // octave
428  _radioButtonOctave->setChecked(true);
429  _etatSpectre = "octave";
430  }
431  else // Spectre en (1/3)
432  {
433  // On modifie le checkBox indiquant l'etat octave-1/3 d'octave ce qui convertit le spectre en
434  // tiers d'octave
435  _radioButtonTiers->setChecked(true);
436  _etatSpectre = "tiersOctave";
437  }
438 
439  if ((bOctave && (tmp.size() < 9)) ||
440  (!bOctave && (tmp.size() < 31))) // nb valeurs incorrect (9 en 1/1, 31 en 1/3)
441  {
442  int ret = QMessageBox::warning(this, "Tympan", TR("id_warning_file_not_ok"), QMessageBox::Yes,
443  QMessageBox::No);
444  if (ret == QMessageBox::No)
445  {
446  return;
447  }
448  }
449 
450  std::vector<double> freqListe = freqListeTiersOctave;
451  if (bOctave)
452  freqListe = freqListeOctave;
453 
454  // Réinitialisation du tableau
455  resetTab();
456 
457  // On remplit le tableau avec les valeurs
458  _tableau->setRowCount(static_cast<int>(freqListe.size()));
459  for (int i = 0; i < freqListe.size(); i++)
460  {
461  // On écrit 1 ligne par fréquence qui sera dans le spectre final
462  _tableau->setItem(i, 0, new QTableWidgetItem(QString::number(freqListe[i])));
463 
464  for (int j = 0; j < tmp.size(); j++)
465  {
466  double test1 = freqListe[i];
467  double test2 = tmp[j].section(";", 0, 0).toDouble();
468  // On regarde chaque fréquence importée jusqu'à avoir trouvé celle correspondant à la ligne en
469  // cours. Puis on ajoute le niveau correspondant
470  if (tmp[j].section(";", 0, 0).toDouble() == freqListe[i])
471  {
472  _tableau->setItem(i, 1, new QTableWidgetItem(tmp[j].section(";", 1, 1)));
473  break;
474  }
475  else if (j == tmp.size() - 1)
476  {
477  // Si la fréquence n'est pas présente dans le fichier importé, on utilise la valeur par
478  // défaut
479  int defVal = TY_SPECTRE_DEFAULT_VALUE;
480  if (bOctave)
481  defVal = TY_SPECTRE_OCT_DEFAULT_VALUE;
482 
483  _tableau->setItem(i, 1, new QTableWidgetItem(QString::number(defVal)));
484  }
485  }
486  }
487  }
488 }
489 
491 {
492  QString qFileName = QFileDialog::getSaveFileName(this, "Choose a file", "", "CSV (*.csv)");
493 
494  if (!qFileName.isEmpty())
495  {
496  if (!qFileName.endsWith(".csv"))
497  {
498  qFileName += ".csv";
499  }
500 
501  QFile f(qFileName);
502 
503  if (f.open(QIODevice::WriteOnly))
504  {
505  QTextStream s(&f);
506 
507  // Ajout du type de spectre 1/1 ou 1/3
508  int type = _radioButtonOctave->isChecked() ? 1 : 3;
509  s << type << '\n';
510 
511  // Ajout entete de colonne
512  s << TR("id_freq") << ";";
513  if (_pondSpectre == "dB(A)")
514  {
515 
516  s << "dB(A)\n";
517  }
518  else
519  {
520  s << "dB(Z)\n";
521  }
522 
523  // Ecriture contenu du spectre
524  int nbFreq = _tableau->rowCount();
525  for (int i = 0; i < nbFreq; i++)
526  {
527  s << _tableau->item(i, 0)->text() << ";" << _tableau->item(i, 1)->text() << "\n";
528  }
529 
530  f.close();
531  }
532  }
533 }
534 
535 static void processEvents();
536 
537 void processEvents()
538 {
539  qApp->processEvents();
540 }
541 
543 {
544  LPTYSpectre pSpectre = new TYSpectre();
545  pSpectre->setType(_pTmpSpectre->getType()); // Recopie du type du spectre edite
546  bool isChanged = false;
547 
548  // Effectue la conversion
549  if (_radioButtonTiers->isChecked() && _etatSpectre != "tiersOctave") // Passage de 1/1 en 1/3
550  {
551  pSpectre->setForm(SPECTRE_FORM_OCT);
552 
553  // Creation des valeurs du spectre depuis le tableau
554  tableauToSpectre(pSpectre.getRealPointer());
555 
556  // Passage du spectre en 1/3
557  *pSpectre = pSpectre->toTOct();
558 
559  _etatSpectre = "tiersOctave";
560  isChanged = true;
561  }
562  else if (_radioButtonOctave->isChecked() && _etatSpectre != "octave") // Passage de 1/3 en 1/1
563  {
564  int ret = QMessageBox::warning(this, "Tympan", TR("id_warning_converting_TO_to_Oct"),
565  QMessageBox::Yes, QMessageBox::No);
566  if (ret == QMessageBox::No)
567  {
568  _radioButtonTiers->setChecked(true);
569  return;
570  }
571 
572  pSpectre->setForm(SPECTRE_FORM_TIERS);
573 
574  // Creation des valeurs du spectre depuis le tableau
575  tableauToSpectre(pSpectre.getRealPointer());
576 
577  // Passage du spectre en 1/1
578  *pSpectre = pSpectre->toOct();
579 
580  _etatSpectre = "octave";
581  isChanged = true;
582  }
583 
584  // Remplissage du tableau
585  if (isChanged)
586  {
587  spectreToTableau(pSpectre);
588  _histoWidget->update();
589  _courbeWidget->update();
590  }
591 
592  _nbFreq = pSpectre->getNbValues();
593  // Grise la colonne des frequences
594  for (int i = 0; i < _tableau->rowCount(); i++)
595  {
596  _tableau->item(i, 0)->setFlags(QFlag(0));
597  }
598 
600  {
601  // Grise la colonne des dB
602  setContentEnabled(false);
603  }
604 }
605 
607 {
608  LPTYSpectre pSpectre = new TYSpectre();
609  pSpectre->setType(_pTmpSpectre->getType()); // Recopie du type du spectre edite
610  if (_etatSpectre == "octave")
611  {
612  pSpectre->setForm(SPECTRE_FORM_OCT);
613  }
614  bool isChanged = false;
615 
616  // Effectue la conversion
617  if (_radioButtonPondZ->isChecked() && _pondSpectre != "dB(Z)") // Passage de dB(A) à dB(Z)
618  {
619  // Creation des valeurs du spectre depuis le tableau
620  tableauToSpectre(pSpectre.getRealPointer());
621 
622  _pondSpectre = "dB(Z)";
623  isChanged = true;
624  }
625  else if (_radioButtonPondA->isChecked() && _pondSpectre != "dB(A)") // Passage de dB(Z) à dB(A)
626  {
627  // Creation des valeurs du spectre depuis le tableau
628  tableauToSpectre(pSpectre.getRealPointer());
629 
630  _pondSpectre = "dB(A)";
631  isChanged = true;
632  }
633 
634  // code ci-dessous à factoriser
635  // Remplissage du tableau
636  if (isChanged)
637  {
638  spectreToTableau(pSpectre);
639  _histoWidget->update();
640  _courbeWidget->update();
641  }
642 
643  _nbFreq = pSpectre->getNbValues();
644  // Grise la colonne des frequences
645  for (int i = 0; i < _tableau->rowCount(); i++)
646  {
647  _tableau->item(i, 0)->setFlags(QFlag(0));
648  }
649 
651  {
652  // Grise la colonne des dB
653  setContentEnabled(false);
654  }
655 }
656 
658 {
659  if (_comboBoxType->currentIndex() == 1)
660  {
661  _histoWidget->setDbType(true);
662  _courbeWidget->setDbType(true);
663  }
664  else
665  {
666  _histoWidget->setDbType(false);
667  _courbeWidget->setDbType(false);
668  }
669 }
670 
672 {
673  // Reset tab
674  for (int i = 0; i < _tableau->rowCount(); i++)
675  {
676  _tableau->takeItem(i, 0);
677  _tableau->takeItem(i, 1);
678  }
679 
680  _tableau->setRowCount(0);
681 }
682 
684 {
685  assert(pSpectre);
686 
687  // Initialisation du tableau
688  resetTab();
689 
690  // Recuperation du tableau des frequences (octave ou 1/3 d'octaves)
692  if (_pondSpectre == "dB(A)")
693  {
694  // Créer operateur + et - sur TYSpectre
695  TYSpectre pondASpectre{};
696  if (pSpectre->getForm() == SPECTRE_FORM_TIERS)
697  {
698  pondASpectre = TYSpectre{*pSpectre->downcast_ospectre() + OSpectre::pondA()};
699  }
700  else if (pSpectre->getForm() == SPECTRE_FORM_OCT)
701  {
702  pondASpectre = TYSpectre{*pSpectre->downcast_ospectre() + OSpectreOctave::pondA()};
703  }
704  pondASpectre.setForm(pSpectre->getForm());
705  pondASpectre.setType(pSpectre->getType());
706  pSpectre = &pondASpectre;
707  }
708 
709  int nbFreq = pSpectre->getNbValues();
710 
711  _tableau->setColumnCount(2);
712  _tableau->setRowCount(nbFreq);
713  for (int i = 0; i < nbFreq; i++)
714  {
715  _tableau->setItem(i, 0, new QTableWidgetItem((QString().setNum(tabFreq[i], 'f', 2))));
716  _tableau->setItem(
717  i, 1, new QTableWidgetItem((QString().setNum(pSpectre->getTabValReel()[i], 'f', _precision))));
718  }
719 }
720 
722 {
723  assert(pSpectre);
724 
725  bool ok = false;
726  double val = -200.0;
727  int indexDepart = 0;
728 
729  int nbFreq = _tableau->rowCount();
730 
731  // Pour toutes les frequences
732  for (int i = indexDepart; i < nbFreq; i++)
733  {
734  val = _tableau->item(i, 1)->text().toDouble(
735  &ok); // Suppose que la valeur a freq donnee stockee en colonne 1
736  if (ok)
737  {
738  pSpectre->getTabValReel()[i] = val;
739  }
740  }
741  if (_pondSpectre == "dB(A)")
742  {
743  // Créer operateur + et - sur TYSpectre
744  TYSpectre pondZSpectre{};
745  if (pSpectre->getForm() == SPECTRE_FORM_TIERS)
746  {
747  pondZSpectre = TYSpectre{*pSpectre->downcast_ospectre() - OSpectre::pondA()};
748  }
749  else if (pSpectre->getForm() == SPECTRE_FORM_OCT)
750  {
751  pondZSpectre = TYSpectre{*pSpectre->downcast_ospectre() - OSpectreOctave::pondA()};
752  }
753  pondZSpectre.setForm(pSpectre->getForm());
754  pondZSpectre.setType(pSpectre->getType());
755  *pSpectre = pondZSpectre;
756  }
757 }
758 
760 {
761  assert(pSpectre);
762 
763  if (_radioButtonOctave->isChecked())
764  {
765  *pSpectre = pSpectre->toOct();
766  }
767 
768  tableauToSpectre(pSpectre);
769 }
770 
771 // ----------------------------------------------------------
772 // Applique la forme initiale en utilisant le provider global
773 // ----------------------------------------------------------
775 {
776  if (!s_formProvider)
777  return;
778 
779  const TYSpectreForm form = s_formProvider();
780 
781  switch (form)
782  {
783  case SPECTRE_FORM_OCT:
784  if (!_radioButtonOctave->isChecked())
785  {
786  _radioButtonOctave->setChecked(true);
787  changeOctave();
788  }
789  break;
790  case SPECTRE_FORM_TIERS:
791  default:
792  // Par défaut, on reste en 1/3 d’octave (déjà coché)
793  break;
794  }
795 }
NxReal s
Definition: NxVec3.cpp:317
outil IHM pour une courbe (fichier header)
outil IHM pour un element (fichier header)
outil IHM pour un histogramme (fichier header)
Boite de dialogue des parametres d'impression (fichier header)
const std::vector< double > tabFreq
#define TR(id)
outil IHM pour un spectre (fichier header)
OTabFreq TYTabFreq
Collection des frequences.
Definition: TYSpectre.h:27
void setForm(TYSpectreForm form)
Force the spectrum state (to use carefully ...)
Definition: spectre.h:181
unsigned int getNbValues() const
Number of values in the spectrum.
Definition: spectre.cpp:187
void setType(TYSpectreType type)
Set the spectrum type.
Definition: spectre.h:153
TYSpectreType getType() const
Get the spectrum type.
Definition: spectre.h:148
OSpectreAbstract & toTOct() const
Converts to one-third Octave.
Definition: spectre.cpp:708
OSpectreAbstract & toOct() const
Converts to Octave.
Definition: spectre.cpp:782
static OSpectreOctave pondA()
Build a weighted spectrum A.
Definition: spectre.cpp:1600
double * getTabValReel() override
Definition: spectre.h:357
static OSpectre pondA()
Build a weighted spectrum A.
Definition: spectre.cpp:1013
T * getRealPointer()
Definition: smartptr.h:291
classe de l'objet IHM pour une courbe
void setDbType(bool dbType)
classe de l'objet IHM pour un element
virtual void apply()
virtual void updateContent()
TYElement * getParent() const
Definition: TYElement.h:697
classe de l'outil IHM pour un histogramme
Definition: TYHistoWidget.h:39
void setDbType(bool dbType)
Definition: TYHistoWidget.h:57
virtual void apply()
QLineEdit * _lineEditRq
QGridLayout * _groupBoxLayout
virtual ~TYSpectreWidget()
QPrinter * _printer
void spectre(TYSpectre *pSpectre)
Construit un spectre a partir du contenu du widget.
int _precision
Precision d'affichage des spectres.
void resetTab()
Initialisation du tableau.
void tabValueChanged(int row, int col)
TYCourbeWidget * _courbeWidget
QRadioButton * _radioButtonOctave
QGroupBox * _groupBox
void tableauToSpectre(TYSpectre *pSpectre)
Mise a jour d'un spectre depuis le tableau.
QRadioButton * _radioButtonPondA
TYElementWidget * _elmW
static TYSpectreFormProvider s_formProvider
QRadioButton * _radioButtonPondZ
void setContentEnabled(bool state)
QGridLayout * _spectreLayout
TYHistoWidget * _histoWidget
void spectreToTableau(TYSpectre *pSpectre)
Mise a jour du tableau depuis un spectre.
QPushButton * _pushButtonImport
void applyInitialFormFromProvider()
Applique la forme initiale de spectre fournie par le provider.
static void setSpectreFormProvider(TYSpectreFormProvider p)
virtual void updateContent()
QPushButton * _pushButtonExport
TYSpectreForm(*)() TYSpectreFormProvider
TYSpectreWidget(TYSpectre *pElement, QWidget *_pParent=NULL)
QButtonGroup * _formButtonGroup
QComboBox * _comboBoxType
static TYSpectreFormProvider spectreFormProvider()
QButtonGroup * _pondButtonGroup
TYSpectre * _pTmpSpectre
QRadioButton * _radioButtonTiers
QTabWidget * _tabWidget
QTableWidget * _tableau
virtual void setForm(const TYSpectreForm &form)
Definition: TYSpectre.h:111
static int getXMLPrecision()
Get/Set de la precision de stockage des resultats (XML)
Definition: TYSpectre.h:180
virtual TYSpectreForm getForm()
Set/Get de la forme du spectre.
Definition: TYSpectre.h:107
virtual bool getIsReadOnly()
Set/Get du flag de conservation en BDD.
Definition: TYSpectre.h:135
virtual QString getRemarque() const
Set/Get des remarques.
Definition: TYSpectre.h:117
OSpectre * downcast_ospectre()
: return spectrum casted as OSpectre
Definition: TYSpectre.h:202
static const TYTabFreq getTabFreqNorm(TYSpectreForm form=SPECTRE_FORM_TIERS)
Definition: TYSpectre.cpp:419
classe de l'objet IHM pour un objet metier de type TYElement
Definition: TYWidget.h:43
void modified()
TYSpectreForm
Spectrum representation.
Definition: spectre.h:36
@ SPECTRE_FORM_TIERS
Definition: spectre.h:37
@ SPECTRE_FORM_OCT
Definition: spectre.h:38
TYSpectreType
Spectrum type.
Definition: spectre.h:27
@ SPECTRE_TYPE_AUTRE
Definition: spectre.h:32
@ SPECTRE_TYPE_ATT
Definition: spectre.h:28
@ SPECTRE_TYPE_ABSO
Definition: spectre.h:29