23 #include "stringKeyMap.h" 29 #include "dimension.h" 49 #include "stringKeyMap.h" 62 using classdesc::shared_ptr;
66 struct CallableFunction;
67 class VariableInstanceList;
78 enum StateFlags {is_edited=1, reset_needed=2, fullEqnDisplay_needed=4};
79 int flags=reset_needed;
82 static constexpr std::chrono::milliseconds resetNowThreshold{500};
85 static constexpr std::chrono::milliseconds resetPostponedThreshold{1500};
86 std::chrono::time_point<std::chrono::system_clock> resetAt=std::chrono::time_point<std::chrono::system_clock>::max();
90 int busyCursorStack=0;
125 std::string diagnoseNonFinite()
const;
128 void logVariables()
const;
132 bool m_multipleEquities=
false;
135 void balanceColumns(
const GodleyIcon& srcGodley,
int srcCol,
GodleyIcon& destGodley,
int destCol)
const;
148 if (canvas.item && i<publicationTabs.size())
149 publicationTabs[i].items.emplace_back(canvas.item);
154 bool multipleEquities(
const bool& m);
157 bool edited()
const {
return flags & is_edited;}
162 flags |= is_edited | fullEqnDisplay_needed;
163 if (!running) flags|=reset_needed;
164 variablePane.update();
165 canvas.requestRedraw();
166 canvas.model.updateTimestamp();
170 void requestRedraw();
175 if (!flagStack.empty()) {
176 flags=flagStack.back();
177 flagStack.pop_back();
195 void populateMissingDimensions();
198 void populateMissingDimensionsFromVariable(
const VariableValue&,
bool& incompatibleMessageDisplayed);
200 {
bool dummy; populateMissingDimensionsFromVariable(v,dummy);}
201 void renameDimension(
const std::string& oldName,
const std::string& newName);
221 void importDuplicateColumn(
GodleyTable& srcTable,
int srcCol);
224 void balanceDuplicateColumns(
const GodleyIcon& srcTable,
int srcCol);
226 std::vector<std::string> allGodleyFlowVars()
const;
230 equationDisplay(*this) {
231 lastRedraw=boost::posix_time::microsec_clock::local_time();
232 model->iHeight(std::numeric_limits<float>::max());
233 model->iWidth(std::numeric_limits<float>::max());
235 publicationTabs.emplace_back(
"Publication");
240 Exclude<std::map<std::string, std::shared_ptr<CallableFunction>>>
userFunctions;
245 void clearAllMaps(
bool clearHistory);
253 static void saveGroupAsFile(
const Group&,
const string& fileName);
255 {
if (
auto g=dynamic_cast<Group*>(canvas.item.get())) saveGroupAsFile(*g,fileName);}
270 void insertGroupFromFile(
const string& file);
272 void makeVariablesConsistent();
274 void imposeDimensions();
277 void garbageCollect();
281 bool cycleCheck()
const;
285 void openLogFile(
const string&);
295 void constructEquations();
297 void dimensionalAnalysis()
const;
299 void deleteAllUnits();
304 bool checkEquationOrder()
const;
310 std::vector<double> step();
313 void save(
const std::string& filename);
316 void load(
const std::string& filename);
318 static void exportSchema(
const std::string& filename,
int schemaLevel=1);
321 void displayErrorItem(
const Item&
op)
const;
326 if (ravelCAPI::Ravel::available())
328 int d=ravelCAPI::Ravel::daysUntilExpired();
329 return ravelCAPI::Ravel::version() +
": "+((d>=0)?(
"Expires in "+std::to_string(d)+
" day"+(d!=1?
"s":
"")):
"Expired");
331 else return "unavailable";
334 static bool ravelExpired() {
return ravelCAPI::available() && ravelCAPI::daysUntilExpired()<0;}
339 unsigned maxHistory{100};
343 std::string
autoSaveFile()
const {
return autoSaver? autoSaver->fileName: std::string();}
346 void setAutoSaveFile(
const std::string& file);
360 bool commandHook(
const std::string& command,
unsigned nargs);
370 bool doPushHistory=
true;
374 long undo(
int changes=1);
385 bool inputWired(
const std::string& name)
const {
return definingVar(name).get();}
401 {canvas.renderToPNGCropped(filename,z);}
407 void renderAllPlotsAsSVG(
const string& prefix)
const;
409 void exportAllPlotsAsCSV(
const string& prefix)
const;
412 void setAllDEmode(
bool);
414 void srand(
int seed) {::srand(seed);}
417 bool displayValues=
false;
424 void importVensim(
const std::string&);
427 void redrawAllGodleyTables();
433 virtual void progress(
const std::string& title,
int) {}
453 static std::size_t physicalMem();
458 PangoFontFamily **families;
460 pango_font_map_list_families(pango_cairo_font_map_get_default(),
462 for (
int i=0; i<num; ++i)
463 r.push_back(pango_font_family_get_name(families[i]));
465 std::sort(r.begin(),r.end());
471 static std::string defaultFont();
472 static std::string defaultFont(
const std::string& x);
476 static double fontScale();
477 static double fontScale(
double);
483 void latex(
const std::string& filename,
bool wrapLaTeXLines);
485 void matlab(
const std::string& filename) {
486 if (cycleCheck())
throw error(
"cyclic network detected");
487 ofstream
f(filename);
495 static std::vector<std::string> availableOperations();
500 static std::vector<std::string> variableTypes();
502 static std::vector<std::string> assetClasses();
506 void openGroupInCanvas() {canvas.openGroupInCanvas(canvas.item);}
513 void listAllInstances();
521 {
return checkMemAllocation(std::numeric_limits<size_t>::max());}
526 char getc()
const {
return std::getc(stdin);}
529 void setDefinition(
const std::string&
valueId,
const std::string& definition);
532 void reloadAllCSVParameters();
551 #pragma omit pack minsky::MinskyExclude 552 #pragma omit unpack minsky::MinskyExclude 553 #pragma omit TCL_obj minsky::MinskyExclude 554 #pragma omit xml_pack minsky::MinskyExclude 555 #pragma omit xml_unpack minsky::MinskyExclude 556 #pragma omit xsd_generate minsky::MinskyExclude 558 #pragma omit xml_pack minsky::Integral 559 #pragma omit xml_unpack minsky::Integral 561 #pragma omit pack minsky::MinskyMatrix 562 #pragma omit unpack minsky::MinskyMatrix 563 #pragma omit xml_pack minsky::MinskyMatrix 564 #pragma omit xml_unpack minsky::MinskyMatrix 565 #pragma omit xsd_generate minsky::MinskyMatrix virtual void message(const std::string &)
display a message in a popup box on the GUI
static SVGRenderer svgRenderer
std::set< RenderNativeWindow * > nativeWindowsToRedraw
record nativeWindows that have requested redrawing
PannableTab< EquationDisplay > equationDisplay
void matlab(const std::string &filename)
std::string latexToPango(const char *s)
string latex2pango(const std::string &x)
void pushFlags()
push and pop state of the flags
void setGodleyIconResource(const string &s)
vector< string > listFonts() const
char getc() const
Used to implement a pause until return pressed for attaching debugger purposes.
virtual void setBusyCursor()
set/clear busy cursor in GUI
static bool ravelExpired()
std::set< string > logVarList
set of variables (valueIds) to log
Clipboard clipboard
clipboard manager
virtual void clearBusyCursor()
MinskyExclude & operator=(const MinskyExclude &)
void closeLogFile()
closes log file
bool inputWired(const std::string &name) const
returns true if any variable of name name has a wired input
VariableValues variableValues
virtual void runItemDeletedCallback(const Item &)
run callback attached to item
std::vector< int > flagStack
std::map< Units, double > maxValue
stash the maximum absolute value obtained by a dimensioned quantity
void checkPushHistory()
called periodically to ensure history up to date
virtual MemCheckResult checkMemAllocation(size_t bytes) const
MemCheckResult
check whether to proceed or abort, given a request to allocate bytes of memory. Implemented in Minsky...
bool edited() const
reflects whether the model has been changed since last save
std::map< Units, double > maxFlowValue
void renderCanvasToEMF(const std::string &filename)
render canvas to a EMF image file (Windows only)
void setResource(const std::string &resource)
initialise object from an SVG file
void addNewPublicationTab(const std::string &name)
static SVGRenderer svgRenderer
SVG icon to display when not in editor mode.
static int daysUntilRavelExpires()
bool loggingEnabled() const
returns true if logging is in operation
void setLockIconResource(const string &locked, const string &unlocked)
void nameCurrentItem(const std::string &name)
string valueId(const string &name)
construct a valueId from fully qualified name @ name should not be canonicalised
void renderCanvasToSVG(const std::string &filename)
render canvas to an SVG file
bool resetIfFlagged() override
checks whether a reset is required, and resets the simulation if so
bool clipboardEmpty() const
return true if nothing available in clipboard
void markEdited()
indicate model has been changed since last saved
void renderCanvasToPS(const std::string &filename)
render canvas to a postscript file
static bool ravelAvailable()
virtual CmdData getCommandData(const std::string &command) const
return meta information on a given command
bool reset_flag() const
true if reset needs to be called prior to numerical integration
VariablePane variablePane
static OperationType::Group classifyOp(OperationType::Type o)
classdesc::StringKeyMap< std::vector< OperationType::Type > > AvailableOperationsMapping
static SVGRenderer svgRenderer
SVG icon to display when not in editor mode.
void populateMissingDimensionsFromVariable(const VariableValue &v)
std::string autoSaveFile() const
name of an auto save file
bool triggerCheckMemAllocationCallback() const
trigger checkMem callback for testing purposes
std::deque< classdesc::pack_t > history
save history of model for undo
void renderCanvasToPNG(const std::string &filename)
render canvas to a PNG image file
Exclude< ptime > lastRedraw
static SVGRenderer lockedIcon
An RAII wrapper around jtanx's libclipboard (https://github.com/jtanx/libclipboard) ...
static std::string ravelVersion()
void setRavelIconResource(const string &s)
std::vector< PubTab > publicationTabs
Mixin implementing common panning functionality in tabs.
virtual void bookmarkRefresh()
refresh the bookmark menu after changes
shared_ptr< ofstream > outputDataFile
#define CLASSDESC_ACCESS(type)
std::shared_ptr< VariableInstanceList > variableInstanceList
supports navigation to all instances of current variable
void addCanvasItemToPublicationTab(size_t i)
const Minsky & cminsky()
const version to help in const correctness
ostream & matlab(ostream &) const
render as MatLab code create equations suitable for Runge-Kutta solver
bool multipleEquities() const
SVGRenderer histogramResource
void setGroupIconResource(const string &s)
static const std::string minskyVersion
void saveCanvasItemAsFile(const string &fileName) const
Exclude< std::map< std::string, std::shared_ptr< CallableFunction > > > userFunctions
virtual void resetScroll()
reset main window scroll bars after model has been panned
static SVGRenderer unlockedIcon
virtual void progress(const std::string &title, int)
set progress bar, out of 100, labelling the progress bar with title
std::map< std::string, std::weak_ptr< Item > > namedItems
void openModelInCanvas()
reinitialises canvas to the toplevel group
MinskyExclude(const MinskyExclude &)
std::shared_ptr< Group > GroupPtr
void itemFromNamedItem(const std::string &name)
PhillipsDiagram phillipsDiagram
RAII set the minsky object to a different one for the current scope.
string latex(double)
convert double to a LaTeX string representing that value
void renderCanvasToPDF(const std::string &filename)
render canvas to a PDF file
Minsky & minsky()
global minsky object
void popFlags()
push and pop state of the flags
void srand(int seed)
set std library RNG seed
void saveSelectionAsFile(const string &fileName) const
static std::string ecolabVersion()
std::chrono::milliseconds resetDuration
void renderCanvasToPNG(const std::string &filename, const Canvas::ZoomCrop &z)
Render canvas to a PNG file filename, scaling the canvas temporarily by zoom, shifts it to left...
static Group classify(Type t)
std::string fileVersion
Minsky version file was saved under.
unique_ptr< BackgroundSaver > autoSaver
void clearHistory()
clear history