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()))
744 QPoint resPoint = QPoint(point.x(), point.y() -
_pTable->horizontalHeader()->height());
745 QTableWidgetItem* item =
_pTable->itemAt(resPoint);
748 int row =
_pTable->indexAt(resPoint).row();
749 row = row >= 0 ? row : 0;
750 int col =
_pTable->indexAt(resPoint).column();
751 col = col >= 0 ? col : 0;
760 spectre = spectre.
toDB();
762 QAction *editSource =
nullptr, *editRecepteur =
nullptr, *editSpectre =
nullptr,
763 *editContrib =
nullptr;
765 QMenu* pPopup =
new QMenu(
this);
766 if ((row == 0) && (col > 1))
770 editRecepteur = pPopup->addAction(
TR(
"id_popup_see_recepteur"));
771 pPopup->addSeparator();
775 editSpectre = pPopup->addAction(
TR(
"id_popup_see_spectre"));
779 if (getElement()->getPartialState())
781 editContrib = pPopup->addAction(
TR(
"id_popup_see_contrib"));
784 else if ((row > 0) && (col > 1))
786 editSpectre = pPopup->addAction(
TR(
"id_popup_see_spectre"));
787 pPopup->addSeparator();
788 editSource = pPopup->addAction(
TR(
"id_popup_see_source"));
789 pPopup->addSeparator();
790 editRecepteur = pPopup->addAction(
TR(
"id_popup_see_recepteur"));
792 else if ((row > 0) && (col == 0))
794 editSource = pPopup->addAction(
TR(
"id_popup_see_source"));
796 else if ((row > 0) && (col == 1))
798 editSource = pPopup->addAction(
TR(
"id_popup_see_source"));
801 QAction* ret = pPopup->exec(
_pTable->mapToGlobal(point));
805 if (ret == editSource)
807 getElement()->getSource(ligne)->edit(
this);
809 else if (ret == editRecepteur)
819 if (pSpectre ==
nullptr)
834 pSpectre->edit(
this);
842 else if (ret == editSpectre)
848 else if (ret == editContrib)
862 if (pDialog->exec() == QDialog::Accepted)
864 QPrintDialog dialog(
_printer,
this);
871 int mid = int(
_printer->width() / 2) -
872 int(paint.fontMetrics().horizontalAdvance(pDialog->
_lineEditTete->text()) / 2);
875 int(paint.fontMetrics().horizontalAdvance(pDialog->
_lineEditPied->text()) / 2);
877 paint.setFont(QFont(
"Helvetica", 15, QFont::Bold));
879 int(paint.fontMetrics().horizontalAdvance(pDialog->
_lineEditTitre->text()) / 2);
881 paint.setFont(QFont());
883 int sizeX = 120, sizeY = 25;
884 int ymax = int(
double(
_printer->height()) * 4 / 5 / (
_pTable->rowCount() + 1));
889 int x = int(
double(
_printer->width() - sizeX * (
_pTable->columnCount())) / 2);
890 int y = int((
double(
_printer->height()) - sizeY * (
_pTable->rowCount() + 3)));
893 for (i = 0; i <
_pTable->horizontalHeader()->count(); i++)
895 paint.drawText(x, y,
_pTable->horizontalHeaderItem(i)->text());
896 paint.translate(sizeX, 0);
899 paint.translate(-
_pTable->columnCount() * sizeX, 0);
900 paint.translate(0, sizeY);
902 for (i = 0; i <
_pTable->rowCount(); i++)
904 for (
int j = 0; j <
_pTable->columnCount(); j++)
908 paint.drawText(x, y,
_pTable->item(i, j)->text());
911 paint.translate(sizeX, 0);
913 paint.translate(0, sizeY);
914 paint.translate(-
_pTable->columnCount() * sizeX, 0);
968 QString titre =
TR(
"id_entete_synthese");
969 _pTable->setItem(0, 0,
new QTableWidgetItem(titre));
971 _pTable->setColumnWidth(0, 140);
973 for (
unsigned int row = 1; row <
_nbLignes; row++)
976 if (pSource ==
nullptr)
981 QString titre = pSource->
getName();
982 _pTable->setItem(row, 0,
new QTableWidgetItem(titre));
983 _pTable->setRowHeight(row, 30);
990 for (
unsigned int col = 1; col <
_nbColonnes; col++)
1000 for (
unsigned int row = 0; row <
_nbLignes; row++)
1005 QTableWidgetItem* pItem =
nullptr;
1007 double valeur = 0.0;
1015 msg = QString(
"%1").arg(valeur, 7,
'f', 1);
1016 pItem =
new QTableWidgetItem(msg);
1018 _pTable->setItem(row, col, pItem);
1019 _pTable->setRowHeight(row, 30);
1025 msg = QString(
"%1").arg(valeur, 7,
'f', 1);
1026 pItem =
new QTableWidgetItem(msg);
1028 _pTable->setItem(row, col, pItem);
1029 _pTable->setRowHeight(row, 30);
1036 msg = QString(
"%1").arg(valeur, 7,
'f', 1);
1037 pItem =
new QTableWidgetItem(msg);
1039 _pTable->setItem(row, col, pItem);
1040 _pTable->setRowHeight(row, 30);
1045 _pTable->setColumnWidth(col, 50);
1054 if ((!pCalcul) || (col == 0))
1074 TYPointCalcul* pPoint = getElement()->getRecepteur(col - 2);
1090 spectre = pResultat->
getSpectre(pRecepteur, pSource);
1091 spectre = spectre.
toDB();
1110 for (
unsigned int i = 0; i < getElement()->getNbOfSources(); i++)
1115 if (getElement() && getElement()->getSource(i))
1121 spectre2 =
getSpectre(row, col, pSubstCalcul);
1168 TYElement* pElement = getElement()->getSource(i);
1178 std::map<TYElement*, LPTYSpectre>& mapElementSpectre = getElement()->getMapElementSpectre();
1179 TYSpectre* puissance = mapElementSpectre[pElement];
1183 spectre = *puissance;
1195 pDlg->
set(getElement(), pPoint);
1224 double seuil = dummy - val;
1225 double dummyEner = pow(10, dummy / 10);
1226 double seuilEner = pow(10, seuil / 10);
1227 return int(100 * seuilEner / dummyEner);
1241 return data.second < a.
data.second;
1248 size_t nbSources = getElement()->getNbOfSources();
1250 std::vector<dataPoint> values = std::vector<dataPoint>(nbSources);
1251 std::vector<int> couleur = std::vector<int>(nbSources);
1258 for (
int row = 1; row <= nbSources; row++)
1264 values[row - 1].data =
1267 values[row - 1].data =
1271 std::sort(values.begin(), values.end());
1272 std::reverse(values.begin(), values.end());
1276 for (
int i = 0; i < nbSources; i++)
1278 double val = values[i].data.second;
1279 val = pow(10, val * 0.1);
1281 double res = 10 * log10(cum);
1282 values[i].data.second = res;
1293 double previousVal = values[0].data.second;
1294 for (
int i = 0; i < nbSources; i++)
1298 double currentVal = values[i].data.second;
1301 values[i].data.second =
RED;
1303 values[i].data.second =
ORANGE;
1305 values[i].data.second =
YELLOW;
1307 values[i].data.second =
WHITE;
1308 previousVal = currentVal;
1311 values[i].data.second =
RED;
1314 std::swap(values[i].data.first, values[i].data.second);
1318 std::sort(values.begin(), values.end());
1320 for (
int i = 0; i < nbSources; i++)
1322 couleur[i] = values[i].data.first;
1329 const int& typeCase)
1331 double val1 = 0.0, val2 = 0.0;
1398 return spectre1.
subst(spectre2);
1417 pItem->setBackground(QBrush(QColor(127, 127, 127)));
1423 pItem->setBackground(QBrush(QColor(255, 255, 255)));
1432 spectre = getElement()->getAmbiant(spectre1, spectre2);
1441 pItem->setBackground(QBrush(QColor(255, 255, 0)));
1446 bool& isColored, std::vector<int> couleurs)
1448 double codeCoul = couleurs[row - 1];
1452 pItem->setBackground(QBrush(QColor(127, 127, 127)));
1458 pItem->setBackground(QBrush(QColor(255, 255, 255)));
1466 pItem->setBackground(QBrush(QColor(255, 0, 0)));
1470 pItem->setBackground(QBrush(QColor(255, 204, 0)));
1474 pItem->setBackground(QBrush(QColor(255, 255, 0)));
1482 for (
unsigned int i = 0; i <
tabFreq.size(); i++)
1485 str.setNum(
tabFreq[i],
'f', 1);
1497 int compareRes(
const void* elem1,
const void* elem2)
1503 int sgn = int(res / fabs(res));
1507 int compareName(
const void* elem1,
const void* elem2)
1521 Qt::CaseSensitivity cs ,
1529 std::vector<Col> cols;
1536 if (
auto* it =
_pTable->horizontalHeaderItem(
c))
1539 txt =
_pTable->model()->headerData(
c, Qt::Horizontal).toString();
1540 cols.push_back({txt,
c});
1544 auto cmp = [&](
const Col& a,
const Col& b)
1547 localeAware ? QString::localeAwareCompare(a.text, b.text) : QString::compare(a.text, b.text, cs);
1548 return (order == Qt::AscendingOrder) ? (r < 0) : (r > 0);
1550 std::stable_sort(cols.begin(), cols.end(), cmp);
1553 QHeaderView* hh =
_pTable->horizontalHeader();
1554 hh->setSectionsMovable(
true);
1555 _pTable->setUpdatesEnabled(
false);
1556 QSignalBlocker blockHeader(hh);
1560 int from = hh->visualIndex(cols[target - 2].logical);
1562 hh->moveSection(from, target);
1565 _pTable->setUpdatesEnabled(
true);
1566 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