42 #define PYTHON_DEBUG true 44 #include <pybind11/include/pybind11/pybind11.h> 45 #include <pybind11/include/pybind11/embed.h> 46 #include <pybind11/include/pybind11/numpy.h> 49 #include "PyLogHook.h" 51 #include "PythonInterpreter.hh" 53 #include <QMetaObject> 54 #include <QMetaMethod> 56 #include "PythonTypeConversions.hh" 58 #include <OpenFlipper/BasePlugin/PythonFunctionsCore.hh> 62 static Core* core_ =
nullptr;
64 static pybind11::module mainModule_;
71 static PyObject* global_dict_clean_ =
nullptr;
74 void setCorePointer(
Core* _core ) {
80 if (interpreter_ ==
nullptr)
90 externalLogging_(true)
95 PythonInterpreter::~PythonInterpreter() {
101 return static_cast<bool>(mainModule_);
106 if (Py_IsInitialized() ) {
108 std::cerr <<
"Python already Initialized!" << std::endl;
114 std::cerr <<
"Initialize interpreter ... " ;
117 py::initialize_interpreter();
120 std::cerr <<
" Done" << std::endl;
121 std::cerr <<
"Initialize Threads ...";
124 PyEval_InitThreads();
127 std::cerr <<
" Done" << std::endl;
132 std::cerr <<
"Import __main__" ;
136 py::module main{ py::module::import(
"__main__") };
139 std::cerr <<
" Done" << std::endl;
140 std::cerr <<
"Redirect Outputs ...";
146 if ( OpenFlipper::Options::gui() ) {
147 tyti::pylog::redirect_stderr([
this](
const char*w) {this->
pyError(w); });
148 tyti::pylog::redirect_stdout([
this](
const char* w) {this->
pyOutput(w); });
152 std::cerr <<
" Done" << std::endl;
153 std::cerr <<
"Get __dict__ from main namespace ...";
159 py::object main_namespace = main.attr(
"__dict__");
162 std::cerr <<
" Done" << std::endl;
163 std::cerr <<
"Importing OpenFlipper core module ...";
166 py::module of_module(py::module::import(
"openflipper"));
167 main_namespace[
"openflipper"] = of_module;
170 std::cerr <<
" Done" << std::endl;
177 QStringList pythonPlugins = getPythonPlugins();
179 for (
int i = 0 ; i < pythonPlugins.size() ; ++i ) {
182 std::cerr <<
"Importing "+ pythonPlugins[i].toStdString() +
" module ...";
185 py::module om_module(py::module::import(pythonPlugins[i].toStdString().c_str()));
186 main_namespace[pythonPlugins[i].toStdString().c_str()] = om_module;
189 std::cerr <<
" Done" << std::endl;
194 std::cerr <<
"Copy dict ...";
197 global_dict_clean_ = PyDict_Copy(PyModule_GetDict(main.ptr()));
200 std::cerr <<
" Done" << std::endl;
201 std::cerr <<
"Set to validate state ...";
205 mainModule_ = std::move(main);
208 std::cerr <<
" Done" << std::endl;
209 std::cerr <<
"Save thread ...";
216 std::cerr <<
" Done" << std::endl;
229 PyGILState_STATE state = PyGILState_Ensure();
230 PyObject* dict = PyModule_GetDict(mainModule_.ptr());
232 PyDict_Update(dict, global_dict_clean_);
233 PyGILState_Release(state);
240 std::cerr <<
"runScript" << std::endl;
247 _script.prepend(
"core = openflipper.Core()\n");
249 QStringList pythonPlugins = getPythonPlugins();
251 for (
int i = 0 ; i < pythonPlugins.size() ; ++i ) {
252 QString
import = pythonPlugins[i].toLower() +
" = " + pythonPlugins[i] +
"." + pythonPlugins[i] +
"()\n";
253 _script.prepend(
import);
261 std::cerr <<
"Initialize Python" << std::endl;
267 std::cerr <<
"Done initializing Python" << std::endl;
270 catch (py::error_already_set &e)
276 PyGILState_STATE state = PyGILState_Ensure();
279 auto locals = mainModule_.attr(
"__dict__");
286 std::cerr <<
"Now executing script:" << std::endl;
287 std::cerr << _script.toStdString() << std::endl;
289 py::exec(_script.toStdString(), py::globals(), locals);
291 std::cerr <<
"Finished successfully" << std::endl;
293 catch (py::error_already_set &e)
299 catch (
const std::runtime_error &e)
302 pyOutput(
"Restarting Interpreter.");
305 state = PyGILState_Ensure();
308 PyGILState_Release(state);
316 externalLogging_ =
false;
318 externalLogging_ =
true;
319 return LogOut + LogErr;
326 if (externalLogging_) {
329 LogOut += QString::fromUtf8(w);
335 if (externalLogging_) {
336 if (OpenFlipper::Options::nogui()) {
337 std::cerr <<
"Python Error! " << w << std::endl;
342 LogErr += QString::fromUtf8(w);
349 PYBIND11_EMBEDDED_MODULE(openflipper, m) {
353 py::class_<Core,std::unique_ptr<Core, py::nodelete>> core(m,
"Core");
358 core.def(py::init([]() {
return core_; }));
360 core.def(
"updateView", &
Core::updateView, QCoreApplication::translate(
"PythonDocCore",
"Redraw the contents of the viewer.").toLatin1().data() );
361 core.def(
"blockScenegraphUpdates", &
Core::blockScenegraphUpdates, QCoreApplication::translate(
"PythonDocCore",
"Disable Scenegraph Updates (e.g. before loading or adding a large number of files)").toLatin1().data() );
362 core.def(
"updateUI", &
Core::updateUI, QCoreApplication::translate(
"PythonDocCore",
"Process events during script execution to keep the ui alive").toLatin1().data() );
363 core.def(
"clearAll", &
Core::clearAll, QCoreApplication::translate(
"PythonDocCore",
"Clear all data objects.").toLatin1().data() );
364 core.def(
"deleteObject", &
Core::deleteObject, QCoreApplication::translate(
"PythonDocCore",
"Delete an object from the scene.").toLatin1().data() ,
365 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to delete.").toLatin1().data() ) );
367 core.def(
"setObjectComment", &
Core::setObjectComment, QCoreApplication::translate(
"PythonDocCore",
"Add a comment to an object (saved e.g. in screenshot metadata).").toLatin1().data()) ,
368 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to add comment.").toLatin1().data()),
369 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Key value").toLatin1().data()),
370 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Actual comment").toLatin1().data());
372 core.def(
"clearObjectComment", &
Core::clearObjectComment, QCoreApplication::translate(
"PythonDocCore",
"Remove a comment from an object.").toLatin1().data()) ,
373 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to remove comment from.").toLatin1().data()),
374 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Key value to remove").toLatin1().data());
376 core.def(
"clearAllComments", &
Core::clearObjectComment, QCoreApplication::translate(
"PythonDocCore",
"Remove all comments from an object.").toLatin1().data()) ,
377 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to remove comments from.").toLatin1().data());
379 core.def(
"fullscreen", &
Core::fullscreen, QCoreApplication::translate(
"PythonDocCore",
"Enable or disable fullscreen mode.").toLatin1().data() ,
380 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Enable or disable?").toLatin1().data() ) );
382 core.def(
"showViewModeControls", &
Core::deleteObject, QCoreApplication::translate(
"PythonDocCore",
"Show or hide the view mode control box").toLatin1().data() ,
383 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Visible?").toLatin1().data() ) );
385 core.def(
"loggerState", &
Core::loggerState, QCoreApplication::translate(
"PythonDocCore",
"Change the logger window state").toLatin1().data() ,
386 py::arg( QCoreApplication::translate(
"PythonDocCore",
"0 = In Scene , 1 = Normal, 2 = Hidden").toLatin1().data() ) );
388 core.def(
"enableOpenMeshErrorLog", &
Core::enableOpenMeshErrorLog, QCoreApplication::translate(
"PythonDocCore",
"Enable or disable OpenMesh error logging").toLatin1().data() ,
389 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Enable or Disable").toLatin1().data() ) );
391 core.def(
"showToolbox", &
Core::showToolbox, QCoreApplication::translate(
"PythonDocCore",
"Show or hide toolbox").toLatin1().data() ,
392 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Visible?").toLatin1().data() ) );
394 core.def(
"showStatusBar", &
Core::showStatusBar, QCoreApplication::translate(
"PythonDocCore",
"Show or hide status bar").toLatin1().data() ,
395 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Visible?").toLatin1().data() ) );
397 core.def(
"multiViewMode", &
Core::multiViewMode, QCoreApplication::translate(
"PythonDocCore",
"Switch MultiView Mode").toLatin1().data() ,
398 py::arg( QCoreApplication::translate(
"PythonDocCore",
"0: One Viewer, 1: Double Viewer, 2: Grid, 3: Horizontal split").toLatin1().data() ) );
400 core.def(
"restrictFrameRate", &
Core::restrictFrameRate, QCoreApplication::translate(
"PythonDocCore",
"Restrict maximal rendering FrameRate to MaxFrameRate").toLatin1().data() ,
401 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Restrict Framerate?").toLatin1().data() ) );
403 core.def(
"setMaxFrameRate", &
Core::setMaxFrameRate, QCoreApplication::translate(
"PythonDocCore",
"Set the maximal framerate (automatically enables framerate restriction)").toLatin1().data() ,
404 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Maximum frameRate").toLatin1().data() ) );
406 core.def(
"snapshotBaseFileName", &
Core::snapshotBaseFileName, QCoreApplication::translate(
"PythonDocCore",
"Set a base filename for storing snapshots. This setting is viewer dependent").toLatin1().data() ,
407 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Base filename").toLatin1().data()),
408 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Viewer ID to set the filename for").toLatin1().data() ) );
410 core.def(
"snapshotFileType", &
Core::snapshotFileType, QCoreApplication::translate(
"PythonDocCore",
"Set a filetype for storing snapshots.").toLatin1().data() ,
411 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Image type as string (e.g. jpg )").toLatin1().data()),
412 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Viewer ID to set the filetype for").toLatin1().data() ) );
414 core.def(
"snapshotCounterStart", &
Core::snapshotCounterStart, QCoreApplication::translate(
"PythonDocCore",
"Set the starting number for the snapshot counter.").toLatin1().data() ,
415 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Starting number for the counter").toLatin1().data() ),
416 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Viewer ID to set the counter for").toLatin1().data() ) );
419 core.def(
"snapshot", &
Core::snapshot, QCoreApplication::translate(
"PythonDocCore",
"Make a snapshot of the viewer with id viewerId.\n" 420 "Pass 0 as viewerId parameter to capture the current viewer. \n" 421 "The captured image will have the specified dimensions. \n" 422 "If 0 is passed as either width or height parameter, the value will \n" 423 "automatically be set to hold the right aspect ratio, respectively. \n" 424 "If 0 is passed for both width and height values, the viewport's current \n" 425 "dimension is used. Set alpha to true if you want the background to be transparent. \n" 426 "The fifth parameter is used to hide the coordinate system in the upper right corner of the screen. \n" 427 "If no filename was set using snapshotBaseFileName() the snapshot is stored \n" 428 "in snap.png in the current directory. For every snapshot \n" 429 "a counter is added to the filename.").toLatin1().data() ,
430 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of viewer").toLatin1().data() ) = 0,
431 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Width of image").toLatin1().data() )= 0,
432 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Height of image").toLatin1().data() )= 0,
433 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Transparent background?").toLatin1().data() ) =
false,
434 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Hide coordinate system?").toLatin1().data() ) =
false ,
435 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Number of samples per pixel").toLatin1().data() ) =1 );
438 core.def(
"applicationSnapshot", &
Core::applicationSnapshot, QCoreApplication::translate(
"PythonDocCore",
"Create a snapshot of the whole application").toLatin1().data() );
440 core.def(
"applicationSnapshotName", &
Core::applicationSnapshotName, QCoreApplication::translate(
"PythonDocCore",
"Set the baseName for the application snapshot").toLatin1().data() ,
441 py::arg( QCoreApplication::translate(
"PythonDocCore",
"BaseName for full application snapshots").toLatin1().data() ) );
443 core.def(
"viewerSnapshot",
static_cast<void (
Core::*)()
>(&
Core::viewerSnapshot), QCoreApplication::translate(
"PythonDocCore",
"Take a snapshot from all viewers").toLatin1().data() );
445 core.def(
"viewerSnapshot",
static_cast<void (
Core::*)(QString,
bool,
bool,
bool,
bool,
int,
int,
bool,
bool,
int,
bool)
>(&
Core::viewerSnapshot),
446 QCoreApplication::translate(
"PythonDocCore",
"Create a snapshot with full control").toLatin1().data(),
447 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename of the snapshot").toLatin1().data() ),
448 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should the comments be written?").toLatin1().data() ),
449 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should only the comments of visible objects be written?").toLatin1().data() ),
450 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should only the comments of target objects be written?").toLatin1().data() ),
451 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Store material info?").toLatin1().data() ),
452 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Snapshot width").toLatin1().data() ),
453 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Snapshot height").toLatin1().data() ),
454 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Transparent background?").toLatin1().data() ),
455 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Hide coordinate system?").toLatin1().data() ),
456 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Multisampling count").toLatin1().data() ),
457 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Store the view in the metadata?").toLatin1().data() ) );
460 core.def(
"resizeViewers", &
Core::resizeViewers, QCoreApplication::translate(
"PythonDocCore",
"Resize the examinerViewer.").toLatin1().data() ,
461 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Width").toLatin1().data() ),
462 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Height").toLatin1().data() ) );
464 core.def(
"resizeApplication", &
Core::resizeApplication, QCoreApplication::translate(
"PythonDocCore",
"Resize the whole Application.").toLatin1().data() ,
465 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Width").toLatin1().data() ),
466 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Height").toLatin1().data() ) );
468 core.def(
"writeVersionNumbers", &
Core::writeVersionNumbers, QCoreApplication::translate(
"PythonDocCore",
"Write the current versions of all plugins to ini file").toLatin1().data() ,
469 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Full path to a file where the versions should be written to.").toLatin1().data() ) );
478 core.def(
"blockSceneGraphUpdates", &
Core::blockSceneGraphUpdates, QCoreApplication::translate(
"PythonDocCore",
"Block the scenegraph updates for improved performance").toLatin1().data() );
479 core.def(
"unblockSceneGraphUpdates", &
Core::unblockSceneGraphUpdates, QCoreApplication::translate(
"PythonDocCore",
"Unblock the scenegraph updates").toLatin1().data() );
482 core.def(
"setView", &
Core::setView, QCoreApplication::translate(
"PythonDocCore",
"Set the encoded view for the primary viewport.").toLatin1().data() ,
483 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The encoded view. (You can obtain one through \"Copy View\" in the context menu of the coordinates.)").toLatin1().data() ) );
485 core.def(
"setViewAndWindowGeometry", &
Core::setViewAndWindowGeometry, QCoreApplication::translate(
"PythonDocCore",
"Set the encoded view for the primary viewport and the full geometry of the application").toLatin1().data() ,
486 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The encoded view. (You can obtain one through \"Copy View\" in the context menu of the coordinates.)").toLatin1().data() ) );
488 core.def(
"addViewModeToolboxes", &
Core::addViewModeToolboxes, QCoreApplication::translate(
"PythonDocCore",
"Set toolboxes for a viewmode (This automatically adds the view mode if it does not exist)").toLatin1().data() ,
489 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
490 py::arg( QCoreApplication::translate(
"PythonDocCore",
"';' separated list of toolboxes visible in this viewmode)").toLatin1().data() ));
492 core.def(
"addViewModeToolbars", &
Core::addViewModeToolbars, QCoreApplication::translate(
"PythonDocCore",
"Set toolbars for a viewmode (This automatically adds the view mode if it does not exist)").toLatin1().data() ,
493 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
494 py::arg( QCoreApplication::translate(
"PythonDocCore",
"';' separated list of toolbars visible in this viewmode)").toLatin1().data() ));
496 core.def(
"addViewModeContextMenus", &
Core::addViewModeContextMenus, QCoreApplication::translate(
"PythonDocCore",
"Set context Menus for a viewmode (This automatically adds the view mode if it does not exist)").toLatin1().data() ,
497 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
498 py::arg( QCoreApplication::translate(
"PythonDocCore",
"';' separated list of Context Menus visible in this viewmode)").toLatin1().data() ));
500 core.def(
"addViewModeIcon", &
Core::addViewModeIcon, QCoreApplication::translate(
"PythonDocCore",
"Set Icon for a viewmode (This automatically adds the view mode if it does not exist)").toLatin1().data() ,
501 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
502 py::arg( QCoreApplication::translate(
"PythonDocCore",
"filename of the icon (will be taken from OpenFlippers icon directory)").toLatin1().data() ));
505 core.def(
"setToolBoxSide", &
Core::setToolBoxSide, QCoreApplication::translate(
"PythonDocCore",
"Scripting function to set the side of the main window on which the toolbox should be displayed").toLatin1().data() ,
506 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The desired side of the toolboxes (either 'left' or 'right')").toLatin1().data() ) );
508 core.def(
"setToolBoxActive", &
Core::setToolBoxActive, QCoreApplication::translate(
"PythonDocCore",
"Activate or deaktivate a toolbox").toLatin1().data() ,
509 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the toolbox.").toLatin1().data() ),
510 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Activate or deaktivate?").toLatin1().data() ));
512 core.def(
"loadObject",
static_cast<int (
Core::*)(QString)
>(&
Core::loadObject), QCoreApplication::translate(
"PythonDocCore",
"Load an object specified in file filename. This automatically determines which file plugin to use. It returns the id of the object in the scene or -1 on failure").toLatin1().data() ,
513 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename to load.").toLatin1().data() ) );
515 core.def(
"startVideoCapture", &
Core::startVideoCapture, QCoreApplication::translate(
"PythonDocCore",
"Start video capturing.").toLatin1().data() ,
516 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Basename for capturing").toLatin1().data() ),
517 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Frames per second").toLatin1().data() ),
518 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should the viewers be captured or the whole application?").toLatin1().data() ) );
520 core.def(
"stopVideoCapture", &
Core::stopVideoCapture, QCoreApplication::translate(
"PythonDocCore",
"Stop video capturing").toLatin1().data() );
522 core.def(
"saveObject",
static_cast<bool (
Core::*)(
int,QString)
>(&
Core::saveObject), QCoreApplication::translate(
"PythonDocCore",
"Save object to file. If the file exists it will be overwritten.").toLatin1().data() ,
523 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object)").toLatin1().data() ),
524 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Complete path and filename").toLatin1().data() ));
526 core.def(
"saveObjectTo",
static_cast<bool (
Core::*)(
int,QString)
>(&
Core::saveObjectTo), QCoreApplication::translate(
"PythonDocCore",
"Save object to file. The location can be chosen in a dialog. (GUI mode only!)").toLatin1().data() ,
527 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object)").toLatin1().data() ),
528 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Initial filename in the dialog").toLatin1().data() ));
534 core.def(
"saveAllObjects", &
Core::saveAllObjects, QCoreApplication::translate(
"PythonDocCore",
"Saves all target objects. Exising files will be overriden. For new files, a dialog is shown (Only GUI Mode!)").toLatin1().data() );
536 core.def(
"saveAllObjectsTo", &
Core::saveAllObjectsTo, QCoreApplication::translate(
"PythonDocCore",
"Saves all target objects. The locations can be chosen in dialogs. (Only GUI Mode!)").toLatin1().data() );
538 core.def(
"saveSettings",
static_cast<void (
Core::*)()
>(&
Core::saveSettings), QCoreApplication::translate(
"PythonDocCore",
"Show the dialog to save settings. (only works if GUI is available)").toLatin1().data() );
540 core.def(
"saveSettings",
static_cast<void (
Core::*)(QString,
bool,
bool,
bool,
bool,
bool,
bool)
>(&
Core::saveSettings),
541 QCoreApplication::translate(
"PythonDocCore",
"Save the current setting to the given file.").toLatin1().data(),
542 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Path of the file to save the settings to.").toLatin1().data() ),
543 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save Object information into file?").toLatin1().data() ),
544 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Restrict to targeted objects?").toLatin1().data() ),
545 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save objects into same path as settings file?").toLatin1().data() ),
546 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Prompt before overwriting files that already exist (gui mode only).").toLatin1().data() ),
547 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save program settings?").toLatin1().data() ),
548 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save plugin settings?").toLatin1().data() ) );
550 core.def(
"loadObject",
static_cast<void (
Core::*)()
>(&
Core::loadObject), QCoreApplication::translate(
"PythonDocCore",
"Show the dialog to load an object. (only works if GUI is available)").toLatin1().data() );
552 core.def(
"loadSettings",
static_cast<void (
Core::*)()
>(&
Core::loadSettings), QCoreApplication::translate(
"PythonDocCore",
"Show the dialog to load settings. (only works if GUI is available)").toLatin1().data() );
554 core.def(
"loadSettings",
static_cast<void (
Core::*)(QString)
>(&
Core::loadSettings), QCoreApplication::translate(
"PythonDocCore",
"Load settings from file.").toLatin1().data() ,
555 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename to load.").toLatin1().data() ) );
557 core.def(
"getObjectId", &
Core::getObjectId, QCoreApplication::translate(
"PythonDocCore",
"Return identifier of object with specified name. Returns -1 if object was not found.").toLatin1().data() ,
558 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename or name of the object").toLatin1().data() ) );
560 core.def(
"deserializeMaterialProperties", &
Core::deserializeMaterialProperties, QCoreApplication::translate(
"PythonDocCore",
"Deserialize the supplied material properties into the supplied object.").toLatin1().data() ,
561 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object").toLatin1().data() ),
562 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Material properties encoded as string").toLatin1().data() ) );
564 core.def(
"serializeMaterialProperties", &
Core::serializeMaterialProperties, QCoreApplication::translate(
"PythonDocCore",
"Serialize and return the material properties of the supplied object.").toLatin1().data() ,
565 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object").toLatin1().data() ));
567 core.def(
"activateToolbox", &
Core::activateToolbox, QCoreApplication::translate(
"PythonDocCore",
"Expand or collapse a toolbox").toLatin1().data() ,
568 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the plugin to which this toolbox gelongs").toLatin1().data() ),
569 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the toolbox").toLatin1().data() ),
570 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Expand or collapse?").toLatin1().data() ) );
572 core.def(
"saveOptions", &
Core::saveOptions, QCoreApplication::translate(
"PythonDocCore",
"Save the current options to the standard ini file").toLatin1().data() );
574 core.def(
"applyOptions", &
Core::applyOptions, QCoreApplication::translate(
"PythonDocCore",
"After ini-files have been loaded and core is up or if options have been changed -> apply Options").toLatin1().data() );
576 core.def(
"openIniFile", &
Core::openIniFile, QCoreApplication::translate(
"PythonDocCore",
"Load information from an ini file").toLatin1().data() ,
577 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the ini file").toLatin1().data() ),
578 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Load applications settings?").toLatin1().data() ),
579 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Load plugin settings?").toLatin1().data() ),
580 py::arg( QCoreApplication::translate(
"PythonDocCore",
" Load objects defined in the ini file?").toLatin1().data() ));
592 core.def(
"setViewMode", &
Core::setViewMode, QCoreApplication::translate(
"PythonDocCore",
"Switch to the given viewmode").toLatin1().data() ,
593 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the viewmode to enable").toLatin1().data() ) );
596 core.def(
"getCurrentViewMode", &
Core::getCurrentViewMode, QCoreApplication::translate(
"PythonDocCore",
"Get the name of the current viewMode").toLatin1().data() );
598 core.def(
"setViewModeIcon", &
Core::setViewModeIcon, QCoreApplication::translate(
"PythonDocCore",
"Set an icon for a view Mode").toLatin1().data() ,
599 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the mode for the icon").toLatin1().data() ),
600 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename of the icon").toLatin1().data() ) );
602 core.def(
"moveToolBoxToTop", &
Core::moveToolBoxToTop, QCoreApplication::translate(
"PythonDocCore",
"Move selected toolbox to the top of side area").toLatin1().data() ,
603 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Toolbox to be moved").toLatin1().data() ) );
605 core.def(
"moveToolBoxToBottom", &
Core::moveToolBoxToBottom, QCoreApplication::translate(
"PythonDocCore",
"Move selected toolbox to the bottom of side area").toLatin1().data() ,
606 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Toolbox to be moved").toLatin1().data() ) );
608 core.def(
"showReducedMenuBar", &
Core::showReducedMenuBar, QCoreApplication::translate(
"PythonDocCore",
"Show only a reduced menubar").toLatin1().data() ,
609 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Reduced Menubar?").toLatin1().data() ) );
611 core.def(
"executePythonScriptFile", &
Core::executePythonScriptFile, QCoreApplication::translate(
"PythonDocCore",
"Open the given file and execute its contents as a python script").toLatin1().data() ,
612 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename of the script").toLatin1().data() ) );
615 core.def(
"executePythonScript", &
Core::executePythonScript, QCoreApplication::translate(
"PythonDocCore",
"Execute a text as a python script").toLatin1().data() ,
616 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The text of the script").toLatin1().data() ) );
618 core.def(
"exitApplication", &
Core::exitApplication, QCoreApplication::translate(
"PythonDocCore",
"Exit the application").toLatin1().data() );
619 core.def(
"exitFailure", &
Core::exitFailure, QCoreApplication::translate(
"PythonDocCore",
"Use this function in unit tests, if you detected a failure. Therefore the test functions will recognize that something went wrong.").toLatin1().data() );
620 core.def(
"finishSplash", &
Core::finishSplash, QCoreApplication::translate(
"PythonDocCore",
"Hide the splash screen").toLatin1().data() );
622 core.def(
"objectUpdated", &
Core::slotObjectUpdated, QCoreApplication::translate(
"PythonDocCore",
"Tell the core that an object has been updated").toLatin1().data(),
623 py::arg( QCoreApplication::translate(
"PythonDocCore",
"ID of the updated object").toLatin1().data() ),
624 py::arg( QCoreApplication::translate(
"PythonDocCore",
"What has been updated? String list separated by ; . Possible update types include: All,Visibility,Geometry,Topology,Selection,VertexSelection,EdgeSelection,HalfedgeSelection,FaceSelection,KnotSelection,Color,Texture,State ").toLatin1().data() ) =
UPDATE_ALL );
void saveAllObjectsTo()
Slot for saving objects to a new location.
void log(Logtype _type, QString _message)
Log with OUT,WARN or ERR as type.
void exitFailure()
Aborts the application with an error code.
void resetInterpreter()
Resets the interpreter and all states.
void startVideoCapture(QString _baseName, int _fps, bool _captureViewers)
Start video capturing.
void clearAll()
Clear all data objects.
void setToolBoxActive(QString _toolBoxName, bool _active)
Scripting function to activate or deactivate a toolbox.
void snapshotFileType(QString _type, unsigned int _viewerId=0)
Set the file type for snapshots.
void showStatusBar(bool _state)
Show or hide Status Bar.
void showToolbox(bool _state)
Show or hide toolbox.
const UpdateType UPDATE_ALL(UpdateTypeSet(1))
Identifier for all updates.
PythonInterpreter()
private constructor because of singleton
void addViewModeToolbars(QString _modeName, QString _toolbarList)
Scripting function to set toolbars in a view mode.
void saveOptions()
Save the current options to the standard ini file.
void openIniFile(QString _filename, bool _coreSettings, bool _perPluginSettings, bool _loadObjects)
Load information from an ini file.
bool runScript(QString _script)
Run a script. Output is passed to the standard logging facilities of OpenFlipper. ...
void loadSettings()
Load status from file.
void fullscreen(bool _state)
set fullscreen mode
static PythonInterpreter * getInstance()
Creates or returns an instance of the interpreter.
void slotObjectUpdated(int _identifier, const UpdateType &_type=UPDATE_ALL)
Called by the plugins if they changed something in the object list (deleted, added, or other property changes)
void setView(QString view)
Called when a plugin requests an update in the viewer.
bool modulesInitialized()
void deserializeMaterialProperties(int _objId, QString _props)
Serialize material properties.
void deleteObject(int _id)
Called to delete an object.
void setMaxFrameRate(int _rate)
set the maximal framerate ( automatically enables framerate restriction )
QString runScriptOutput(QString _script)
void addViewModeContextMenus(QString _modeName, QString _contextMenuList)
Scripting function to set context menus in a view mode.
void saveSettings()
Save current status to a settings file. Solicit file name through dialog.
void executePythonScriptFile(QString _filename)
Open the given file and execute its contents as a python script.
void applyOptions()
after ini-files have been loaded and core is up or if options have been changed -> apply Options ...
void updateUI()
process events during script execution to keep the ui alive
void resizeViewers(int _width, int _height)
resize the examinerViewer
bool saveObjectTo(int _id, QString _filename)
This class provides OpenFlippers Python interpreter.
void snapshot(unsigned int _viewerId=0, int _width=0, int _height=0, bool _alpha=false, bool _hideCoordsys=false, int _numSamples=1)
void resizeApplication(int _width, int _height)
resize the whole Application
void loggerState(int _state)
Change the logging window state.
void exitApplication()
exit the current application
void multiViewMode(int _mode)
Switch the multiView Mode.
void enableOpenMeshErrorLog(bool _state)
Enable or disable OpenMesh error logging.
void snapshotCounterStart(const int _counter, unsigned int _viewerId=0)
Set the start index for the snapshot counter.
void addViewModeToolboxes(QString _modeName, QString _toolboxList)
Scripting function to set toolboxes in a view mode.
void setToolBoxSide(QString _side)
Scripting function to set the side of the main window on which the toolbox should be displayed...
QString getCurrentViewMode()
Get current view mode.
void unblockSceneGraphUpdates()
Unblock the scenegraph updates.
void blockSceneGraphUpdates()
Block the scenegraph updates.
void updateView()
Called when a plugin requests an update in the viewer.
void snapshotBaseFileName(QString _fname, unsigned int _viewerId=0)
void setViewModeIcon(QString _mode, QString _iconName)
Set the icon of a viewMode.
void saveAllObjects()
Slot for saving objects from Menu.
void pyOutput(const char *w)
Callback to redirect cout log to OpenFlipper logger.
void activateToolbox(QString _pluginName, QString _toolboxName, bool activate)
expand or collapse a toolbox
void applicationSnapshotName(QString _name)
Set the baseName for the application snapshot.
void pyError(const char *w)
Callback to redirect cerr log to OpenFlipper logger.
void showReducedMenuBar(bool reduced)
Core scripting engine.
void setViewMode(QString _viewMode)
Set the active ViewMode.
void loadObject()
Open Load Widget.
void finishSplash()
exit the current application
void blockScenegraphUpdates(bool _block)
Called when a plugin wants to lock or unlock scenegraph updates.
void moveToolBoxToTop(QString _name)
Move selected toolbox to top of side area.
void addViewModeIcon(QString _modeName, QString _iconName)
Scripting function to set an icon for a view mode.
QString serializeMaterialProperties(int _objId)
Serialize material properties.
bool saveObject(int _id, QString _filename)
Save an object.
int getObjectId(QString _filename)
Get object id from filename.
void viewerSnapshot()
Take a snapshot from all viewers.
void clearObjectComment(int objId, QString key)
Called when a plugin requests an update in the viewer.
void restrictFrameRate(bool _enable)
Enable or disable framerate restriction.
void executePythonScript(QString _script)
execute the given string as a python script
void setObjectComment(int objId, QString key, QString comment)
Called when a plugin requests an update in the viewer.
void moveToolBoxToBottom(QString _name)
Move selected toolbox to bottom of side area.
void setViewAndWindowGeometry(QString view)
Called when a plugin requests an update in the viewer.
void applicationSnapshot()
Take a snapshot from the whole app.
void writeVersionNumbers(QString _filename)
write the current versions of all plugins to ini file
void stopVideoCapture()
Stop video capturing.
void initPython()
Initialize OpenFlipper Python Interpreter.