From a05c1bec75d7a2aac8a18be4b963d3930bc53093 Mon Sep 17 00:00:00 2001 From: Juan Manuel Carmona Loaiza <juanmcloaiza@gmail.com> Date: Wed, 26 Sep 2018 14:46:13 +0200 Subject: [PATCH] Functionality implemented: creating pointwise axis from data columns --- .../ImportDataWidgets/CsvImportAssistant.cpp | 154 +++++++----------- .../ImportDataWidgets/CsvImportAssistant.h | 6 - 2 files changed, 63 insertions(+), 97 deletions(-) diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.cpp b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.cpp index 8b4befde019..832b3e4c21f 100644 --- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.cpp +++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.cpp @@ -27,7 +27,7 @@ namespace { -const QSize default_dialog_size(600, 800); +const QSize default_dialog_size(300, 400); } CsvImportAssistant::CsvImportAssistant(QString dir, QString file, QWidget* parent): @@ -40,7 +40,6 @@ CsvImportAssistant::CsvImportAssistant(QString dir, QString file, QWidget* paren m_coordinateName(""), m_singleCol(0), m_tableWidget(nullptr), - m_filePathField(nullptr), m_separatorField(nullptr), m_firstDataRowSpinBox(nullptr), m_singleDataColSpinBox(nullptr) @@ -85,8 +84,10 @@ QBoxLayout* CsvImportAssistant::createLayout() result->setMargin(10); + result->addWidget(new QLabel("Right clicking on the table below allows you to modify what will be imported")); result->addWidget(m_tableWidget); - + result->addSpacing(20); + result->addWidget(new QLabel("Use the controls below to select what will be imported")); result->addLayout(CsvImportAssistant::createFileDetailsLayout()); @@ -100,94 +101,64 @@ QBoxLayout* CsvImportAssistant::createLayout() } QBoxLayout* CsvImportAssistant::createFileDetailsLayout(){ - auto result = new QVBoxLayout; + auto result = new QHBoxLayout; result->setMargin(10); - auto labelFilepath = new QLabel("File to import: "); - m_filePathField = new QLineEdit(m_fileName,this); - auto browseButton = new QPushButton("browse"); - connect(browseButton, &QPushButton::clicked, this, &CsvImportAssistant::onBrowseButton); - auto lay1 = new QHBoxLayout; - lay1->addWidget(labelFilepath); - lay1->addWidget(m_filePathField); - lay1->addWidget(browseButton); - - result->addLayout(lay1); - auto labelSeparator = new QLabel("Separator: "); m_separatorField = new QLineEdit(QString(guessSeparator())); m_separatorField->setMaxLength(1); - auto lay2 = new QHBoxLayout; + m_separatorField->setMaximumWidth(50); + auto lay2 = new QVBoxLayout; lay2->addWidget(labelSeparator); lay2->addWidget(m_separatorField); - result->addLayout(lay2); + //result->addLayout(lay2); connect(m_separatorField, &QLineEdit::editingFinished, this, &CsvImportAssistant::Reload); + auto lay3 = new QVBoxLayout; auto labelFirstDataRow = new QLabel("First data row: "); m_firstDataRowSpinBox = new QSpinBox(); m_firstDataRowSpinBox->setMinimum(1); m_firstDataRowSpinBox->setMaximum(1); m_firstDataRowSpinBox->setValue(1); - auto lay4 = new QHBoxLayout; - lay4->addWidget(labelFirstDataRow); - lay4->addWidget(m_firstDataRowSpinBox); - result->addLayout(lay4); + m_firstDataRowSpinBox->setMaximumWidth(50); + lay3->addWidget(labelFirstDataRow); + lay3->addWidget(m_firstDataRowSpinBox); connect(m_firstDataRowSpinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int i){ onIntChanged(i); }); + auto lay4 = new QVBoxLayout; auto labelSingleColImport = new QLabel("Import Single Column (zero to import all): "); m_singleDataColSpinBox = new QSpinBox(); m_singleDataColSpinBox->setMinimum(0); m_singleDataColSpinBox->setMaximum(0); m_singleDataColSpinBox->setValue(0); - auto laySingleDataCol = new QHBoxLayout; - laySingleDataCol->addWidget(labelSingleColImport); - laySingleDataCol->addWidget(m_singleDataColSpinBox); - result->addLayout(laySingleDataCol); + m_singleDataColSpinBox->setMaximumWidth(50); + lay4->addWidget(labelSingleColImport); + lay4->addWidget(m_singleDataColSpinBox); connect(m_singleDataColSpinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int i){ m_singleCol = i; onIntChanged(i); }); - auto lay6 = new QVBoxLayout; - auto reloadButton = new QPushButton("Reload"); - lay6->addWidget(reloadButton); - reloadButton->setDefault(true); - connect(reloadButton, &QPushButton::clicked, this, &CsvImportAssistant::onReloadButton); - - - - result->addLayout(lay1); result->addLayout(lay2); + result->addSpacing(20); + result->addLayout(lay3); + result->addSpacing(20); result->addLayout(lay4); - result->addLayout(lay6); return result; } -void CsvImportAssistant::onBrowseButton() -{ - const QString filter_string = "Intensity File (*.txt *.dat *.ascii *.int *.gz *.tif *.tiff *.csv);;All files (*.*)"; - QString fileName = QFileDialog::getOpenFileName(nullptr, QStringLiteral("Open Intensity File"), - this->m_dirName, filter_string); - if(fileName != nullptr){ - m_filePathField->setText(fileName); - m_fileName = fileName; - CsvImportAssistant::Reload(); - } - -} - void CsvImportAssistant::Reload() { - ifstream f(filepath().toStdString()); + ifstream f(m_fileName.toStdString()); if(f.good()){ generate_table(); }else{ QMessageBox msgBox; - string message = "There was a problem opening the file \"" + filepath().toStdString() + "\""; + string message = "There was a problem opening the file \"" + m_fileName.toStdString() + "\""; message += "\n Check for any errors in the path and try again."; msgBox.setText(QString::fromStdString(message)); msgBox.setIcon(msgBox.Critical); @@ -257,6 +228,31 @@ unique_ptr<OutputData<double>> CsvImportAssistant::getData() } } } + else if(m_coordinateName != ""){ + //Fill intensity values and coordinate values: + int intensityCol = 1; + int coordinateCol = 0; + vector<double> coordValues; + vector<double> intensityValues; + for(unsigned row=0; row < nDataRows; row++) { + string string_to_parse; + vector<double> parsed_doubles; + + string_to_parse = StringVectorVector[row][coordinateCol]; + parsed_doubles = DataFormatUtils::parse_doubles(string_to_parse); + coordValues.push_back(parsed_doubles[0]); + + string_to_parse = StringVectorVector[row][intensityCol]; + parsed_doubles = DataFormatUtils::parse_doubles(string_to_parse); + intensityValues.push_back(parsed_doubles[0]); + } + auto axisName = m_coordinateName.toStdString(); + PointwiseAxis coordAxis(axisName, coordValues); + result->addAxis(coordAxis); + + for(unsigned i = 0; i < intensityValues.size(); i++) + (*result)[i] = intensityValues[i]; + } else{ result->addAxis("x", nDataCols, 0.0, double(nDataCols)); result->addAxis("y", nDataRows, 0.0, double(nDataRows)); @@ -282,11 +278,11 @@ void CsvImportAssistant::generate_table() { unique_ptr<CSVFile> csvFile; try{ - csvFile.reset(new CSVFile(filepath().toStdString(), separator())); + csvFile.reset(new CSVFile(m_fileName.toStdString(), separator())); } catch(...){ QMessageBox msgBox; - string message = "There was a problem opening the file \"" + filepath().toStdString() + "\""; + string message = "There was a problem opening the file \"" + m_fileName.toStdString() + "\""; msgBox.setText(QString::fromStdString(message)); msgBox.setIcon(msgBox.Critical); msgBox.exec(); @@ -402,29 +398,6 @@ void CsvImportAssistant::setRowNumbering(){ } -bool CsvImportAssistant::cell_is_blank(int iRow, int jCol){ - - if ( m_tableWidget->item(iRow,jCol) == nullptr) - return true; - - if ( m_tableWidget->item(iRow,jCol)->text() == nullptr) - return true; - - if( m_tableWidget->item(iRow,jCol)->text().trimmed() == "") - return true; - - return false; -} - -QString CsvImportAssistant::filepath() const{ - return m_filePathField->text().trimmed(); -} - -void CsvImportAssistant::setFilepath(QString fpath){ - m_fileName = fpath; - m_filePathField->setText(m_fileName); -} - char CsvImportAssistant::separator() const{ char separator; QString tmpstr = m_separatorField->text(); @@ -510,24 +483,21 @@ unsigned CsvImportAssistant::lastLine() const{ return m_lastDataRow; } -unsigned CsvImportAssistant::singleColumnImport() const{ - return unsigned(m_singleDataColSpinBox->value()); -} - void CsvImportAssistant::OnColumnClicked(int row, int column) { - if(column < 0) return; - if(row < 0) return; - - m_tableWidget->clearSelection(); - QModelIndex left = m_tableWidget->model()->index(row, 0); - QModelIndex right = m_tableWidget->model()->index(row, m_tableWidget->columnCount() - 1); - QModelIndex top = m_tableWidget->model()->index(0, column); - QModelIndex bottom = m_tableWidget->model()->index(m_tableWidget->rowCount() - 1, column); - - QItemSelection selection(left, right); - selection.merge(QItemSelection(top, bottom), QItemSelectionModel::Select); - m_tableWidget->selectionModel()->select(selection, QItemSelectionModel::Select); + if(column < -1) return; + if(row < -1) return; + + //m_tableWidget->clearSelection(); + //m_tableWidget->selectionModel()->select +// QModelIndex left = m_tableWidget->model()->index(row, 0); + // QModelIndex right = m_tableWidget->model()->index(row, m_tableWidget->columnCount() - 1); + // QModelIndex top = m_tableWidget->model()->index(0, column); + // QModelIndex bottom = m_tableWidget->model()->index(m_tableWidget->rowCount() - 1, column); + +// QItemSelection selection(left, right); +// selection.merge(QItemSelection(top, bottom), QItemSelectionModel::Select); +// m_tableWidget->selectionModel()->select(selection, QItemSelectionModel::Select); } void CsvImportAssistant::onColumnRightClick(const QPoint position) @@ -591,6 +561,8 @@ void CsvImportAssistant::onColumnRightClick(const QPoint position) QMenu *coordMenu = menu.addMenu("Set as coordinate column"); coordMenu->setDisabled(m_coordinateCol>0 || m_singleCol > 0); + + //Set column as "Theta" QAction setAsTheta("Set as " + relevantHeaders[_theta_],nullptr); coordMenu->addAction(&setAsTheta); diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.h b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.h index a194da517aa..2606270c1b7 100644 --- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.h +++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant.h @@ -37,12 +37,10 @@ class BA_CORE_API_ CsvImportAssistant : public QDialog public: CsvImportAssistant(QString dir = "./", QString file = "", QWidget* parent = nullptr); QString filepath() const; - void setFilepath(QString fpath); char separator() const; void setHeaders(); unsigned firstLine() const; unsigned lastLine() const; - unsigned singleColumnImport() const; void Reload(); unique_ptr<OutputData<double>> getData(); QStringList relevantHeaders = {"Intensity","theta","2theta","q"}; @@ -52,7 +50,6 @@ public slots: void onImportButton(); void onReloadButton(); void onRejectButton(); - void onBrowseButton(); void onIntChanged(int _ = 0); void OnColumnClicked(int row, int column); void onColumnRightClick(const QPoint position); @@ -67,9 +64,7 @@ private: void removeBlankColumns(vector<vector<string>> &dataArray); void extractDesiredColumns(vector<vector<string>> &dataArray); bool hasEqualLengthLines(vector<vector<string> > &dataArray); - void convert_table(); void setRowNumbering(); - bool cell_is_blank(int iRow, int jCol); @@ -82,7 +77,6 @@ private: unsigned m_singleCol; QTableWidget* m_tableWidget; - QLineEdit* m_filePathField; QLineEdit* m_separatorField; QSpinBox* m_firstDataRowSpinBox; QSpinBox* m_singleDataColSpinBox; -- GitLab