From ebc65f1ddbd5468747b1770b3c8c5cbd65428ef0 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Tue, 29 Apr 2014 13:07:58 +0200
Subject: [PATCH] IsGISAXS01 sample is simulated from GUI.

---
 GUI/coregui/Models/ParameterizedItem.cpp      |   9 +-
 GUI/coregui/Models/ParameterizedItem.h        |   4 +-
 GUI/coregui/Models/SimulationDataModel.cpp    |  28 +++-
 GUI/coregui/Models/SimulationDataModel.h      |   4 +-
 .../MaterialEditor/MaterialUtils.cpp          |   4 +-
 GUI/coregui/Views/SimulationView.cpp          |  11 +-
 GUI/coregui/mainwindow/mainwindow.cpp         | 131 ++++++++++--------
 GUI/coregui/mainwindow/mainwindow.h           |  15 +-
 8 files changed, 127 insertions(+), 79 deletions(-)

diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp
index f6fdad9c82c..78653df0039 100644
--- a/GUI/coregui/Models/ParameterizedItem.cpp
+++ b/GUI/coregui/Models/ParameterizedItem.cpp
@@ -104,11 +104,14 @@ void ParameterizedItem::updatePropertyItem(QString name)
     emit propertyItemChanged(name);
 }
 
-void ParameterizedItem::setMaterialProperty()
+void ParameterizedItem::setMaterialProperty(MaterialProperty material)
 {
-    MaterialProperty material = MaterialEditor::getDefaultMaterialProperty();
     QVariant mat_var;
-    mat_var.setValue(material);
+    if(material.isDefined()) {
+        mat_var.setValue(material);
+    } else {
+        mat_var.setValue(MaterialEditor::getDefaultMaterialProperty());
+    }
     setProperty("Material", mat_var);
 }
 
diff --git a/GUI/coregui/Models/ParameterizedItem.h b/GUI/coregui/Models/ParameterizedItem.h
index 89b2e13d160..0a908ef48c9 100644
--- a/GUI/coregui/Models/ParameterizedItem.h
+++ b/GUI/coregui/Models/ParameterizedItem.h
@@ -16,6 +16,7 @@
 #ifndef PARAMETERIZEDITEM_H_
 #define PARAMETERIZEDITEM_H_
 
+#include "MaterialItem.h"
 #include <QStandardItem>
 #include <QList>
 #include <QMap>
@@ -96,7 +97,8 @@ public:
     void addFormFactorProperty(const char *name, QString value);
     explicit ParameterizedItem(const QString &model_type=QString(),
                                ParameterizedItem *parent=0);
-    void setMaterialProperty();
+
+    void setMaterialProperty(MaterialProperty material = MaterialProperty());
 
 signals:
     void propertyChanged(QString propertyName);
diff --git a/GUI/coregui/Models/SimulationDataModel.cpp b/GUI/coregui/Models/SimulationDataModel.cpp
index 9e894fa0206..5a6af987b45 100644
--- a/GUI/coregui/Models/SimulationDataModel.cpp
+++ b/GUI/coregui/Models/SimulationDataModel.cpp
@@ -6,11 +6,33 @@ SimulationDataModel::SimulationDataModel()
 {
 }
 
+SimulationDataModel::~SimulationDataModel()
+{
+    clear();
+}
+
+
+void SimulationDataModel::clear()
+{
+    qDeleteAll(m_samples);
+    m_samples.clear();
+
+    qDeleteAll(m_sample_builders);
+    m_sample_builders.clear();
+
+    qDeleteAll(m_instruments);
+    m_instruments.clear();
+
+    qDeleteAll(m_simulation_parameters);
+    m_simulation_parameters.clear();
+}
+
+
 void SimulationDataModel::addSample(QString name, ISample *p_sample)
 {
-    if (!m_samples.contains(name)) {
-        m_samples.insert(name, p_sample);
-    }
+//    if (!m_samples.contains(name)) {
+        m_samples.insertMulti(name, p_sample);
+//    }
 }
 
 void SimulationDataModel::addSampleBuilder(QString name, ISampleBuilder *p_sample_builder)
