Rev 779 | Rev 837 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | |||
671 | werner | 2 | /******************************************************************************************** |
3 | ** iLand - an individual based forest landscape and disturbance model |
||
4 | ** http://iland.boku.ac.at |
||
5 | ** Copyright (C) 2009- Werner Rammer, Rupert Seidl |
||
6 | ** |
||
7 | ** This program is free software: you can redistribute it and/or modify |
||
8 | ** it under the terms of the GNU General Public License as published by |
||
9 | ** the Free Software Foundation, either version 3 of the License, or |
||
10 | ** (at your option) any later version. |
||
11 | ** |
||
12 | ** This program is distributed in the hope that it will be useful, |
||
13 | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
14 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
15 | ** GNU General Public License for more details. |
||
16 | ** |
||
17 | ** You should have received a copy of the GNU General Public License |
||
18 | ** along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
19 | ********************************************************************************************/ |
||
20 | |||
105 | Werner | 21 | #ifndef MODELCONTROLLER_H |
22 | #define MODELCONTROLLER_H |
||
128 | Werner | 23 | #include <QObject> |
514 | werner | 24 | #include <QHash> |
642 | werner | 25 | #include "grid.h" |
646 | werner | 26 | #include "layeredgrid.h" |
128 | Werner | 27 | class Model; |
590 | werner | 28 | class MainWindow; |
596 | werner | 29 | class MapGrid; |
30 | |||
128 | Werner | 31 | class ModelController: public QObject |
105 | Werner | 32 | { |
128 | Werner | 33 | Q_OBJECT |
105 | Werner | 34 | public: |
35 | ModelController(); |
||
128 | Werner | 36 | ~ModelController(); |
590 | werner | 37 | void setMainWindow(MainWindow *mw) { mViewerWindow = mw; } |
38 | void connectSignals(); // connect signal/slots to the main window if available |
||
128 | Werner | 39 | Model *model() const { return mModel; } |
40 | // bool checkers... |
||
145 | Werner | 41 | bool canCreate(); ///< return true if the model can be created (settings loaded and model does not exist) |
42 | bool canDestroy(); ///< model may be destroyed |
||
43 | bool canRun(); ///< model may be run |
||
161 | werner | 44 | bool isRunning(); ///< model is running |
225 | werner | 45 | bool isFinished(); ///< returns true if there is a valid model state, but the run is finished |
776 | werner | 46 | bool isPaused(); ///< returns true if the model is currently paused |
632 | werner | 47 | // simulation length |
497 | werner | 48 | int currentYear() const; ///< return current year of the model |
498 | werner | 49 | int totalYears() const { return mYearsToRun; } ///< returns total number of years to simulate |
632 | werner | 50 | // error handling |
51 | void throwError(const QString msg); |
||
161 | werner | 52 | // dynamic outputs (variable fields) |
802 | werner | 53 | void setDynamicOutputEnabled(bool enabled) { mDynamicOutputEnabled = enabled; } |
161 | werner | 54 | void setupDynamicOutput(QString fieldList); |
55 | QString dynamicOutput(); |
||
514 | werner | 56 | // some informational services |
57 | QHash<QString, QString> availableSpecies(); |
||
58 | |||
590 | werner | 59 | void saveScreenshot(QString file_name); ///< saves a screenshot of the central view widget to 'file_name' |
649 | werner | 60 | void addGrid(const FloatGrid *grid, const QString &name, const GridViewType view_type, double min_value, double max_value); |
596 | werner | 61 | void paintMap(MapGrid *map, double min_value, double max_value); |
646 | werner | 62 | |
647 | werner | 63 | void addLayers(const LayeredGridBase *layers, const QString &name); |
634 | werner | 64 | void setViewport(QPointF center_point, double scale_px_per_m); |
222 | werner | 65 | signals: |
776 | werner | 66 | void finished(QString errorMessage); ///< model has finished run (errorMessage is empty in case of success) |
67 | void year(int year); ///< signal indicating a year of the simulation has been processed |
||
68 | void bufferLogs(bool do_buffer); ///< signal indicating that logs should be buffered (true, model run mode) or that buffering should stop (false) for "interactive" mode |
||
69 | void stateChanged(); ///< is emitted when model started/stopped/paused |
||
128 | Werner | 70 | public slots: |
71 | void setFileName(QString initFileName); ///< set project file name |
||
72 | void create(); ///< create the model |
||
73 | void destroy(); ///< delete the model |
||
222 | werner | 74 | void run(int years); ///< run the model |
223 | werner | 75 | bool runYear(); ///< runs a single time step |
222 | werner | 76 | bool pause(); ///< pause execution, and if paused, continue to run. returns state *after* change, i.e. true=now in paused mode |
776 | werner | 77 | bool continueRun(); ///< continues execution if simulation was paused |
222 | werner | 78 | void cancel(); ///< cancel execution of the model |
652 | werner | 79 | void repaint(); ///< force a repaint of the main drawing window |
223 | werner | 80 | private slots: |
81 | void runloop(); |
||
128 | Werner | 82 | private: |
776 | werner | 83 | bool internalRun(); ///< runs the main loop |
84 | void internalStop(); ///< save outputs, stop the model execution |
||
802 | werner | 85 | void fetchDynamicOutput(); ///< execute the dynamic output and fetch data |
590 | werner | 86 | MainWindow *mViewerWindow; |
128 | Werner | 87 | Model *mModel; |
223 | werner | 88 | bool mPaused; |
225 | werner | 89 | bool mRunning; |
90 | bool mFinished; |
||
91 | bool mCanceled; |
||
223 | werner | 92 | int mYearsToRun; |
128 | Werner | 93 | QString mInitFile; |
802 | werner | 94 | bool mDynamicOutputEnabled; |
161 | werner | 95 | QStringList mDynFieldList; |
96 | QStringList mDynData; |
||
97 | |||
105 | Werner | 98 | }; |
99 | |||
100 | #endif // MODELCONTROLLER_H |