22 #include <qradiobutton.h>
23 #include <qbuttongroup.h>
24 #include <qtablewidget.h>
25 #include <qcombobox.h>
27 #include <qfiledialog.h>
31 #include <QHBoxLayout>
33 #include <QGridLayout>
36 #include <QHeaderView>
39 #include <QtPrintSupport/QPrinter>
40 #include <QtPrintSupport/QPrintDialog>
56 using namespace QXlsx;
58 #define TR(id) OLocalizator::getString("TYResultatWidget", (id))
59 #define IMG(id) OLocalizator::getPicture("TYResultatWidget", (id))
62 static int compareRes(
const void* elem1,
const void* elem2);
65 static int compareName(
const void* elem1,
const void* elem2);
78 setWindowTitle(
TR(
"id_caption"));
85 QGroupBox* groupBoxFlag =
new QGroupBox(
this);
86 groupBoxFlag->setTitle(
TR(
""));
87 QGridLayout* groupBoxFlagLayout =
new QGridLayout();
88 groupBoxFlag->setLayout(groupBoxFlagLayout);
91 QButtonGroup* buttonGroupALIN =
new QButtonGroup();
110 QLabel* pLabelContribution =
new QLabel(
this);
111 pLabelContribution->setText(
TR(
"id_label_contribution"));
113 static const char dirName[] =
"UserPreferences";
118 if (TYPreferenceManager::getInstance().exists(dirName,
"TYAcousticSeuilContribBas"))
119 val = QString::number(
120 TYPreferenceManager::getInstance().getDouble(dirName,
"TYAcousticSeuilContribBas"));
123 val = QString::number(3);
124 TYPreferenceManager::getInstance().setDouble(
"TYAcousticSeuilContribBas", 3);
126 QString leqBas =
"Leq - " + QString(val) +
" dB";
132 if (TYPreferenceManager::getInstance().exists(dirName,
"TYAcousticSeuilContribMoy"))
133 val = QString::number(
134 TYPreferenceManager::getInstance().getDouble(dirName,
"TYAcousticSeuilContribMoy"));
137 val = QString::number(1.5);
138 TYPreferenceManager::getInstance().setDouble(
"TYAcousticSeuilContribMoy", 1.5);
140 QString leqMoy =
"Leq - " + QString(val) +
" dB";
146 if (TYPreferenceManager::getInstance().exists(dirName,
"TYAcousticSeuilContribHaut"))
147 val = QString::number(
148 TYPreferenceManager::getInstance().getDouble(dirName,
"TYAcousticSeuilContribHaut"));
151 val = QString::number(0.5);
152 TYPreferenceManager::getInstance().setDouble(
"TYAcousticSeuilContribHaut", 0.5);
154 QString leqHaut =
"Leq - " + QString(val) +
" dB";
199 QGridLayout* groupBoALINLayout =
new QGridLayout();
205 groupBoALINLayout->addWidget(pLabelContribution, 1, 0);
215 QSpacerItem* vspace =
new QSpacerItem(50, 50);
216 groupBoALINLayout->addItem(vspace, 1, 0);
225 QPixmap pixmap(
IMG(
"id_pixmap_niveau"));
226 QLabel* labmap =
new QLabel(
this);
227 labmap->setPixmap(pixmap.scaledToWidth(400));
228 groupBoALINLayout->addWidget(labmap, 4, 0, 1, 4);
236 QGroupBox* groupBoxALIN =
new QGroupBox();
237 groupBoxALIN->setTitle(
TR(
""));
238 groupBoxALIN->setLayout(groupBoALINLayout);
240 groupBoxFlagLayout->addWidget(groupBoxALIN, 0, 0);
243 void (QComboBox::*_qComboBox_activated)(int) = &QComboBox::activated;
244 void (QButtonGroup::*_qButtonGroup_clicked)(int) = &QButtonGroup::idClicked;
263 QLabel* labelSubstCalcul =
new QLabel(
this);
264 labelSubstCalcul->setText(
TR(
"id_subst_calcul"));
268 QGridLayout* groupBoxCalculLayout =
new QGridLayout();
273 groupBoxCalculLayout->addWidget(labelSubstCalcul, 0, 1, Qt::AlignRight);
276 QGroupBox* groupBoxCalcul =
new QGroupBox();
277 groupBoxCalcul->setTitle(
TR(
""));
278 groupBoxCalcul->setLayout(groupBoxCalculLayout);
280 groupBoxFlagLayout->addWidget(groupBoxCalcul, 0, 1);
286 _pTable->setSelectionMode(QAbstractItemView::NoSelection);
287 _pTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
290 QGroupBox* pGroupBox =
new QGroupBox(
this);
291 QHBoxLayout* pGroupBoxLayout =
new QHBoxLayout();
292 pGroupBox->setLayout(pGroupBoxLayout);
306 QPushButton* pButtonPrint =
new QPushButton(
TR(
"id_print"));
307 pGroupBoxLayout->addWidget(pButtonPrint);
312 QHeaderView* entetesRecepteurs =
314 entetesRecepteurs->resizeSections(QHeaderView::ResizeToContents);
346 groupBoALINLayout->setAlignment(Qt::AlignRight);
348 TYPreferenceManager::completePreferences();
381 _nbSources =
static_cast<int>(getElement()->getNbOfSources());
382 _nbRecepteurs =
static_cast<int>(getElement()->getNbOfRecepteurs());
396 for (
unsigned int row = 0; row <
_nbLignes; row++)
398 _pTable->setVerticalHeaderItem(row,
new QTableWidgetItem(QString().setNum(row)));
404 _pTable->setHorizontalHeaderItem(1,
new QTableWidgetItem(QString(
"LW")));
409 if (getElement()->getRecepteur(col) ==
nullptr)
414 QString titre = getElement()->getRecepteur(col)->getName();
415 _pTable->setHorizontalHeaderItem(col + 2,
new QTableWidgetItem(titre));
421 _pTable->setColumnHidden(1, getElement()->isLWHidden());
432 _pTable->setHorizontalHeaderItem(0,
new QTableWidgetItem(QString(
"dBZ")));
435 strVal = QString(
"dB(") + QString(
"%1").arg(
_freq) + QString(
" Hz)");
436 _pTable->setHorizontalHeaderItem(0,
new QTableWidgetItem(strVal));
440 _pTable->setHorizontalHeaderItem(0,
new QTableWidgetItem(QString(
"dBA")));
461 for (
int i = 0; i < listCalcul.size(); i++)
503 QString qFileName = QFileDialog::getSaveFileName(
this,
"Choose a file",
"",
"CSVFile (*.csv)");
505 if (!qFileName.isNull())
507 if (qFileName.right(3) !=
"csv")
525 QString qFileName = QFileDialog::getSaveFileName(
this,
"Choose a file",
"",
"Classeur Excel (*.xlsx)");
527 if (!qFileName.isEmpty())
529 QFileInfo fileInfo(qFileName);
530 if (fileInfo.suffix().toLower() !=
"xlsx")
532 qFileName +=
".xlsx";
535 Document documentQXlsx;
536 documentQXlsx.workbook()->setStringsToNumbersEnabled(
true);
539 documentQXlsx.addSheet(
"Contributions");
540 documentQXlsx.selectSheet(
"Contributions");
544 documentQXlsx.addSheet(
"Contributions cumulées");
545 documentQXlsx.selectSheet(
"Contributions cumulées");
548 documentQXlsx.selectSheet(
"Contributions");
550 if (!documentQXlsx.saveAs(qFileName))
553 QMessageBox::warning(
this, tr(
"Erreur de sauvegarde"),
554 tr(
"Impossible d'enregistrer le fichier Excel.\n"
555 "Il est peut-être déjà ouvert dans une autre "
557 "Veuillez fermer le fichier ou choisir un autre nom pour l'export."));
564 int columnCount =
_pTable->columnCount();
565 int rowCount =
_pTable->rowCount();
571 for (
int row = 1; row < rowCount; ++row)
582 QHeaderView* hh =
_pTable->horizontalHeader();
584 for (
int visualIndex = 0; visualIndex < columnCount; ++visualIndex)
586 QXlsx::Format format;
587 int col = hh->logicalIndex(visualIndex);
588 QTableWidgetItem* item =
_pTable->item(row, col);
592 QString cellText = item->text();
597 if (format.isValid())
598 documentQXlsx.write(xlsxRow, visualIndex + 2, cellText, format);
600 documentQXlsx.write(xlsxRow, visualIndex + 2, cellText);
617 int columnCount =
_pTable->columnCount();
618 int rowCount =
_pTable->rowCount();
622 for (
int row = 1; row < rowCount; ++row)
633 for (
int col = 0; col <= columnCount + 1; ++col)
635 documentQXlsx.autosizeColumnWidth(col + 1);
640 QXlsx::Document& documentQXlsx)
643 QHeaderView* hh =
_pTable->horizontalHeader();
645 for (
int visualIndex = 0; visualIndex < columnCount; ++visualIndex)
647 QXlsx::Format format;
648 int col = hh->logicalIndex(visualIndex);
649 QTableWidgetItem* item =
_pTable->item(row, col);
653 if (col <= 1 || row == 0)
655 cellText = item->text();
665 if (format.isValid())
666 documentQXlsx.write(xlsxRow, visualIndex + 2, cellText, format);
668 documentQXlsx.write(xlsxRow, visualIndex + 2, cellText);
677 _pTable->verticalHeaderItem(row) ?
_pTable->verticalHeaderItem(row)->text() : QString();
679 documentQXlsx.write(xlsxRow, 1, rowHeader);
685 QVariant bgVariant = item->data(Qt::BackgroundRole);
686 if (bgVariant.isValid())
688 QColor bgColor = bgVariant.value<QColor>();
691 if (bgColor.isValid() && bgColor != Qt::white && bgColor.alpha() > 0)
693 format.setPatternBackgroundColor(bgColor);
702 documentQXlsx.write(1, 1,
"");
703 QHeaderView* hh =
_pTable->horizontalHeader();
704 for (
int visualIndex = 0; visualIndex < columnCount; ++visualIndex)
706 int col = hh->logicalIndex(visualIndex);
708 _pTable->horizontalHeaderItem(col) ?
_pTable->horizontalHeaderItem(col)->text() : QString();
709 documentQXlsx.write(2, visualIndex + 2, headerText);
722 QString qFileName = QFileDialog::getSaveFileName(
this,
"Choose a file",
"",
"CSVFile (*.csv)");
724 if (!qFileName.isNull())
726 if (qFileName.right(3) !=
"csv")
740 QPoint point =
_pTable->mapFrom(
this, e->pos());
741 if ((point.x() >= 0) && (point.y() >= 0) && (point.x() <=
_pTable->width()) &&
742 (point.y() <=
_pTable->height()))
747 QTableWidgetItem* item =
_pTable->itemAt(resPoint);
750 int row =
_pTable->indexAt(resPoint).row();
751 row = row >= 0 ? row : 0;
752 int col =
_pTable->indexAt(resPoint).column();
753 col = col >= 0 ? col : 0;
762 spectre = spectre.
toDB();
764 QAction *editSource =
nullptr, *editRecepteur =
nullptr, *editSpectre =
nullptr,
765 *editContrib =
nullptr;
767 QMenu* pPopup =
new QMenu(
this);
768 if ((row == 0) && (col > 1))
772 editRecepteur = pPopup->addAction(
TR(
"id_popup_see_recepteur"));
773 pPopup->addSeparator();
777 editSpectre = pPopup->addAction(
TR(
"id_popup_see_spectre"));
781 if (getElement()->getPartialState())
783 editContrib = pPopup->addAction(
TR(
"id_popup_see_contrib"));
786 else if ((row > 0) && (col > 1))
788 editSpectre = pPopup->addAction(
TR(
"id_popup_see_spectre"));
789 pPopup->addSeparator();
790 editSource = pPopup->addAction(
TR(
"id_popup_see_source"));
791 pPopup->addSeparator();
792 editRecepteur = pPopup->addAction(
TR(
"id_popup_see_recepteur"));
794 else if ((row > 0) && (col == 0))
796 editSource = pPopup->addAction(
TR(
"id_popup_see_source"));
798 else if ((row > 0) && (col == 1))
800 editSource = pPopup->addAction(
TR(
"id_popup_see_source"));
803 QAction* ret = pPopup->exec(
_pTable->mapToGlobal(point));
807 if (ret == editSource)
809 getElement()->getSource(ligne)->edit(
this);
811 else if (ret == editRecepteur)
821 if (pSpectre ==
nullptr)
836 pSpectre->edit(
this);
844 else if (ret == editSpectre)
850 else if (ret == editContrib)
864 if (pDialog->exec() == QDialog::Accepted)
866 QPrintDialog dialog(
_printer,
this);
873 int mid = int(
_printer->width() / 2) -
874 int(paint.fontMetrics().horizontalAdvance(pDialog->
_lineEditTete->text()) / 2);
877 int(paint.fontMetrics().horizontalAdvance(pDialog->
_lineEditPied->text()) / 2);
879 paint.setFont(QFont(
"Helvetica", 15, QFont::Bold));
881 int(paint.fontMetrics().horizontalAdvance(pDialog->
_lineEditTitre->text()) / 2);
883 paint.setFont(QFont());
885 int sizeX = 120, sizeY = 25;
886 int ymax = int(
double(
_printer->height()) * 4 / 5 / (
_pTable->rowCount() + 1));
891 int x = int(
double(
_printer->width() - sizeX * (
_pTable->columnCount())) / 2);
892 int y = int((
double(
_printer->height()) - sizeY * (
_pTable->rowCount() + 3)));
895 for (i = 0; i <
_pTable->horizontalHeader()->count(); i++)
897 paint.drawText(x, y,
_pTable->horizontalHeaderItem(i)->text());
898 paint.translate(sizeX, 0);
901 paint.translate(-
_pTable->columnCount() * sizeX, 0);
902 paint.translate(0, sizeY);
904 for (i = 0; i <
_pTable->rowCount(); i++)
906 for (
int j = 0; j <
_pTable->columnCount(); j++)
910 paint.drawText(x, y,
_pTable->item(i, j)->text());
913 paint.translate(sizeX, 0);
915 paint.translate(0, sizeY);
916 paint.translate(-
_pTable->columnCount() * sizeX, 0);
970 QString titre =
TR(
"id_entete_synthese");
971 _pTable->setItem(0, 0,
new QTableWidgetItem(titre));
973 _pTable->setColumnWidth(0, 140);
975 for (
unsigned int row = 1; row <
_nbLignes; row++)
978 if (pSource ==
nullptr)
983 QString titre = pSource->
getName();
984 _pTable->setItem(row, 0,
new QTableWidgetItem(titre));
985 _pTable->setRowHeight(row, 30);
992 for (
unsigned int col = 1; col <
_nbColonnes; col++)
1002 for (
unsigned int row = 0; row <
_nbLignes; row++)
1007 QTableWidgetItem* pItem =
nullptr;
1009 double valeur = 0.0;
1017 msg = QString(
"%1").arg(valeur, 7,
'f', 1);
1018 pItem =
new QTableWidgetItem(msg);
1020 _pTable->setItem(row, col, pItem);
1021 _pTable->setRowHeight(row, 30);
1027 msg = QString(
"%1").arg(valeur, 7,
'f', 1);
1028 pItem =
new QTableWidgetItem(msg);
1030 _pTable->setItem(row, col, pItem);
1031 _pTable->setRowHeight(row, 30);
1038 msg = QString(
"%1").arg(valeur, 7,
'f', 1);
1039 pItem =
new QTableWidgetItem(msg);
1041 _pTable->setItem(row, col, pItem);
1042 _pTable->setRowHeight(row, 30);
1047 _pTable->setColumnWidth(col, 50);
1056 if ((!pCalcul) || (col == 0))
1076 TYPointCalcul* pPoint = getElement()->getRecepteur(col - 2);
1092 spectre = pResultat->
getSpectre(pRecepteur, pSource);
1093 spectre = spectre.
toDB();
1112 for (
unsigned int i = 0; i < getElement()->getNbOfSources(); i++)
1117 if (getElement() && getElement()->getSource(i))
1123 spectre2 =
getSpectre(row, col, pSubstCalcul);
1170 TYElement* pElement = getElement()->getSource(i);
1180 std::map<TYElement*, LPTYSpectre>& mapElementSpectre = getElement()->getMapElementSpectre();
1181 TYSpectre* puissance = mapElementSpectre[pElement];
1185 spectre = *puissance;
1197 pDlg->
set(getElement(), pPoint);
1226 double seuil = dummy - val;
1227 double dummyEner = pow(10, dummy / 10);
1228 double seuilEner = pow(10, seuil / 10);
1229 return int(100 * seuilEner / dummyEner);
1243 return data.second < a.
data.second;
1250 size_t nbSources = getElement()->getNbOfSources();
1252 std::vector<dataPoint> values = std::vector<dataPoint>(nbSources);
1253 std::vector<int> couleur = std::vector<int>(nbSources);
1260 for (
int row = 1; row <= nbSources; row++)
1266 values[row - 1].data =
1269 values[row - 1].data =
1273 std::sort(values.begin(), values.end());
1274 std::reverse(values.begin(), values.end());
1278 for (
int i = 0; i < nbSources; i++)
1280 double val = values[i].data.second;
1281 val = pow(10, val * 0.1);
1283 double res = 10 * log10(cum);
1284 values[i].data.second = res;
1295 double previousVal = values[0].data.second;
1296 for (
int i = 0; i < nbSources; i++)
1300 double currentVal = values[i].data.second;
1303 values[i].data.second =
RED;
1305 values[i].data.second =
ORANGE;
1307 values[i].data.second =
YELLOW;
1309 values[i].data.second =
WHITE;
1310 previousVal = currentVal;
1313 values[i].data.second =
RED;
1316 std::swap(values[i].data.first, values[i].data.second);
1320 std::sort(values.begin(), values.end());
1322 for (
int i = 0; i < nbSources; i++)
1324 couleur[i] = values[i].data.first;
1331 const int& typeCase)
1333 double val1 = 0.0, val2 = 0.0;
1400 return spectre1.
subst(spectre2);
1419 pItem->setBackground(QBrush(QColor(127, 127, 127)));
1425 pItem->setBackground(QBrush(QColor(255, 255, 255)));
1434 spectre = getElement()->getAmbiant(spectre1, spectre2);
1443 pItem->setBackground(QBrush(QColor(255, 255, 0)));
1448 bool& isColored, std::vector<int> couleurs)
1450 double codeCoul = couleurs[row - 1];
1454 pItem->setBackground(QBrush(QColor(127, 127, 127)));
1460 pItem->setBackground(QBrush(QColor(255, 255, 255)));
1468 pItem->setBackground(QBrush(QColor(255, 0, 0)));
1472 pItem->setBackground(QBrush(QColor(255, 204, 0)));
1476 pItem->setBackground(QBrush(QColor(255, 255, 0)));
1484 for (
unsigned int i = 0; i <
tabFreq.size(); i++)
1487 str.setNum(
tabFreq[i],
'f', 1);
1499 int compareRes(
const void* elem1,
const void* elem2)
1505 int sgn = int(res / fabs(res));
1509 int compareName(
const void* elem1,
const void* elem2)
1523 Qt::CaseSensitivity cs ,
1531 std::vector<Col> cols;
1538 if (
auto* it =
_pTable->horizontalHeaderItem(
c))
1541 txt =
_pTable->model()->headerData(
c, Qt::Horizontal).toString();
1542 cols.push_back({txt,
c});
1546 auto cmp = [&](
const Col& a,
const Col& b)
1549 localeAware ? QString::localeAwareCompare(a.text, b.text) : QString::compare(a.text, b.text, cs);
1550 return (order == Qt::AscendingOrder) ? (r < 0) : (r > 0);
1552 std::stable_sort(cols.begin(), cols.end(), cmp);
1555 QHeaderView* hh =
_pTable->horizontalHeader();
1556 hh->setSectionsMovable(
true);
1557 _pTable->setUpdatesEnabled(
false);
1558 QSignalBlocker blockHeader(hh);
1562 int from = hh->visualIndex(cols[target - 2].logical);
1564 hh->moveSection(from, target);
1567 _pTable->setUpdatesEnabled(
true);
1568 hh->setSectionsMovable(
false);
std::vector< LPTYCalcul > TYTabLPCalcul
Collection de pointeurs de TYCalcul.
outil IHM pour une entrée utilisateur (fichier header)
Boite de dialogue des parametres d'impression (fichier header)
Boite de dialogue pour la representation par une arborescence des elements contribuant au resultat d'...
const std::vector< double > tabFreq
OTabFreq TYTabFreq
Collection des frequences.
static OPrototype * safeDownCast(OPrototype *pObject)
bool isA(const char *className) const
OSpectreAbstract & subst(const OSpectreAbstract &spectre) const
Arithmetic subtraction of two spectrums in one-third Octave.
double valGlobDBA() const
Compute the global value dB[A] of a one-third Octave spectrum.
double valGlobDBLin() const
Compute the global value dB[Lin] of a one-third Octave spectrum.
void setType(TYSpectreType type)
Set the spectrum type.
void setValid(const bool &valid=true)
OSpectreAbstract & toDB() const
Converts to dB.
bool isValid() const
Check the spectrum validity. Invalidity is caused by: corrupted data, impossible calculation.
bool isTonalite() const
Existence d'une tonalite marquee.
double getValueReal(double freq)
static int getIndice(const double &freq)
Return the index associated to a frequency.
int getState()
Get calculation state.
LPTYSpectre getSpectre(const TYUUID &id_pt)
const LPTYResultat getResultat() const
Get result.
TYElement * getParent() const
const TYUUID & getID() const
virtual QString getName() const
Classe de definition d'un point de calcul.C'est une classe derivee a TYPoint avec en plus un spectrep...
classe pour une boite de dialogue des parametres d'impression.
QGroupBox * _groupBoxCalcul
QLineEdit * _lineEditPied
QLineEdit * _lineEditTete
QGroupBox * _groupBoxProjet
QLineEdit * _lineEditTitre
classe de definition d'un projet.
TYTabLPCalcul & getListCalcul()
Set/Get de la liste des Calcul.
Boite de dialogue pour la representation par une arborescence des elements contribuant au resultat d'...
void set(LPTYResultat pResultat, LPTYPointCalcul pPtCalcul)
Classe qui Permet de centraliser les resultats d'un calcul acoustique.
LPTYPointCalcul getRecepteur(const int &indexRecepteur)
Retourne le recepteur corresponadnt a l'indice passe.
void saveValue(const QString &filename, const int &affichage, double freq=100)
Sauvegarde des valeurs dans un fichier affichage : false -> dBA et true -> dBLin.
LPTYElement getSource(const int &indexSource)
Retourne la source correspondant a l'indice passe.
void saveSpectre(const QString &filename, TYCalcul *pSubstCalcul=NULL)
Sauvegarde des spectres dans un fichier.
OSpectre getSpectre(TYElement *pRecepteur, TYElement *pSource)
Retourne un spectre pour un couple S-R.
virtual void setIsReadOnly(bool flag)
Set/Get du flag _isReadOnly.
static const TYTabFreq getTabFreqNorm(TYSpectreForm form=SPECTRE_FORM_TIERS)
bool operator<(dataPoint a)
std::pair< double, double > data