From f3385095c4dbce1c18801b32935c093e9765063a Mon Sep 17 00:00:00 2001
From: Juan Manuel Carmona Loaiza <juanmcloaiza@gmail.com>
Date: Fri, 28 Sep 2018 15:31:23 +0200
Subject: [PATCH] Postponing CsvImportAssistant for next release

---
 Core/InputOutput/OutputDataReadFactory.cpp    |  2 +
 Core/InputOutput/OutputDataReadStrategy.cpp   | 42 +++++++++++++++
 Core/InputOutput/OutputDataReadStrategy.h     | 10 ++++
 .../ImportDataWidgets/ImportDataUtils.cpp     | 54 ++++++-------------
 .../Views/ImportDataWidgets/ImportDataUtils.h |  2 -
 5 files changed, 69 insertions(+), 41 deletions(-)

diff --git a/Core/InputOutput/OutputDataReadFactory.cpp b/Core/InputOutput/OutputDataReadFactory.cpp
index a5c62ec5a86..2f06b48fc6c 100644
--- a/Core/InputOutput/OutputDataReadFactory.cpp
+++ b/Core/InputOutput/OutputDataReadFactory.cpp
@@ -28,6 +28,8 @@ IOutputDataReadStrategy* OutputDataReadFactory::getReadStrategy(const std::strin
     IOutputDataReadStrategy* result(nullptr);
     if(DataFormatUtils::isIntFile(file_name))
         result = new OutputDataReadINTStrategy();
+    else if(DataFormatUtils::isTxtFile(file_name))
+        result = new OutputDataReadNumpyTXTStrategy();
 #ifdef BORNAGAIN_TIFF_SUPPORT
     else if(DataFormatUtils::isTiffFile(file_name))
        result = new OutputDataReadTiffStrategy();
diff --git a/Core/InputOutput/OutputDataReadStrategy.cpp b/Core/InputOutput/OutputDataReadStrategy.cpp
index 471e2cdc5ea..e96b2ba0dd5 100644
--- a/Core/InputOutput/OutputDataReadStrategy.cpp
+++ b/Core/InputOutput/OutputDataReadStrategy.cpp
@@ -36,6 +36,48 @@ OutputData<double>* OutputDataReadINTStrategy::readOutputData(std::istream& inpu
     return result;
 }
 
+
+OutputData<double>* OutputDataReadNumpyTXTStrategy::readOutputData(std::istream& input_stream)
+{
+    std::string line;
+    std::vector<std::vector<double>> data;
+
+    while( std::getline(input_stream, line) ) {
+        if(line.empty() || line[0] == '#')
+            continue;
+        std::vector<double> data_in_row = DataFormatUtils::parse_doubles(line);
+        data.push_back(data_in_row);
+    }
+    // validating
+    size_t nrows = data.size();
+    size_t ncols(0);
+    if(nrows) ncols = data[0].size();
+
+    if (ncols == 0)
+        throw std::runtime_error("OutputDataReadNumpyTXTStrategy::readOutputData() -> Error. "
+                                 "Can't parse file");
+
+    for(size_t row=0; row<nrows; row++) {
+        if(data[row].size() != ncols)
+            throw std::runtime_error("OutputDataReadNumpyTXTStrategy::readOutputData() -> Error. "
+                                     "Number of elements is different from row to row.");
+    }
+    OutputData<double>* result = new OutputData<double>;
+    result->addAxis("x", ncols, 0.0, double(ncols));
+    result->addAxis("y", nrows, 0.0, double(nrows));
+    std::vector<unsigned> axes_indices(2);
+    for(unsigned row=0; row<nrows; row++) {
+        for(unsigned col=0; col<ncols; col++) {
+            axes_indices[0] = col;
+            axes_indices[1] = static_cast<unsigned>(nrows) - 1 - row;
+            size_t global_index = result->toGlobalIndex(axes_indices);
+            (*result)[global_index] = data[row][col];
+        }
+    }
+    return result;
+}
+
+
 #ifdef BORNAGAIN_TIFF_SUPPORT
 
 OutputDataReadTiffStrategy::OutputDataReadTiffStrategy()
diff --git a/Core/InputOutput/OutputDataReadStrategy.h b/Core/InputOutput/OutputDataReadStrategy.h
index 6df8c43d898..21811f7d9b1 100644
--- a/Core/InputOutput/OutputDataReadStrategy.h
+++ b/Core/InputOutput/OutputDataReadStrategy.h
@@ -39,6 +39,16 @@ public:
     OutputData<double>* readOutputData(std::istream& input_stream);
 };
 