diff --git a/GUI/coregui/Models/SimulationDataModel.h b/GUI/coregui/Models/SimulationDataModel.h
index 4106d681912..f99c4a88e90 100644
--- a/GUI/coregui/Models/SimulationDataModel.h
+++ b/GUI/coregui/Models/SimulationDataModel.h
@@ -31,7 +31,9 @@ class SimulationDataModel
 {
 public:
     SimulationDataModel();
-    ~SimulationDataModel() {}
+    ~SimulationDataModel();
+
+    void clear();
 
     //! retrieve a list of the contained samples
     //! \return a list containing the ISample objects
diff --git a/GUI/coregui/Views/Components/MaterialEditor/MaterialUtils.cpp b/GUI/coregui/Views/Components/MaterialEditor/MaterialUtils.cpp
index 587c5ea4816..e7d46f6e17c 100644
--- a/GUI/coregui/Views/Components/MaterialEditor/MaterialUtils.cpp
+++ b/GUI/coregui/Views/Components/MaterialEditor/MaterialUtils.cpp
@@ -11,11 +11,13 @@
 QColor MaterialUtils::suggestMaterialColor(const QString &name)
 {
     if(name == QStringLiteral("Air") ) {
-        return QColor(176, 226, 255);
+        return QColor(179, 242, 255);
     } else if(name == QStringLiteral("Substrate") ) {
         return QColor(205,102,0);
     } else if ( name == QStringLiteral("Default") ) {
         return QColor(Qt::green);
+    } else if ( name == QStringLiteral("Particle") ) {
+        return QColor(146, 198, 255);
     }
     return DesignerHelper::getRandomColor();
 }
diff --git a/GUI/coregui/Views/SimulationView.cpp b/GUI/coregui/Views/SimulationView.cpp
index 0fed8a0b39e..3b893c83b63 100644
--- a/GUI/coregui/Views/SimulationView.cpp
+++ b/GUI/coregui/Views/SimulationView.cpp
@@ -106,8 +106,15 @@ void SimulationView::updateViewElements()
 {
     instrumentSelectionBox->clear();
     instrumentSelectionBox->addItems(mp_simulation_data_model->getInstrumentList().keys());
+
     sampleSelectionBox->clear();
-    sampleSelectionBox->addItems(mp_simulation_data_model->getSampleList().keys());
+    if(mp_simulation_data_model->getSampleList().isEmpty()) {
+        sampleSelectionBox->addItem("No sample to simulate yet");
+        sampleSelectionBox->setEnabled(false);
+    } else {
+        sampleSelectionBox->setEnabled(true);
+        sampleSelectionBox->addItems(mp_simulation_data_model->getSampleList().keys());
+    }
 }
 
 void SimulationView::onRunSimulation()
@@ -131,7 +138,7 @@ void SimulationView::onRunSimulation()
     p_sim->setSample(*p_sample);
     p_sim->setInstrument(*p_instrument);
 
-    QString identifier = m_jobQueueModel->addJob("SimulationView", p_sim);
+    QString identifier = m_jobQueueModel->addJob(p_sample->getName().c_str(), p_sim);
     m_jobQueueModel->runJob(identifier);
 }
 
diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp
index d6ada512c78..ac89ed3d83c 100644
--- a/GUI/coregui/mainwindow/mainwindow.cpp
+++ b/GUI/coregui/mainwindow/mainwindow.cpp
@@ -86,18 +86,15 @@ MainWindow::MainWindow(QWidget *parent)
     m_fitView = new FitView();
     m_jobQueueView = new JobQueueView(m_jobQueueModel);
 
