Developer Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Python Interface



The Python interface enables OpenFlipper to export plugin functions to the integrated python interpreter of OpenFlipper. Only a few steps are required to export functions in a plugin.

  1. Tell cmake, that your plugin supports the Python Interface. In your CMakeLists.txt add the Keyword PYTHONINTERFACE. E.g. :
    include (plugin)
    openflipper_plugin (PYTHONINTERFACE )
  2. Add the corresponding includes and calls to your plugin header:
  3. Add a subdirectory called PythonInterface to your plugin directory
  4. In this directory create a file called Python.cc with contents similar to the following Code:
    #include <pybind11/include/pybind11/pybind11.h>
    #include <pybind11/include/pybind11/embed.h>
    #include <YourPlugin.hh>
    #include <OpenFlipper/BasePlugin/PythonFunctions.hh>
    namespace py = pybind11;
    PYBIND11_EMBEDDED_MODULE(YourPlugin, m) { // yourPlugin will will be the module name in Python ( ... import yourPlugin )
    QObject* pluginPointer = getPluginPointer("Your"); // This will retrieve your plugin instance pointer. The name is the plugin name set via the name() function.
    // Export our plugin. Make sure that the c++ worlds core object is not deleted if
    // the python side gets deleted!!
    py::class_< YourPlugin,std::unique_ptr<YourPlugin, py::nodelete> > plugin(m, "Your"); // This will provide you with the existing instance of your plugin in Python.
    // On the c++ side we will just return the existing core instance
    // and prevent the system to recreate a new core as we need
    // to work on the existing one.
    plugin.def(py::init([&pluginPointer]() { return qobject_cast<YourPlugin*>(pluginPointer); })); // This will provide you with the existing instance of your plugin in Python.
    plugin.def("viewAll", static_cast<void (YourPlugin::*)()>(&YourPlugin::viewAll),"Change View in all viewers to view whole scene"); // Example export of an overloaded member function
    plugin.def("viewAll", static_cast<void (ViewControlPlugin::*)(int)>(&YourPlugin::viewAll),"Change View in given viewer to view whole scene",py::arg("Id of the viewer which should be switched") ); // Example export of an overloaded member function
    plugin.def("orthographicProjection", static_cast<void (ViewControlPlugin::*)()>(&ViewControlPlugin::orthographicProjection) ); // simple export example
    }