+//! Strategy to read OutputData from simple ASCII file with the layout as in numpy.savetxt.
+//! @ingroup input_output_internal
+
+class OutputDataReadNumpyTXTStrategy : public IOutputDataReadStrategy
+{
+public:
+    OutputData<double>* readOutputData(std::istream& input_stream);
+};
+
+
 #ifdef BORNAGAIN_TIFF_SUPPORT
 
 class TiffHandler;
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp b/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp
index becf9a3f501..7ee22166b92 100644
--- a/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp
@@ -21,7 +21,6 @@
 #include "IntensityDataIOFactory.h"
 #include "IntensityDataItem.h"
 #include "RealDataItem.h"
-#include "CsvImportAssistant.h"
 #include "projectmanager.h"
 #include <QFileDialog>
 #include <QFileInfo>
@@ -29,7 +28,7 @@
 
 namespace
 {
-const QString filter_string = "Intensity File (*.int *.gz *.tif *.tiff *.txt *.csv);;"
+const QString filter_string = "Intensity File (*.int *.gz *.tif *.tiff *.txt);;"
                               "Other (*)";
 
 int getRank(const RealDataItem& item)
@@ -45,58 +44,35 @@ int getRank(const InstrumentItem& item) {
 std::unique_ptr<OutputData<double>> ImportDataUtils::ImportData(QString& baseNameOfLoadedFile)
 {
     QString dirname = AppSvc::projectManager()->userImportDir();
-    QString fileName = QFileDialog::getOpenFileName(Q_NULLPTR, QStringLiteral("Open Intensity File"),
+    QString fileName = QFileDialog::getOpenFileName(0, QStringLiteral("Open Intensity File"),
                                                     dirname, filter_string);
 
-    std::unique_ptr<OutputData<double>> result;
-
-    QString newImportDir = GUIHelpers::fileDir(fileName);
-    if (newImportDir != dirname)
-        AppSvc::projectManager()->setImportDir(newImportDir);
-
     if (fileName.isEmpty())
         return nullptr;
 
     QFileInfo info(fileName);
     baseNameOfLoadedFile = info.baseName();
 
-    //Try to use the canonical tools for importing data
-    try {
-        std::unique_ptr<OutputData<double>> data(
-                    IntensityDataIOFactory::readOutputData(fileName.toStdString()));
-        result = CreateSimplifiedOutputData(*data.get());
+    QString newImportDir = GUIHelpers::fileDir(fileName);
+    if (newImportDir != dirname)
+        AppSvc::projectManager()->setImportDir(newImportDir);
 
-    } catch(std::exception& e)
-            //Try to import data using the GUI importer
-    {
-        std::unique_ptr<OutputData<double>> data;
-        if(!UseImportAssistant(dirname, fileName, data))
-            return nullptr;
+    std::unique_ptr<OutputData<double>> result;
 
+    try {
+        std::unique_ptr<OutputData<double>> data(
+            IntensityDataIOFactory::readOutputData(fileName.toStdString()));
         result = CreateSimplifiedOutputData(*data.get());
+    } catch (std::exception& ex) {
+        QString message = QString("Error while trying to read file\n\n'%1'\n\n%2")
+                              .arg(fileName)
+                              .arg(QString::fromStdString(std::string(ex.what())));
+        QMessageBox::warning(0, "IO Problem", message);
     }
-    return result;
-}
 
-bool ImportDataUtils::UseImportAssistant(QString& dirname, QString& fileName, std::unique_ptr<OutputData<double>>& result){
-    try{
-        CsvImportAssistant assistant(dirname,fileName);
-        int res = assistant.exec();
-        if(res == assistant.Accepted){
-            result = assistant.getData();
-            return true;
-        }
-    }catch(std::exception& e){
-        QString message = QString("Unable to read file:\n\n'%1'\n\n%2\n\nCheck that the file exists and it is not being used by other program.\n\n")
-                .arg(fileName)
-                .arg(QString::fromStdString(std::string(e.what())));
-        QMessageBox::warning(nullptr, "IO Problem", message);
-        return false;
-    }
-    return false;
+    return result;
 }
 
-
 bool ImportDataUtils::Compatible(const InstrumentItem& instrumentItem,
                                  const RealDataItem& realDataItem)
 {
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.h b/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.h
index 3e561701624..489a8622006 100644
--- a/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.h
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.h
@@ -31,8 +31,6 @@ namespace ImportDataUtils
 {
 
 BA_CORE_API_ std::unique_ptr<OutputData<double>> ImportData(QString& baseNameOfLoadedFile);
-BA_CORE_API_ bool UseImportAssistant(QString& dirname, QString& fileName, std::unique_ptr<OutputData<double>>& result);
-
 
 //! Creates OutputData with bin-valued axes.
 BA_CORE_API_ std::unique_ptr<OutputData<double>>
-- 
GitLab