-    m_tabWidget->insertTab(0, m_welcomeView, QIcon(":/images/main_home.png"), "Welcome");
-    m_tabWidget->insertTab(1, m_instrumentView, QIcon(":/images/main_instrument.png"), "Instrument");
-    m_tabWidget->insertTab(2, m_sampleView, QIcon(":/images/main_sample.png"), "Sample");
+    m_tabWidget->insertTab(WelcomeTab, m_welcomeView, QIcon(":/images/main_home.png"), "Welcome");
+    m_tabWidget->insertTab(InstrumentTab, m_instrumentView, QIcon(":/images/main_instrument.png"), "Instrument");
+    m_tabWidget->insertTab(SampleTab, m_sampleView, QIcon(":/images/main_sample.png"), "Sample");
     //m_tabWidget->insertTab(3, m_scriptView, QIcon(":/images/mode_script.png"), "Python scripts");
-    m_tabWidget->insertTab(3, m_simulationView, QIcon(":/images/main_simulation.png"), "Simulation");
+    m_tabWidget->insertTab(SimulationTab, m_simulationView, QIcon(":/images/main_simulation.png"), "Simulation");
     //m_tabWidget->insertTab(6, m_fitView, QIcon(":/images/mode_fit.png"), "Fit");
-    m_tabWidget->insertTab(4, m_jobQueueView, QIcon(":/images/main_jobqueue.png"), "Jobs");
+    m_tabWidget->insertTab(JobTab, m_jobQueueView, QIcon(":/images/main_jobqueue.png"), "Jobs");
 
-//    MaterialEditorWidget *materialWidget = new MaterialEditorWidget(m_materialModel, this);
-//    m_tabWidget->insertTab(5, materialWidget, QIcon(":/images/main_jobqueue.png"), "Jobs");
-
-    m_tabWidget->setCurrentIndex(2);
+    m_tabWidget->setCurrentIndex(SampleTab);
 
     m_progressBar = new Manhattan::ProgressBar(this);
     m_tabWidget->addBottomCornerWidget(m_progressBar);
@@ -119,11 +116,9 @@ MainWindow::MainWindow(QWidget *parent)
     m_projectManager->createNewProject();
 }
 
+
 MainWindow::~MainWindow()
 {
-//    delete m_actionManager;
-//    delete m_settings;
-//    m_settings = 0;
     delete m_materialEditor;
 }
 
@@ -154,23 +149,6 @@ void MainWindow::writeSettings()
 }
 
 
