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> 64 static pybind11::module mainModule_;
71 static PyObject* global_dict_clean_ =
nullptr;
74 void setCorePointer(
Core* _core ) {
80 if (interpreter_ ==
nullptr)
90 externalLogging_(false)
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 ...";
144 tyti::pylog::redirect_stderr([
this](
const char*w) {this->
pyError(w); });
145 tyti::pylog::redirect_stdout([
this](
const char* w) {this->
pyOutput(w); });
148 std::cerr <<
" Done" << std::endl;
149 std::cerr <<
"Get __dict__ from main namespace ...";
155 py::object main_namespace = main.attr(
"__dict__");
158 std::cerr <<
" Done" << std::endl;
159 std::cerr <<
"Importing OpenFlipper core module ...";
162 py::module of_module(py::module::import(
"openflipper"));
163 main_namespace[
"openflipper"] = of_module;
166 std::cerr <<
" Done" << std::endl;
173 QStringList pythonPlugins = getPythonPlugins();
175 for (
int i = 0 ; i < pythonPlugins.size() ; ++i ) {
178 std::cerr <<
"Importing "+ pythonPlugins[i].toStdString() +
" module ...";
181 py::module om_module(py::module::import(pythonPlugins[i].toStdString().c_str()));
182 main_namespace[pythonPlugins[i].toStdString().c_str()] = om_module;
185 std::cerr <<
" Done" << std::endl;
190 std::cerr <<
"Copy dict ...";
193 global_dict_clean_ = PyDict_Copy(PyModule_GetDict(main.ptr()));
196 std::cerr <<
" Done" << std::endl;
197 std::cerr <<
"Set to validate state ...";
201 mainModule_ = std::move(main);
204 std::cerr <<
" Done" << std::endl;
205 std::cerr <<
"Save thread ...";
212 std::cerr <<
" Done" << std::endl;
225 PyGILState_STATE state = PyGILState_Ensure();
226 PyObject* dict = PyModule_GetDict(mainModule_.ptr());
228 PyDict_Update(dict, global_dict_clean_);
229 PyGILState_Release(state);
236 std::cerr <<
"runScript" << std::endl;
243 _script.prepend(
"core = openflipper.Core()\n");
245 QStringList pythonPlugins = getPythonPlugins();
247 for (
int i = 0 ; i < pythonPlugins.size() ; ++i ) {
248 QString
import = pythonPlugins[i].toLower() +
" = " + pythonPlugins[i] +
"." + pythonPlugins[i] +
"()\n";
249 _script.prepend(
import);
257 std::cerr <<
"Initialize Python" << std::endl;
263 std::cerr <<
"Done initializing Python" << std::endl;
266 catch (py::error_already_set &e)
272 PyGILState_STATE state = PyGILState_Ensure();
275 auto locals = mainModule_.attr(
"__dict__");
282 std::cerr <<
"Now executing script:" << std::endl;
283 std::cerr << _script.toStdString() << std::endl;
285 py::exec(_script.toStdString(), py::globals(), locals);
287 std::cerr <<
"Finished successfully" << std::endl;
289 catch (py::error_already_set &e)
295 catch (
const std::runtime_error &e)
298 pyOutput(
"Restarting Interpreter.");
301 state = PyGILState_Ensure();
304 PyGILState_Release(state);
312 externalLogging_ =
false;
314 externalLogging_ =
true;
315 return LogOut + LogErr;
322 if (externalLogging_) {
323 std::cerr <<
"Python output: " << w << std::endl;
326 LogOut += QString::fromUtf8(w);
332 if (externalLogging_) {
333 std::cerr <<
"Python error: " << w << std::endl;
336 LogErr += QString::fromUtf8(w);
343 PYBIND11_EMBEDDED_MODULE(openflipper, m) {
347 py::class_<Core,std::unique_ptr<Core, py::nodelete>> core(m,
"Core");
352 core.def(py::init([]() {
return core_; }));
354 core.def(
"updateView", &
Core::updateView, QCoreApplication::translate(
"PythonDocCore",
"Redraw the contents of the viewer.").toLatin1().data() );
355 core.def(
"blockScenegraphUpdates", &
Core::blockScenegraphUpdates, QCoreApplication::translate(
"PythonDocCore",
"Disable Scenegraph Updates (e.g. before loading or adding a large number of files)").toLatin1().data() );
356 core.def(
"updateUI", &
Core::updateUI, QCoreApplication::translate(
"PythonDocCore",
"Process events during script execution to keep the ui alive").toLatin1().data() );
357 core.def(
"clearAll", &
Core::clearAll, QCoreApplication::translate(
"PythonDocCore",
"Clear all data objects.").toLatin1().data() );
358 core.def(
"deleteObject", &
Core::deleteObject, QCoreApplication::translate(
"PythonDocCore",
"Delete an object from the scene.").toLatin1().data() ,
359 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to delete.").toLatin1().data() ) );
361 core.def(
"setObjectComment", &
Core::setObjectComment, QCoreApplication::translate(
"PythonDocCore",
"Add a comment to an object (saved e.g. in screenshot metadata).").toLatin1().data()) ,
362 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to add comment.").toLatin1().data()),
363 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Key value").toLatin1().data()),
364 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Actual comment").toLatin1().data());
366 core.def(
"clearObjectComment", &
Core::clearObjectComment, QCoreApplication::translate(
"PythonDocCore",
"Remove a comment from an object.").toLatin1().data()) ,
367 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to remove comment from.").toLatin1().data()),
368 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Key value to remove").toLatin1().data());
370 core.def(
"clearAllComments", &
Core::clearObjectComment, QCoreApplication::translate(
"PythonDocCore",
"Remove all comments from an object.").toLatin1().data()) ,
371 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object to remove comments from.").toLatin1().data());
373 core.def(
"fullscreen", &
Core::fullscreen, QCoreApplication::translate(
"PythonDocCore",
"Enable or disable fullscreen mode.").toLatin1().data() ,
374 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Enable or disable?").toLatin1().data() ) );
376 core.def(
"showViewModeControls", &
Core::deleteObject, QCoreApplication::translate(
"PythonDocCore",
"Show or hide the view mode control box").toLatin1().data() ,
377 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Visible?").toLatin1().data() ) );
379 core.def(
"loggerState", &
Core::loggerState, QCoreApplication::translate(
"PythonDocCore",
"Change the logger window state").toLatin1().data() ,
380 py::arg( QCoreApplication::translate(
"PythonDocCore",
"0 = In Scene , 1 = Normal, 2 = Hidden").toLatin1().data() ) );
382 core.def(
"enableOpenMeshErrorLog", &
Core::enableOpenMeshErrorLog, QCoreApplication::translate(
"PythonDocCore",
"Enable or disable OpenMesh error logging").toLatin1().data() ,
383 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Enable or Disable").toLatin1().data() ) );
385 core.def(
"showToolbox", &
Core::showToolbox, QCoreApplication::translate(
"PythonDocCore",
"Show or hide toolbox").toLatin1().data() ,
386 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Visible?").toLatin1().data() ) );
388 core.def(
"showStatusBar", &
Core::showStatusBar, QCoreApplication::translate(
"PythonDocCore",
"Show or hide status bar").toLatin1().data() ,
389 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Visible?").toLatin1().data() ) );
391 core.def(
"multiViewMode", &
Core::multiViewMode, QCoreApplication::translate(
"PythonDocCore",
"Switch MultiView Mode").toLatin1().data() ,
392 py::arg( QCoreApplication::translate(
"PythonDocCore",
"0: One Viewer, 1: Double Viewer, 2: Grid, 3: Horizontal split").toLatin1().data() ) );
394 core.def(
"restrictFrameRate", &
Core::restrictFrameRate, QCoreApplication::translate(
"PythonDocCore",
"Restrict maximal rendering FrameRate to MaxFrameRate").toLatin1().data() ,
395 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Restrict Framerate?").toLatin1().data() ) );
397 core.def(
"setMaxFrameRate", &
Core::setMaxFrameRate, QCoreApplication::translate(
"PythonDocCore",
"Set the maximal framerate (automatically enables framerate restriction)").toLatin1().data() ,
398 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Maximum frameRate").toLatin1().data() ) );
400 core.def(
"snapshotBaseFileName", &
Core::snapshotBaseFileName, QCoreApplication::translate(
"PythonDocCore",
"Set a base filename for storing snapshots. This setting is viewer dependent").toLatin1().data() ,
401 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Base filename").toLatin1().data()),
402 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Viewer ID to set the filename for").toLatin1().data() ) );
404 core.def(
"snapshotFileType", &
Core::snapshotFileType, QCoreApplication::translate(
"PythonDocCore",
"Set a filetype for storing snapshots.").toLatin1().data() ,
405 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Image type as string (e.g. jpg )").toLatin1().data()),
406 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Viewer ID to set the filetype for").toLatin1().data() ) );
408 core.def(
"snapshotCounterStart", &
Core::snapshotCounterStart, QCoreApplication::translate(
"PythonDocCore",
"Set the starting number for the snapshot counter.").toLatin1().data() ,
409 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Starting number for the counter").toLatin1().data() ),
410 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Viewer ID to set the counter for").toLatin1().data() ) );
413 core.def(
"snapshot", &
Core::snapshot, QCoreApplication::translate(
"PythonDocCore",
"Make a snapshot of the viewer with id viewerId.\n" 414 "Pass 0 as viewerId parameter to capture the current viewer. \n" 415 "The captured image will have the specified dimensions. \n" 416 "If 0 is passed as either width or height parameter, the value will \n" 417 "automatically be set to hold the right aspect ratio, respectively. \n" 418 "If 0 is passed for both width and height values, the viewport's current \n" 419 "dimension is used. Set alpha to true if you want the background to be transparent. \n" 420 "The fifth parameter is used to hide the coordinate system in the upper right corner of the screen. \n" 421 "If no filename was set using snapshotBaseFileName() the snapshot is stored \n" 422 "in snap.png in the current directory. For every snapshot \n" 423 "a counter is added to the filename.").toLatin1().data() ,
424 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of viewer").toLatin1().data() ) = 0,
425 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Width of image").toLatin1().data() )= 0,
426 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Height of image").toLatin1().data() )= 0,
427 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Transparent background?").toLatin1().data() ) =
false,
428 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Hide coordinate system?").toLatin1().data() ) =
false ,
429 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Number of samples per pixel").toLatin1().data() ) =1 );
432 core.def(
"applicationSnapshot", &
Core::applicationSnapshot, QCoreApplication::translate(
"PythonDocCore",
"Create a snapshot of the whole application").toLatin1().data() );
434 core.def(
"applicationSnapshotName", &
Core::applicationSnapshotName, QCoreApplication::translate(
"PythonDocCore",
"Set the baseName for the application snapshot").toLatin1().data() ,
435 py::arg( QCoreApplication::translate(
"PythonDocCore",
"BaseName for full application snapshots").toLatin1().data() ) );
437 core.def(
"viewerSnapshot",
static_cast<void (
Core::*)()
>(&
Core::viewerSnapshot), QCoreApplication::translate(
"PythonDocCore",
"Take a snapshot from all viewers").toLatin1().data() );
439 core.def(
"viewerSnapshot",
static_cast<void (
Core::*)(QString,
bool,
bool,
bool,
bool,
int,
int,
bool,
bool,
int,
bool)
>(&
Core::viewerSnapshot),
440 QCoreApplication::translate(
"PythonDocCore",
"Create a snapshot with full control").toLatin1().data(),
441 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename of the snapshot").toLatin1().data() ),
442 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should the comments be written?").toLatin1().data() ),
443 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should only the comments of visible objects be written?").toLatin1().data() ),
444 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should only the comments of target objects be written?").toLatin1().data() ),
445 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Store material info?").toLatin1().data() ),
446 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Snapshot width").toLatin1().data() ),
447 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Snapshot height").toLatin1().data() ),
448 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Transparent background?").toLatin1().data() ),
449 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Hide coordinate system?").toLatin1().data() ),
450 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Multisampling count").toLatin1().data() ),
451 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Store the view in the metadata?").toLatin1().data() ) );
454 core.def(
"resizeViewers", &
Core::resizeViewers, QCoreApplication::translate(
"PythonDocCore",
"Resize the examinerViewer.").toLatin1().data() ,
455 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Width").toLatin1().data() ),
456 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Height").toLatin1().data() ) );
458 core.def(
"resizeApplication", &
Core::resizeApplication, QCoreApplication::translate(
"PythonDocCore",
"Resize the whole Application.").toLatin1().data() ,
459 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Width").toLatin1().data() ),
460 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Height").toLatin1().data() ) );
462 core.def(
"writeVersionNumbers", &
Core::writeVersionNumbers, QCoreApplication::translate(
"PythonDocCore",
"Write the current versions of all plugins to ini file").toLatin1().data() ,
463 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Full path to a file where the versions should be written to.").toLatin1().data() ) );
472 core.def(
"blockSceneGraphUpdates", &
Core::blockSceneGraphUpdates, QCoreApplication::translate(
"PythonDocCore",
"Block the scenegraph updates for improved performance").toLatin1().data() );
473 core.def(
"unblockSceneGraphUpdates", &
Core::unblockSceneGraphUpdates, QCoreApplication::translate(
"PythonDocCore",
"Unblock the scenegraph updates").toLatin1().data() );
476 core.def(
"setView", &
Core::setView, QCoreApplication::translate(
"PythonDocCore",
"Set the encoded view for the primary viewport.").toLatin1().data() ,
477 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The encoded view. (You can obtain one through \"Copy View\" in the context menu of the coordinates.)").toLatin1().data() ) );
479 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() ,
480 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The encoded view. (You can obtain one through \"Copy View\" in the context menu of the coordinates.)").toLatin1().data() ) );
482 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() ,
483 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
484 py::arg( QCoreApplication::translate(
"PythonDocCore",
"';' separated list of toolboxes visible in this viewmode)").toLatin1().data() ));
486 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() ,
487 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
488 py::arg( QCoreApplication::translate(
"PythonDocCore",
"';' separated list of toolbars visible in this viewmode)").toLatin1().data() ));
490 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() ,
491 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
492 py::arg( QCoreApplication::translate(
"PythonDocCore",
"';' separated list of Context Menus visible in this viewmode)").toLatin1().data() ));
494 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() ,
495 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Viewmode").toLatin1().data() ),
496 py::arg( QCoreApplication::translate(
"PythonDocCore",
"filename of the icon (will be taken from OpenFlippers icon directory)").toLatin1().data() ));
499 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() ,
500 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The desired side of the toolboxes (either 'left' or 'right')").toLatin1().data() ) );
502 core.def(
"setToolBoxActive", &
Core::setToolBoxActive, QCoreApplication::translate(
"PythonDocCore",
"Activate or deaktivate a toolbox").toLatin1().data() ,
503 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the toolbox.").toLatin1().data() ),
504 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Activate or deaktivate?").toLatin1().data() ));
506 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() ,
507 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename to load.").toLatin1().data() ) );
509 core.def(
"startVideoCapture", &
Core::startVideoCapture, QCoreApplication::translate(
"PythonDocCore",
"Start video capturing.").toLatin1().data() ,
510 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Basename for capturing").toLatin1().data() ),
511 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Frames per second").toLatin1().data() ),
512 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Should the viewers be captured or the whole application?").toLatin1().data() ) );
514 core.def(
"stopVideoCapture", &
Core::stopVideoCapture, QCoreApplication::translate(
"PythonDocCore",
"Stop video capturing").toLatin1().data() );
516 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() ,
517 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object)").toLatin1().data() ),
518 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Complete path and filename").toLatin1().data() ));
520 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() ,
521 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object)").toLatin1().data() ),
522 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Initial filename in the dialog").toLatin1().data() ));
528 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() );
530 core.def(
"saveAllObjectsTo", &
Core::saveAllObjectsTo, QCoreApplication::translate(
"PythonDocCore",
"Saves all target objects. The locations can be chosen in dialogs. (Only GUI Mode!)").toLatin1().data() );
532 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() );
534 core.def(
"saveSettings",
static_cast<void (
Core::*)(QString,
bool,
bool,
bool,
bool,
bool,
bool)
>(&
Core::saveSettings),
535 QCoreApplication::translate(
"PythonDocCore",
"Save the current setting to the given file.").toLatin1().data(),
536 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Path of the file to save the settings to.").toLatin1().data() ),
537 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save Object information into file?").toLatin1().data() ),
538 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Restrict to targeted objects?").toLatin1().data() ),
539 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save objects into same path as settings file?").toLatin1().data() ),
540 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Prompt before overwriting files that already exist (gui mode only).").toLatin1().data() ),
541 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save program settings?").toLatin1().data() ),
542 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Save plugin settings?").toLatin1().data() ) );
544 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() );
546 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() );
548 core.def(
"loadSettings",
static_cast<void (
Core::*)(QString)
>(&
Core::loadSettings), QCoreApplication::translate(
"PythonDocCore",
"Load settings from file.").toLatin1().data() ,
549 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename to load.").toLatin1().data() ) );
551 core.def(
"getObjectId", &
Core::getObjectId, QCoreApplication::translate(
"PythonDocCore",
"Return identifier of object with specified name. Returns -1 if object was not found.").toLatin1().data() ,
552 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename or name of the object").toLatin1().data() ) );
554 core.def(
"deserializeMaterialProperties", &
Core::deserializeMaterialProperties, QCoreApplication::translate(
"PythonDocCore",
"Deserialize the supplied material properties into the supplied object.").toLatin1().data() ,
555 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object").toLatin1().data() ),
556 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Material properties encoded as string").toLatin1().data() ) );
558 core.def(
"serializeMaterialProperties", &
Core::serializeMaterialProperties, QCoreApplication::translate(
"PythonDocCore",
"Serialize and return the material properties of the supplied object.").toLatin1().data() ,
559 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Id of the object").toLatin1().data() ));
561 core.def(
"activateToolbox", &
Core::activateToolbox, QCoreApplication::translate(
"PythonDocCore",
"Expand or collapse a toolbox").toLatin1().data() ,
562 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the plugin to which this toolbox gelongs").toLatin1().data() ),
563 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the toolbox").toLatin1().data() ),
564 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Expand or collapse?").toLatin1().data() ) );
566 core.def(
"saveOptions", &
Core::saveOptions, QCoreApplication::translate(
"PythonDocCore",
"Save the current options to the standard ini file").toLatin1().data() );
568 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() );
570 core.def(
"openIniFile", &
Core::openIniFile, QCoreApplication::translate(
"PythonDocCore",
"Load information from an ini file").toLatin1().data() ,
571 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the ini file").toLatin1().data() ),
572 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Load applications settings?").toLatin1().data() ),
573 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Load plugin settings?").toLatin1().data() ),
574 py::arg( QCoreApplication::translate(
"PythonDocCore",
" Load objects defined in the ini file?").toLatin1().data() ));
586 core.def(
"setViewMode", &
Core::setViewMode, QCoreApplication::translate(
"PythonDocCore",
"Switch to the given viewmode").toLatin1().data() ,
587 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the viewmode to enable").toLatin1().data() ) );
590 core.def(
"getCurrentViewMode", &
Core::getCurrentViewMode, QCoreApplication::translate(
"PythonDocCore",
"Get the name of the current viewMode").toLatin1().data() );
592 core.def(
"setViewModeIcon", &
Core::setViewModeIcon, QCoreApplication::translate(
"PythonDocCore",
"Set an icon for a view Mode").toLatin1().data() ,
593 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the mode for the icon").toLatin1().data() ),
594 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename of the icon").toLatin1().data() ) );
596 core.def(
"moveToolBoxToTop", &
Core::moveToolBoxToTop, QCoreApplication::translate(
"PythonDocCore",
"Move selected toolbox to the top of side area").toLatin1().data() ,
597 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Toolbox to be moved").toLatin1().data() ) );
599 core.def(
"moveToolBoxToBottom", &
Core::moveToolBoxToBottom, QCoreApplication::translate(
"PythonDocCore",
"Move selected toolbox to the bottom of side area").toLatin1().data() ,
600 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Name of the Toolbox to be moved").toLatin1().data() ) );
602 core.def(
"showReducedMenuBar", &
Core::showReducedMenuBar, QCoreApplication::translate(
"PythonDocCore",
"Show only a reduced menubar").toLatin1().data() ,
603 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Reduced Menubar?").toLatin1().data() ) );
605 core.def(
"executePythonScriptFile", &
Core::executePythonScriptFile, QCoreApplication::translate(
"PythonDocCore",
"Open the given file and execute its contents as a python script").toLatin1().data() ,
606 py::arg( QCoreApplication::translate(
"PythonDocCore",
"Filename of the script").toLatin1().data() ) );
609 core.def(
"executePythonScript", &
Core::executePythonScript, QCoreApplication::translate(
"PythonDocCore",
"Execute a text as a python script").toLatin1().data() ,
610 py::arg( QCoreApplication::translate(
"PythonDocCore",
"The text of the script").toLatin1().data() ) );
612 core.def(
"exitApplication", &
Core::exitApplication, QCoreApplication::translate(
"PythonDocCore",
"Exit the application").toLatin1().data() );
613 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() );
614 core.def(
"finishSplash", &
Core::finishSplash, QCoreApplication::translate(
"PythonDocCore",
"Hide the splash screen").toLatin1().data() );
616 core.def(
"objectUpdated", &
Core::slotObjectUpdated, QCoreApplication::translate(
"PythonDocCore",
"Tell the core that an object has been updated").toLatin1().data(),
617 py::arg( QCoreApplication::translate(
"PythonDocCore",
"ID of the updated object").toLatin1().data() ),
618 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 setView(QString view)
Called when a plugin requests an update in the viewer.
void clearObjectComment(int objId, QString key)
Called when a plugin requests an update in the viewer.
void fullscreen(bool _state)
set fullscreen mode
void saveSettings()
Save current status to a settings file. Solicit file name through dialog.
const UpdateType UPDATE_ALL(UpdateTypeSet(1))
Identifier for all updates.
QString runScriptOutput(QString _script)
QString serializeMaterialProperties(int _objId)
Serialize material properties.
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 setViewMode(QString _viewMode)
Set the active ViewMode.
void executePythonScript(QString _script)
execute the given string as a python script
int getObjectId(QString _filename)
Get object id from filename.
void loggerState(int _state)
Change the logging window state.
void showReducedMenuBar(bool reduced)
Core scripting engine.
void addViewModeToolbars(QString _modeName, QString _toolbarList)
Scripting function to set toolbars in a view mode.
void addViewModeToolboxes(QString _modeName, QString _toolboxList)
Scripting function to set toolboxes in a view mode.
void stopVideoCapture()
Stop video capturing.
void deserializeMaterialProperties(int _objId, QString _props)
Serialize material properties.
void openIniFile(QString _filename, bool _coreSettings, bool _perPluginSettings, bool _loadObjects)
Load information from an ini file.
void addViewModeContextMenus(QString _modeName, QString _contextMenuList)
Scripting function to set context menus in a view mode.
void resizeApplication(int _width, int _height)
resize the whole Application
void executePythonScriptFile(QString _filename)
Open the given file and execute its contents as a python script.
void setViewModeIcon(QString _mode, QString _iconName)
Set the icon of a viewMode.
void setObjectComment(int objId, QString key, QString comment)
Called when a plugin requests an update in the viewer.
void snapshotBaseFileName(QString _fname, unsigned int _viewerId=0)
void saveAllObjects()
Slot for saving objects from Menu.
void viewerSnapshot()
Take a snapshot from all viewers.
void finishSplash()
exit the current application
bool modulesInitialized()
void snapshot(unsigned int _viewerId=0, int _width=0, int _height=0, bool _alpha=false, bool _hideCoordsys=false, int _numSamples=1)
bool saveObjectTo(int _id, QString _filename)
void clearAll()
Clear all data objects.
void setToolBoxSide(QString _side)
Scripting function to set the side of the main window on which the toolbox should be displayed...
void log(Logtype _type, QString _message)
Log with OUT,WARN or ERR as type.
PythonInterpreter()
private constructor because of singleton
void writeVersionNumbers(QString _filename)
write the current versions of all plugins to ini file
void applicationSnapshotName(QString _name)
Set the baseName for the application snapshot.
void blockScenegraphUpdates(bool _block)
Called when a plugin wants to lock or unlock scenegraph updates.
void multiViewMode(int _mode)
Switch the multiView Mode.
void loadObject()
Open Load Widget.
void resetInterpreter()
Resets the interpreter and all states.
QString getCurrentViewMode()
Get current view mode.
void updateView()
Called when a plugin requests an update in the viewer.
bool runScript(QString _script)
Run a script. Output is passed to the standard logging facilities of OpenFlipper. ...
void snapshotCounterStart(const int _counter, unsigned int _viewerId=0)
Set the start index for the snapshot counter.
void applicationSnapshot()
Take a snapshot from the whole app.
void restrictFrameRate(bool _enable)
Enable or disable framerate restriction.
void applyOptions()
after ini-files have been loaded and core is up or if options have been changed -> apply Options ...
void blockSceneGraphUpdates()
Block the scenegraph updates.
void saveOptions()
Save the current options to the standard ini file.
void saveAllObjectsTo()
Slot for saving objects to a new location.
void enableOpenMeshErrorLog(bool _state)
Enable or disable OpenMesh error logging.
void showToolbox(bool _state)
Show or hide toolbox.
void setMaxFrameRate(int _rate)
set the maximal framerate ( automatically enables framerate restriction )
void addViewModeIcon(QString _modeName, QString _iconName)
Scripting function to set an icon for a view mode.
void loadSettings()
Load status from file.
void deleteObject(int _id)
Called to delete an object.
void resizeViewers(int _width, int _height)
resize the examinerViewer
void exitFailure()
Aborts the application with an error code.
void activateToolbox(QString _pluginName, QString _toolboxName, bool activate)
expand or collapse a toolbox
void unblockSceneGraphUpdates()
Unblock the scenegraph updates.
This class provides OpenFlippers Python interpreter.
void exitApplication()
exit the current application
void moveToolBoxToTop(QString _name)
Move selected toolbox to top of side area.
void snapshotFileType(QString _type, unsigned int _viewerId=0)
Set the file type for snapshots.
void startVideoCapture(QString _baseName, int _fps, bool _captureViewers)
Start video capturing.
void setToolBoxActive(QString _toolBoxName, bool _active)
Scripting function to activate or deactivate a toolbox.
void updateUI()
process events during script execution to keep the ui alive
void moveToolBoxToBottom(QString _name)
Move selected toolbox to bottom of side area.
bool saveObject(int _id, QString _filename)
Save an object.
void setViewAndWindowGeometry(QString view)
Called when a plugin requests an update in the viewer.
void pyOutput(const char *w)
Callback to redirect cout log to OpenFlipper logger.
void showStatusBar(bool _state)
Show or hide Status Bar.
void initPython()
Initialize OpenFlipper Python Interpreter.
void pyError(const char *w)
Callback to redirect cerr log to OpenFlipper logger.