15 #include <QFileDialog>
16 #include <QMessageBox>
18 #include <QStandardPaths>
19 #include <QTableWidgetItem>
31 classifierSaved(false),
33 traceFileConfigured(false),
38 QDateTime dateTime = QDateTime::currentDateTime();
39 m_baseName =
"3dmasc_" + dateTime.toString(
"yyyyMMdd_hh") +
"h" +
40 dateTime.toString(
"mm");
44 connect(closePushButton, SIGNAL(clicked()),
this, SLOT(
onClose()));
45 connect(savePushButton, SIGNAL(clicked()),
this, SLOT(
onSave()));
46 connect(exportToolButton, SIGNAL(clicked()),
this, SLOT(
onExportResults()));
53 if (m !=
nullptr)
delete m;
59 settings.beginGroup(
"3DMASC");
60 bool keepAttributes = settings.value(
"keepAttributes",
false).toBool();
61 this->keepAttributesCheckBox->setChecked(keepAttributes);
62 bool saveTrace = settings.value(
"saveTrace",
false).toBool();
68 settings.beginGroup(
"3DMASC");
69 settings.setValue(
"keepAttributes", keepAttributesCheckBox->isChecked());
70 settings.setValue(
"saveTrace", checkBox_keepTraces->isChecked());
81 int index = tableWidget->rowCount();
82 tableWidget->setRowCount(index + 1);
84 QTableWidgetItem* nameItem =
new QTableWidgetItem(
name);
85 nameItem->setCheckState(isChecked ? Qt::Checked : Qt::Unchecked);
86 tableWidget->setItem(index, 0, nameItem);
88 QTableWidgetItem* importanceItem =
new QTableWidgetItem(
89 std::isnan(importance) ? QString() : QString::number(importance));
90 tableWidget->setItem(index, 1, importanceItem);
96 int index = tableWidgetScales->rowCount();
97 tableWidgetScales->setRowCount(index + 1);
99 QTableWidgetItem* nameItem =
new QTableWidgetItem(QString::number(scale));
100 nameItem->setCheckState(isChecked ? Qt::Checked : Qt::Unchecked);
101 tableWidgetScales->setItem(index, 0, nameItem);
109 QString scale =
"_SC" + item->text() +
"_";
110 for (
int row = 0; row < tableWidget->rowCount(); row++) {
111 QTableWidgetItem* nameItem = tableWidget->item(row, 0);
112 QString
name = nameItem->text();
113 if (
name.contains(scale)) nameItem->setCheckState(item->checkState());
118 connect(tableWidgetScales, &QTableWidget::itemChanged,
this,
123 resultLabel->setText(text);
127 runPushButton->setText(tr(
"Retry"));
128 savePushButton->setEnabled(
true);
132 for (
int index = 0; index < tableWidget->rowCount(); ++index) {
133 QTableWidgetItem* item = tableWidget->item(index, 0);
134 if (item->text() == featureName) {
135 return (item->checkState() == Qt::Checked);
149 for (
int index = 0; index < tableWidget->rowCount(); ++index) {
150 if (tableWidget->item(index, 0)->text() == featureName) {
151 QTableWidgetItem* item =
153 item->setText(std::isnan(importance)
155 : QString::number(importance,
'f', 6));
165 QMessageBox::question(
this,
"Classifier not saved",
166 "Classifier not saved. Do you confirm you want "
167 "to close the tool?",
169 QMessageBox::No) == QMessageBox::No)
182 settings.beginGroup(
"3DMASC");
184 settings.value(
"FilePath", QCoreApplication::applicationDirPath())
186 QString outputFilename = QFileDialog::getSaveFileName(
187 this,
"Export feature importance matrix", outputPath,
"*.csv");
188 if (outputFilename.isNull()) {
192 settings.setValue(
"FilePath", QFileInfo(outputFilename).absolutePath());
196 QFile file(outputFilename);
197 if (!file.open(QFile::WriteOnly | QFile::Text)) {
198 QMessageBox::critical(
200 "Failed to open file for writing: " + outputFilename);
204 QTextStream stream(&file);
206 for (
int index = 0; index < tableWidget->rowCount(); ++index) {
207 QString featureName = tableWidget->item(index, 0)->text();
225 checkBox_keepTraces->setChecked(state);
229 QString traceFileName;
230 QString traceFilePath;
234 QDir parameterDir = QDir(info.path());
236 QFileDialog dialog(
this);
237 #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
239 dialog.setFileMode(QFileDialog::Directory);
240 dialog.setOption(QFileDialog::ShowDirsOnly,
true);
243 dialog.setFileMode(QFileDialog::DirectoryOnly);
245 dialog.setWindowTitle(
"Choose a valid directory for the traces");
247 QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)
256 QDateTime dateTime = QDateTime::currentDateTime();
257 m_baseName +=
"min" + dateTime.toString(
"ss") +
"s";
262 CVLog::Error(
"impossible to save in the default directory: " +
276 if (!
m_traceFile->open(QIODevice::WriteOnly | QIODevice::Text)) {
277 CVLog::Error(
"impossible to open trace file: " + traceFilePath);
309 if (checkBox_keepTraces->isChecked()) {
322 QString::number(
run) +
"_confusion_matrix.txt");
327 return checkBox_keepTraces->isChecked();
333 return fi.absoluteDir().absolutePath();
336 return fi.absoluteDir().absolutePath();
static bool Print(const char *format,...)
Prints out a formatted message in console.
static bool Error(const char *format,...)
Display an error dialog with formatted message.
float getOverallAccuracy()
void setSessionRun(QString session, int run)
bool save(QString filePath)
3DMASC plugin 'train' dialog
void connectScaleSelectionToFeatureSelection()
void saveTraces(ConfusionMatrix *confusionMatrix)
void addConfusionMatrixAndSaveTraces(ConfusionMatrix *ptr)
void setInputFilePath(QString filename)
bool isFeatureSelected(QString featureName) const
void sortByFeatureImportance()
QTextStream m_traceStream
int addFeature(QString name, float importance, bool isChecked=true)
Adds a feature (entry) to the results table.
int addScale(double scale, bool isChecked=true)
void setCheckBoxSaveTrace(bool state)
void scaleStateChanged(QTableWidgetItem *item)
Train3DMASCDialog(QWidget *parent=nullptr)
Default constructor.
std::vector< ConfusionMatrix * > toDeleteLater
void setFeatureImportance(QString featureName, float importance)
void onExportResults(QString filePath="")
QString m_parameterFilePath
void setResultText(QString text)
QTextStream & endl(QTextStream &stream)
static const int FeatureImportanceColumn