-QSettings *MainWindow::getSettings() const
-{
-    return m_settings;
-}
-
-//void MainWindow::newProject()
-//{
-//    m_projectManager->createNewProject();
-//}
-
-
-//void MainWindow::openProject()
-//{
-//    m_projectManager->openProject();
-//}
-
-
 void MainWindow::openRecentProject()
 {
     if (const QAction *action = qobject_cast<const QAction*>(sender())) {
@@ -186,7 +164,10 @@ void MainWindow::onChangeTabWidget(int index)
 {
     // update views which depend on others
     (void)index;
-    m_simulationView->updateViewElements();
+    if(index == SimulationTab) {
+        updateSimModel();
+        m_simulationView->updateViewElements();
+    }
 }
 
 
@@ -202,37 +183,37 @@ void MainWindow::initSimModel()
     if (mp_sim_data_model) delete mp_sim_data_model;
     mp_sim_data_model = new SimulationDataModel;
     mp_sim_data_model->addInstrument(tr("Default GISAS"), createDefaultInstrument());
-    mp_sim_data_model->addSample(tr("Default cylinder single layer"), createDefaultSample());
+    //mp_sim_data_model->addSample(tr("Default cylinder single layer"), createDefaultSample());
 }
 
 Instrument *MainWindow::createDefaultInstrument()
 {
     Instrument *p_result = new Instrument;
-    p_result->setBeamParameters(0.1*Units::nanometer, 0.4*Units::degree, 0.0);
+    p_result->setBeamParameters(0.1*Units::nanometer, 0.2*Units::degree, 0.0);
     p_result->setBeamIntensity(1e7);
-    p_result->setDetectorParameters(100, 0.0, 3.0*Units::degree,
-                                    100, 0.0, 3.0*Units::degree);
+    p_result->setDetectorParameters(100, -1.0*Units::degree, 1.0*Units::degree,
+                                    100, 0.0*Units::degree, 2.0*Units::degree);
     return p_result;
 }
 
-ISample *MainWindow::createDefaultSample()
-{
-    MultiLayer *p_multi_layer = new MultiLayer();
-    const IMaterial *mAir = MaterialManager::getHomogeneousMaterial("Air", 0., 0.);
-    const IMaterial *mSubstrate = MaterialManager::getHomogeneousMaterial("Substrate", 6e-6, 2e-8);
-    const IMaterial *mParticle = MaterialManager::getHomogeneousMaterial("Particle", 6e-4, 2e-8);
-    Layer air_layer;
-    air_layer.setMaterial(*mAir);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(*mSubstrate);
-    ParticleLayout particle_layout( new Particle(*mParticle, FormFactorCylinder(5*Units::nanometer, 5*Units::nanometer)));
-    particle_layout.addInterferenceFunction(new InterferenceFunctionNone());
-    air_layer.setLayout(particle_layout);
-
-    p_multi_layer->addLayer(air_layer);
-    p_multi_layer->addLayer(substrate_layer);
-    return p_multi_layer;
-}
+//ISample *MainWindow::createDefaultSample()
+//{
+//    MultiLayer *p_multi_layer = new MultiLayer();
+//    const IMaterial *mAir = MaterialManager::getHomogeneousMaterial("Air", 0., 0.);
+//    const IMaterial *mSubstrate = MaterialManager::getHomogeneousMaterial("Substrate", 6e-6, 2e-8);
+//    const IMaterial *mParticle = MaterialManager::getHomogeneousMaterial("Particle", 6e-4, 2e-8);
+//    Layer air_layer;
+//    air_layer.setMaterial(*mAir);
+//    Layer substrate_layer;
+//    substrate_layer.setMaterial(*mSubstrate);
+//    ParticleLayout particle_layout( new Particle(*mParticle, FormFactorCylinder(5*Units::nanometer, 5*Units::nanometer)));
+//    particle_layout.addInterferenceFunction(new InterferenceFunctionNone());
+//    air_layer.setLayout(particle_layout);
+
+//    p_multi_layer->addLayer(air_layer);
+//    p_multi_layer->addLayer(substrate_layer);
+//    return p_multi_layer;
+//}
 
 
 void MainWindow::initJobQueueModel()
@@ -256,28 +237,24 @@ void MainWindow::initSessionModel()
     multilayer->setItemName("MultiLayer1");
 
     ParameterizedItem *layer = m_sessionModel->insertNewItem("Layer", m_sessionModel->indexOfItem(multilayer));
+    layer->setMaterialProperty(MaterialEditor::getMaterialProperty("Air"));
 
     ParameterizedItem *layout = m_sessionModel->insertNewItem("ParticleLayout",
                    m_sessionModel->indexOfItem(layer));
 
     ParameterizedItem *particle1 = m_sessionModel->insertNewItem("Particle", m_sessionModel->indexOfItem(layout));
     particle1->addFormFactorProperty("Form Factor", "Cylinder");
+    particle1->setMaterialProperty(MaterialEditor::getMaterialProperty("Particle"));
 
     ParameterizedItem *particle2 = m_sessionModel->insertNewItem("Particle", m_sessionModel->indexOfItem(layout));
     particle2->addFormFactorProperty("Form Factor", "Prism3");
+    particle2->setMaterialProperty(MaterialEditor::getMaterialProperty("Particle"));
 
-    m_sessionModel->insertNewItem("Layer",
+    ParameterizedItem *substrate = m_sessionModel->insertNewItem("Layer",
                    m_sessionModel->indexOfItem(multilayer));
+    substrate->setMaterialProperty(MaterialEditor::getMaterialProperty("Substrate"));
 
 
-    qDebug() << "";
-    qDebug() << "MainWindow::initSessionModel() ---> TransformToDomain";
-    DomainObjectBuilder builder;
-    builder.buildItem(*multilayer);
-
-    MultiLayer *dml = dynamic_cast<MultiLayer *>(builder.getSample());
-    dml->printSampleTree();
-
 }
 
 
@@ -299,3 +276,35 @@ void MainWindow::initMaterialModel()
     m_materialEditor = new MaterialEditor(m_materialModel);
 }
 
