diff --git a/Train3DMASCDialog.ui b/Train3DMASCDialog.ui index cbc8fa7..7678cb4 100644 --- a/Train3DMASCDialog.ui +++ b/Train3DMASCDialog.ui @@ -7,7 +7,7 @@ 0 0 400 - 500 + 550 @@ -228,6 +228,13 @@ + + + + export + + + diff --git a/q3DMASCClassifier.cpp b/q3DMASCClassifier.cpp index 4d5f675..9260bb5 100644 --- a/q3DMASCClassifier.cpp +++ b/q3DMASCClassifier.cpp @@ -207,7 +207,8 @@ bool Classifier::classify( const Feature::Source::Set& featureSources, catch (const cv::Exception& cvex) { errorMessage = cvex.msg.c_str(); - return false; + success = false; + break; } for (int fIndex = 0; fIndex < attributesPerSample; ++fIndex) diff --git a/qTrain3DMASCDialog.cpp b/qTrain3DMASCDialog.cpp index e118739..7381248 100644 --- a/qTrain3DMASCDialog.cpp +++ b/qTrain3DMASCDialog.cpp @@ -20,6 +20,9 @@ //Qt #include #include +#include +#include +#include //System #include @@ -36,6 +39,7 @@ Train3DMASCDialog::Train3DMASCDialog(QWidget* parent/*=nullptr*/) connect(closePushButton, SIGNAL(clicked()), this, SLOT(onClose())); connect(savePushButton, SIGNAL(clicked()), this, SLOT(onSave())); + connect(exportToolButton, SIGNAL(clicked()), this, SLOT(onExportResults())); } void Train3DMASCDialog::clearResults() @@ -96,7 +100,7 @@ void Train3DMASCDialog::setFeatureImportance(QString featureName, float importan { if (tableWidget->item(index, 0)->text() == featureName) { - QTableWidgetItem* item = tableWidget->item(static_cast(index), FeatureImportanceColumn); + QTableWidgetItem* item = tableWidget->item(index, FeatureImportanceColumn); item->setText(std::isnan(importance) ? QString() : QString::number(importance, 'f', 6)); return; } @@ -118,3 +122,35 @@ void Train3DMASCDialog::onSave() saveRequested = true; accept(); } + +void Train3DMASCDialog::onExportResults() +{ + QSettings settings; + settings.beginGroup("3DMASC"); + QString outputPath = settings.value("FilePath", QCoreApplication::applicationDirPath()).toString(); + QString outputFilename = QFileDialog::getSaveFileName(this, "Export feature importance matrix", outputPath, "*.csv"); + if (outputFilename.isNull()) + { + //process cancelled by the user + return; + } + settings.setValue("FilePath", QFileInfo(outputFilename).absolutePath()); + settings.endGroup(); + + //save the file + QFile file(outputFilename); + if (!file.open(QFile::WriteOnly | QFile::Text)) + { + QMessageBox::critical(this, "Error", "Failed to open file for writing: " + outputFilename); + return; + } + + QTextStream stream(&file); + stream << "Feature;Importance" << endl; + for (int index = 0; index < tableWidget->rowCount(); ++index) + { + QString featureName = tableWidget->item(index, 0)->text(); + QString importance = tableWidget->item(index, FeatureImportanceColumn)->text(); + stream << featureName << ";" << importance << endl; + } +} \ No newline at end of file diff --git a/qTrain3DMASCDialog.h b/qTrain3DMASCDialog.h index 7d2fb24..c777890 100644 --- a/qTrain3DMASCDialog.h +++ b/qTrain3DMASCDialog.h @@ -53,6 +53,7 @@ protected slots: void onClose(); void onSave(); + void onExportResults(); protected: //members