diff --git a/src/plugins/simulation/SimulationExperimentView/i18n/SimulationExperimentView_fr.ts b/src/plugins/simulation/SimulationExperimentView/i18n/SimulationExperimentView_fr.ts index 42d294bf5f..9bd336e708 100644 --- a/src/plugins/simulation/SimulationExperimentView/i18n/SimulationExperimentView_fr.ts +++ b/src/plugins/simulation/SimulationExperimentView/i18n/SimulationExperimentView_fr.ts @@ -671,5 +671,9 @@ unable to get the simulation's runtime incapable d'obtenir le modèle d'exécution de la simulation + + unable to close the simulation + incapable de fermer la simulation + diff --git a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.cpp b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.cpp index 3effbdc2b7..516e4a5d94 100644 --- a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.cpp +++ b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.cpp @@ -22,13 +22,10 @@ along with this program. If not, see . //============================================================================== #include "centralwidget.h" -#include "coreguiutils.h" -#include "file.h" #include "pythonqtsupport.h" #include "simulation.h" #include "simulationexperimentviewplugin.h" #include "simulationexperimentviewpythonwrapper.h" -#include "simulationexperimentviewsimulationwidget.h" #include "simulationexperimentviewwidget.h" //============================================================================== @@ -38,42 +35,40 @@ along with this program. If not, see . //============================================================================== namespace OpenCOR { - -//============================================================================== - -namespace SimulationSupport { - class Simulation; -} // namespace SimulationSupport - -//============================================================================== - namespace SimulationExperimentView { //============================================================================== -static PyObject *getSimulation(const QString &pFileName, - SimulationExperimentViewWidget *pSimulationExperimentViewWidget) +static PyObject * simulation(const QString &pFileName, + SimulationExperimentViewWidget *pSimulationExperimentViewWidget) { + // Return the simualtion, should there be one, for the given file using the + // given Simulation Experiment view widget + SimulationSupport::Simulation *simulation = pSimulationExperimentViewWidget->simulation(pFileName); if (simulation != nullptr) { if (simulation->runtime() == nullptr) { - // The simulation is missing a runtime so raise a Python exception + // The simulation is missing a runtime, so raise a Python exception PyErr_SetString(PyExc_ValueError, qPrintable(QObject::tr("unable to get the simulation's runtime"))); return nullptr; } - // Let the simulation's widget know when we start running - // Note: connect is also in the PythonQt namespace + + // Let the Simulation Experiment view widget know when we start running + // a simulation QObject::connect(simulation, &SimulationSupport::Simulation::runStarting, pSimulationExperimentViewWidget, &SimulationExperimentViewWidget::startingRun); - // Use the simulation's widget to clear our data + // Let the Simulation Experiment view widget know when we want to clear + // simulation results QObject::connect(simulation, &SimulationSupport::Simulation::clearResults, - pSimulationExperimentViewWidget, &SimulationExperimentViewWidget::clearResults); + pSimulationExperimentViewWidget, &SimulationExperimentViewWidget::clearSimulationResults); + + // Return our simulation wrapped into a Python object return PythonQt::priv()->wrapQObject(simulation); } @@ -85,14 +80,36 @@ static PyObject *getSimulation(const QString &pFileName, //============================================================================== -static PyObject *initializeSimulation(const QString &pFileName) +static PyObject * simulation(PyObject *pSelf, PyObject *pArgs) +{ + Q_UNUSED(pSelf) + Q_UNUSED(pArgs) + + // Return the current simulation + + SimulationExperimentViewWidget *simulationExperimentViewWidget = SimulationExperimentViewPlugin::instance()->viewWidget(); + + if (simulationExperimentViewWidget != nullptr) { + return simulation(Core::centralWidget()->currentFileName(), simulationExperimentViewWidget); + } + +#include "pythonbegin.h" + Py_RETURN_NONE; +#include "pythonend.h" +} + +//============================================================================== + +static PyObject * initializeSimulation(const QString &pFileName) { + // Initialise a simulation for the given file name + SimulationExperimentViewWidget *simulationExperimentViewWidget = SimulationExperimentViewPlugin::instance()->viewWidget(); if (simulationExperimentViewWidget != nullptr) { simulationExperimentViewWidget->initialize(pFileName); - return getSimulation(pFileName, simulationExperimentViewWidget); + return simulation(pFileName, simulationExperimentViewWidget); } #include "pythonbegin.h" @@ -102,20 +119,27 @@ static PyObject *initializeSimulation(const QString &pFileName) //============================================================================== -static PyObject *openSimulation(PyObject *self, PyObject *args) +static PyObject * openSimulation(PyObject *pSelf, PyObject *pArgs) { - Q_UNUSED(self) + Q_UNUSED(pSelf) + + // Open a simulation PyObject *bytes; - char *name; - Py_ssize_t len; - if (PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter, &bytes) == 0) { // NOLINT(cppcoreguidelines-pro-type-vararg) + + if (PyArg_ParseTuple(pArgs, "O&", PyUnicode_FSConverter, &bytes) == 0) { // NOLINT(cppcoreguidelines-pro-type-vararg) #include "pythonbegin.h" Py_RETURN_NONE; #include "pythonend.h" } + + char *name; + Py_ssize_t len; + PyBytes_AsStringAndSize(bytes, &name, &len); + QString fileName = QString::fromUtf8(name, int(len)); + #include "pythonbegin.h" Py_DECREF(bytes); #include "pythonend.h" @@ -135,20 +159,27 @@ static PyObject *openSimulation(PyObject *self, PyObject *args) //============================================================================== -static PyObject *openRemoteSimulation(PyObject *self, PyObject *args) +static PyObject * openRemoteSimulation(PyObject *pSelf, PyObject *pArgs) { - Q_UNUSED(self) + Q_UNUSED(pSelf) + + // Open a remote simulation PyObject *bytes; - char *name; - Py_ssize_t len; - if (PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter, &bytes) == 0) { // NOLINT(cppcoreguidelines-pro-type-vararg) + + if (PyArg_ParseTuple(pArgs, "O&", PyUnicode_FSConverter, &bytes) == 0) { // NOLINT(cppcoreguidelines-pro-type-vararg) #include "pythonbegin.h" Py_RETURN_NONE; #include "pythonend.h" } + + char *name; + Py_ssize_t len; + PyBytes_AsStringAndSize(bytes, &name, &len); + QString url = QString::fromUtf8(name, int(len)); + #include "pythonbegin.h" Py_DECREF(bytes); #include "pythonend.h" @@ -166,23 +197,25 @@ static PyObject *openRemoteSimulation(PyObject *self, PyObject *args) //============================================================================== -static PyObject *closeSimulation(PyObject *self, PyObject *args) +static PyObject * closeSimulation(PyObject *pSelf, PyObject *pArgs) { - Q_UNUSED(self) + Q_UNUSED(pSelf) - if (PyTuple_Size(args) > 0) { + // Close a simulation + + if (PyTuple_Size(pArgs) > 0) { #include "pythonbegin.h" - PythonQtInstanceWrapper *wrappedSimulation = PythonQtSupport::getInstanceWrapper(PyTuple_GET_ITEM(args, 0)); // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) + PythonQtInstanceWrapper *wrappedSimulation = PythonQtSupport::getInstanceWrapper(PyTuple_GET_ITEM(pArgs, 0)); // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) #include "pythonend.h" if (wrappedSimulation != nullptr) { auto simulation = static_cast(wrappedSimulation->_objPointerCopy); - // Close the simulation by closing its file, raising an exception if we - // are unable to do so + // Close the simulation by closing its file, raising an exception if + // we were unable to do so if (!Core::centralWidget()->closeFile(simulation->fileName())) { - PyErr_SetString(PyExc_IOError, "unable to close file"); + PyErr_SetString(PyExc_IOError, qPrintable(QObject::tr("unable to close the simulation"))); return nullptr; } @@ -196,30 +229,14 @@ static PyObject *closeSimulation(PyObject *self, PyObject *args) //============================================================================== -static PyObject *OpenCOR_simulation(PyObject *self, PyObject *args) -{ - Q_UNUSED(self) - Q_UNUSED(args) - - SimulationExperimentViewWidget *simulationExperimentViewWidget = SimulationExperimentViewPlugin::instance()->viewWidget(); - - if (simulationExperimentViewWidget != nullptr) { - return getSimulation(Core::centralWidget()->currentFileName(), simulationExperimentViewWidget); - } - -#include "pythonbegin.h" - Py_RETURN_NONE; -#include "pythonend.h" -} - -//============================================================================== - -SimulationExperimentViewPythonWrapper::SimulationExperimentViewPythonWrapper(PyObject *pModule, QObject *pParent) : QObject(pParent) +SimulationExperimentViewPythonWrapper::SimulationExperimentViewPythonWrapper(PyObject *pModule, + QObject *pParent) : + QObject(pParent) { // Add some Python wrappers static std::array PythonSimulationExperimentViewMethods = {{ - { "simulation", OpenCOR_simulation, METH_VARARGS, "Current simulation." }, + { "simulation", simulation, METH_VARARGS, "Current simulation." }, { "openSimulation", openSimulation, METH_VARARGS, "Open a simulation." }, { "openRemoteSimulation", openRemoteSimulation, METH_VARARGS, "Open a remote simulation." }, { "closeSimulation", closeSimulation, METH_VARARGS, "Close a simulation." }, diff --git a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.h b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.h index 752e74ee0f..defdb42079 100644 --- a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.h +++ b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewpythonwrapper.h @@ -36,9 +36,6 @@ along with this program. If not, see . //============================================================================== namespace OpenCOR { - -//============================================================================== - namespace SimulationExperimentView { //============================================================================== @@ -49,7 +46,7 @@ class SimulationExperimentViewPythonWrapper : public QObject public: explicit SimulationExperimentViewPythonWrapper(PyObject *pModule, - QObject *pParent = nullptr); + QObject *pParent); }; //============================================================================== diff --git a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewsimulationwidget.cpp b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewsimulationwidget.cpp index 70da96495c..ba63af5cd2 100644 --- a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewsimulationwidget.cpp +++ b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewsimulationwidget.cpp @@ -1396,14 +1396,9 @@ void SimulationExperimentViewSimulationWidget::runPauseResumeSimulation() mSimulation->resume(); } else { // Try to allocate all the memory we need by adding a run to our - // simulation + // simulation and, if successful, run our simulation - bool runSimulation = mSimulation->addRun(); - - // Run our simulation (after having added a run to our graphs), in - // case we were able to allocate all the memory we need - - if (runSimulation) { + if (mSimulation->addRun()) { mViewWidget->checkSimulationResults(mSimulation->fileName(), Task::AddRun); mSimulation->run(); diff --git a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.cpp b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.cpp index b400287741..0658e8ca52 100644 --- a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.cpp +++ b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.cpp @@ -495,21 +495,6 @@ QWidget * SimulationExperimentViewWidget::widget(const QString &pFileName) //============================================================================== -void SimulationExperimentViewWidget::clearResults(const QString &pFileName) -{ - // Clear our simulation data - - SimulationExperimentViewSimulationWidget *simulationWidget = mSimulationWidgets.value(pFileName); - - if (simulationWidget != nullptr) { - return; - } - - simulationWidget->clearSimulationResults(); -} - -//============================================================================== - quint64 SimulationExperimentViewWidget::simulationResultsSize(const QString &pFileName) const { // Return the results size for the given file name @@ -592,11 +577,29 @@ void SimulationExperimentViewWidget::checkSimulationResults(const QString &pFile void SimulationExperimentViewWidget::startingRun(const QString &pFileName) { + // A run is starting for the given file name (after having added a run), so + // check its simulation results + checkSimulationResults(pFileName, SimulationExperimentViewSimulationWidget::Task::AddRun); } //============================================================================== +void SimulationExperimentViewWidget::clearSimulationResults(const QString &pFileName) +{ + // Clear the simulation results for the given file name + + SimulationExperimentViewSimulationWidget *simulationWidget = mSimulationWidgets.value(pFileName); + + if (simulationWidget != nullptr) { + return; + } + + simulationWidget->clearSimulationResults(); +} + +//============================================================================== + void SimulationExperimentViewWidget::simulationWidgetSplitterMoved(const QIntList &pSizes) { // The splitter of our simulation widget has moved, so keep track of its new diff --git a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.h b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.h index 2ecccbe87e..1af1225dd8 100644 --- a/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.h +++ b/src/plugins/simulation/SimulationExperimentView/src/simulationexperimentviewwidget.h @@ -132,8 +132,8 @@ class SimulationExperimentViewWidget : public Core::ViewWidget void updateContentsInformationGui(SimulationExperimentViewSimulationWidget *pSimulationWidget); public slots: - void clearResults(const QString &pFileName); void startingRun(const QString &pFileName); + void clearSimulationResults(const QString &pFileName); private slots: void simulationWidgetSplitterMoved(const QIntList &pSizes); diff --git a/src/plugins/support/SimulationSupport/src/simulation.h b/src/plugins/support/SimulationSupport/src/simulation.h index 4ba145d214..c4ee48a623 100644 --- a/src/plugins/support/SimulationSupport/src/simulation.h +++ b/src/plugins/support/SimulationSupport/src/simulation.h @@ -405,8 +405,8 @@ class SIMULATIONSUPPORT_EXPORT Simulation : public QObject bool simulationSettingsOk(bool pEmitSignal = true); signals: - void clearResults(const QString &pFileName); void runStarting(const QString &pFileName); + void clearResults(const QString &pFileName); void running(bool pIsResuming); void paused(); diff --git a/src/plugins/support/SimulationSupport/src/simulationsupportpythonwrapper.cpp b/src/plugins/support/SimulationSupport/src/simulationsupportpythonwrapper.cpp index eaa856e83c..568a8a582c 100644 --- a/src/plugins/support/SimulationSupport/src/simulationsupportpythonwrapper.cpp +++ b/src/plugins/support/SimulationSupport/src/simulationsupportpythonwrapper.cpp @@ -441,20 +441,15 @@ bool SimulationSupportPythonWrapper::run(Simulation *pSimulation) mErrorMessage = QString(); - // Try to allocate all the memory we need by adding a run to our - // simulation + // Try to allocate all the memory we need by adding a run to our simulation + // and, if successful, run our simulation - bool runSimulation = pSimulation->addRun(); - - // Run our simulation (after having added a run to our graphs), in - // case we were able to allocate all the memory we need - - if (runSimulation) { + if (pSimulation->addRun()) { // Save the keyboard focus, which will be to our IPython console focusWidget = QApplication::focusWidget(); - // Let the simulation widget know we are starting + // Let people know that we are starting our run emit pSimulation->runStarting(pSimulation->fileName());