+
+void MainWindow::updateSimModel()
+{
+    Q_ASSERT(mp_sim_data_model);
+    Q_ASSERT(m_sessionModel);
+
+    qDebug() << " ";
+    qDebug() << "MainWindow::updateSimModel()" << m_sessionModel->rowCount( QModelIndex() );
+
+    mp_sim_data_model->clear();
+
+    QModelIndex parentIndex;
+    for( int i_row = 0; i_row < m_sessionModel->rowCount( parentIndex); ++i_row) {
+         QModelIndex itemIndex = m_sessionModel->index( i_row, 0, parentIndex );
+
+         if (ParameterizedItem *item = m_sessionModel->itemForIndex(itemIndex)){
+             qDebug() << item->itemName() << item->modelType();
+             if(item->modelType() == "MultiLayer") {
+                 DomainObjectBuilder builder;
+                 builder.buildItem(*item);
+                 MultiLayer *multilayer = dynamic_cast<MultiLayer *>(builder.getSample());
+                 multilayer->printSampleTree();
+                 if(multilayer) {
+                     mp_sim_data_model->addSample(item->itemName(), multilayer->clone());
+                 }
+             }
+         }
+    }
+
+    mp_sim_data_model->addInstrument(tr("Default GISAS"), createDefaultInstrument());
+}
+
diff --git a/GUI/coregui/mainwindow/mainwindow.h b/GUI/coregui/mainwindow/mainwindow.h
index 344f22956d1..7bee941f2fd 100644
--- a/GUI/coregui/mainwindow/mainwindow.h
+++ b/GUI/coregui/mainwindow/mainwindow.h
@@ -33,12 +33,13 @@ class MaterialModel;
 class MaterialEditor;
 
 
-//class MainWindow : public QMainWindow
 class MainWindow : public Manhattan::FancyMainWindow
 {
     Q_OBJECT
     
 public:
+    enum TabViewId { WelcomeTab, InstrumentTab, SampleTab, SimulationTab, JobTab};
+
     explicit MainWindow(QWidget *parent = 0);
     ~MainWindow();
 
@@ -46,17 +47,16 @@ public:
     MaterialModel *getMaterialModel() { return m_materialModel; }
     SessionModel *getSessionModel() { return m_sessionModel; }
     JobQueueModel *getJobQueueModel() { return m_jobQueueModel; }
-
     Manhattan::ProgressBar *getProgressBar() { return m_progressBar; }
+    QSettings *getSettings() const { return m_settings; }
+    ActionManager *getActionManager() { return m_actionManager; }
+    ProjectManager *getProjectManager() { return m_projectManager; }
 
 public slots:
     void onChangeTabWidget(int index);
     void openRecentProject();
     void readSettings();
     void writeSettings();
-    QSettings *getSettings() const;
-    ActionManager *getActionManager() { return m_actionManager; }
-    ProjectManager *getProjectManager() { return m_projectManager; }
 
 protected:
     virtual void closeEvent(QCloseEvent *event);
@@ -88,10 +88,11 @@ private:
     void initSessionModel();
     void initMaterialModel();
 
+    void updateSimModel();
+
     // dummy instrument creator
     Instrument *createDefaultInstrument();
-    ISample *createDefaultSample();
-
+//    ISample *createDefaultSample();
 };
 
 #endif // MAINWINDOW_H
-- 
GitLab