Exposing Cplusplus to Python

How to expose c++ functionality to Python
It becomes necessary at times to expand the FreeCAD API further by exposing functions that are available in the source code in c++ to the python. In so doing, providing an ability to trigger deep internal functionality with Python in real-time instead of needing to compile.

Below is an explanation of how one can achieve this.

The basic structure of a program to expose functionality to Python is something like this:


 * get the Py object parameters and convert them to c++ variables using PyArg_ParseTuple,
 * use various c++ routines from OpenCascade and/or FreeCAD to produce the desired result,
 * convert the c++ result into Py object using routines like PyLong_AsLong, Py::asObject, etc,
 * return the Py object.

Further Elaboration
There are two source files required to implement a new Python binding. Assuming we wanted to expose some methods from FreeCAD/src/Mod/Part/TopoShape.cpp</tt>, we would need to make:
 * TopoShapePy.xml</tt> - definitions of the functions for be exposed in XML format. This file is used to generate header files for our next file...
 * TopoShapePyImp.cpp</tt> - the actual C++ code that bridges from Python to C++.

These 2 files need to be added to ../Mod/yourModule/App/CMakeLists.txt</tt>. See FreeCAD/src/Mod/Part/App/CMakeLists.txt</tt> for an example.

You can extend the Python version of your module by adding to ../Mod/yourModule/App/AppmyModulePy.cpp</tt> (see FreeCAD/src/Mod/Part/AppPartPy.cpp</tt>). The additions are accessed in Python by "import myModule</tt>".

Note:
 * 1) xxxxxPyImp</tt> routines return a PyObject*</tt> pointer (see TopoShapePyImp.cpp</tt>)
 * 2) AppmyModulePy.cpp</tt> routines return a Py::Object</tt> (see FreeCAD/src/Mod/Part/AppPartPy.cpp</tt>).

Related Links

 * Source: https://forum.freecadweb.org/viewtopic.php?p=314796#p314617
 * Forum discussion: Adding Commands in Python to C++ Workbench
 * Workbench creation