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