diff --git a/chapters/1.FreeCAD_overview_architecture.md b/chapters/1.FreeCAD_overview_architecture.md index ec1e497..61dc48c 100755 --- a/chapters/1.FreeCAD_overview_architecture.md +++ b/chapters/1.FreeCAD_overview_architecture.md @@ -1,11 +1,11 @@ # FreeCAD overview and architecture -First of all, thanks to the original developers (**Jürgen Riegel, Werner Mayer, Yorik van Havre**), for sharing this great artwork freely. FreeCAD is released under LGPL license, free for commercial usage with dynamic linkage. +First of all, thanks to the original developers (**Jürgen Riegel, Werner Mayer, Yorik van Havre**), for sharing this great artwork freely. FreeCAD is released under the LGPL license, free for commercial usage with dynamic linkage. ## Introduction to FreeCAD -The birth of FreeCAD: version 0.0.1 uploaded by [Jürgen Riegel](https://wiki.freecadweb.org/User:Jriegel) October 29, 2002 Initial Upload +The birth of FreeCAD is marked by the release of version 0.0.1 by [Jürgen Riegel](https://wiki.freecadweb.org/User:Jriegel) on October 29, 2002. The FreeCAD [Wikipedia](https://en.wikipedia.org/wiki/FreeCAD) page. @@ -36,28 +36,28 @@ https://github.com/joelgraff/pivy-trackers ### Key software libraries -see FreeCAD source code structure in [Chapter 2](2.FreeCAD_source_code_structure.md) +See FreeCAD source code structure in [Chapter 2](2.FreeCAD_source_code_structure.md) *standing on giant's shoulder* - OpenCASCADE as CAD kernel - OpenInventor/Coin3D/pivy for 3D scene rendering -- Qt and 'Qt for Python' (aka PySide2) for GUI +- Qt and 'Qt for Python' (aka PySide2) for the graphical user interface (GUI) - Python scripting and wrapping: PyCXX, swig, boost.python - Other powerful software libraries like Xerces XML, boost -The geometry algorithm using OpenCASCADE will be discussed in [Chapter 7](7.FreeCAD_CAD_modules.md). +The geometry algorithms using OpenCASCADE will be discussed in [Chapter 7](7.FreeCAD_CAD_modules.md). ### Mixed Python and c++ * Python scripting in console mode and python-based macro recording in GUI mode -* All FreeCAD class is derived from this *BaseClass*, connected with *BaseClassPy* +* All FreeCAD classes are derived from this *BaseClass*, connected with *BaseClassPy* * c++11 is not extensively used before 0.17 -* c++ template is not heavily used, but `FeatureT<>` make `DocumentObject, ViewProvider` extensible in Python -* FreeCAD not tied to Qt system until GUI, `Boost::signal` is used in command line mode: FreeCADCmd -* `std::string`(UTF8) is used internally, using `QString getString(){QString.fromUtf8(s.c_str())}` -* c++ for most of time consuming task (threading model), to avoid bottleneck of Global Interpreter Lock +* c++ templates are not heavily used, but `FeatureT<>` make `DocumentObject, ViewProvider` extensible in Python +* FreeCAD not tied to Qt system unless GUI is used, `Boost::signal` is used in command line mode: FreeCADCmd +* `std::string`(UTF8) is used internally, using `QString getString(){QString.fromUtf8(s.c_str())}`. This removes unnecessary coupling to Qt. +* c++ is used for most of time consuming task (threading model) and to avoid bottleneck of Global Interpreter Lock Mixing c++ and Python in module development will be discussed in [Chapter 5](5.FreeCAD_Python_wrapping.md). @@ -65,23 +65,20 @@ Mixing c++ and Python in module development will be discussed in [Chapter 5](5.F -Current FreeCAD policy is to include only LGPL software and no GPL by default. Mentioned DXF import-export libraries were downloaded by default. On DXF import-export operation in the past but Debian didn't like that and FreeCAD changed in a way user has to manually enable (Opt-In) the download. - -Open **Draft** workbench and after that select *Edit -> Preferences*. Under *Import-Export -> DXF / DWG* tab, enable *Automatic update*. After that FreeCAD will download mentioned libraries on first DXF import-export operation and it should work. If it does not work restart FreeCAD and try again. - +Current FreeCAD policy is to include only LGPL software and no GPL by default. Mentioned DXF import-export libraries were downloaded by default. On DXF import-export operation in the past but Debian didn't like that and FreeCAD changed in a way that the user has to manually enable (Opt-In) the download. +Open **Draft** workbench and after that select *Edit -> Preferences*. Under *Import-Export -> DXF / DWG* tab, enable *Automatic update*. After that FreeCAD will download mentioned libraries on first DXF import-export operation and it should work. If it does not work, restart FreeCAD and try again. ### Funding condition -It is still unofficially driven by community, developed by developers in free time, yet any foundation established. - - +It is still unofficially driven by community, developed by developers in free time. A foundation is being setup as of 2022. ## How 3D model are rendered -The geometry that appears in the 3D views of FreeCAD are rendered by the Coin3D library. Coin3D is an implementation of the OpenInventor standard, which exempt you from OpenGL coding. -see [FreeCAD wiki on OpenInventor Scenegraph](https://www.freecadweb.org/wiki/Scenegraph). Some other examples of 3D rendering: +The geometry that appears in the 3D views of FreeCAD are rendered by the Coin3D library. Coin3D is an implementation of the OpenInventor standard, which relieves the developer of manually using the low-level OpenGL API. + +See [FreeCAD wiki on OpenInventor Scenegraph](https://www.freecadweb.org/wiki/Scenegraph). Some other examples of 3D rendering: [Civil engineering feature implementation (Transportation Engineering)](https://www.forum.freecadweb.org/viewtopic.php?f=8&t=22277&p=332557#p332557) @@ -97,26 +94,27 @@ print viewprovider.toString() ### Pivy: Coin3D's Python wrapping -**pivy** is Python wrapper of Coin3D C++ lib, via SWIG -A new `SoPyScript` Node is added to include Python script directly +**pivy** is Python wrapper of Coin3D C++ lib, via SWIG. A new `SoPyScript` Node is added to include Python script directly [pivy trackers](https://github.com/joelgraff/pivy-trackers) - A small python library of pivy/coin3D-based objects for rendering lines / nodes at the scenegraph level for user interface feedback. Implemented originally as a part of the FreeCAD Trails Workbench. -### Selection of 3D visualization library +### Selection of 3D visualization libraries -OpenCASCADE, as a CAD kernel, did not render 3D object to screen (when FreeCAD was born in 2002) until recently release. Currently, there are several 3D lib based on OpenGL, see a list that works with QT . 3D gaming engines can also been used to render 3D objects, such as OGRE(Object-Oriented Graphics Rendering Engine), Unreal, Unity. +OpenCASCADE, FreeCAD's CAD kernel, did not render 3D object to screen until recently. Since FreeCAD was born in 2002, it had to come with its own rendering code. Currently, there are several 3D rendering libraries based on OpenGL. For a list of Qt compatible ones, c.f. . 3D gaming engines could also be used to render 3D objects, examples are OGRE(Object-Oriented Graphics Rendering Engine), Unreal or Unity. -Selection of Open Inventor to render FreeCAD is based on software license and performance consideration. Open Inventor, originally IRIS Inventor, is a C++ object oriented retained mode 3D graphics API designed by SGI to provide a higher layer of programming for OpenGL. Its main goals are better programmer convenience and efficiency. Open Inventor is free and open-source software, subject to the requirements of the GNU Lesser General Public License (LGPL), version 2.1, in Aug 2000. +The choice of Open Inventor as FreeCAD's rendering engine is based on software license and performance consideration. Open Inventor, originally IRIS Inventor, is a C++ object oriented, retained mode, 3D graphics API designed by SGI to provide a higher layer of programming for OpenGL. Its main goals are better programmer convenience and efficiency. Open Inventor is free and open-source software, subject to the requirements of the GNU Lesser General Public License (LGPL), version 2.1, in Aug 2000. -Coin3D implements the same API but not source code with Open Inventor, via clean room implementation compatible Stable release Open Inventor v2.1. Kongsberg ended development of Coin3D in 2011 and released the code under the BSD 3-clause license. It is possible to draw object in OpenInventor Scene by Python, via Coin3D's python wrapper *pivy* , see +Coin3D implements the same API but does not share source code with Open Inventor. It is a clean room implementation compatible with the Open Inventor v2.1 API. The company Kongsberg ended development of Coin3D in 2011 and released the code under the BSD 3-clause license. It is possible to draw object in OpenInventor Scene from Python, via Coin3D's python wrapper *pivy*, see . VTK, is another open source and cross-platform visualization library, which ParaView is based on. Interoperation is possible, see -[Method for converting output from the VTK pipeline into Inventor nodes](https://www.evl.uic.edu/scharver/vtkoiv.html). From 0.17 and beyond, VTK pipeline is added to Fem m[pivy trackers](https://github.com/joelgraff/pivy-trackers) - A small python library of pivy/coin3D-based objects for rendering lines / nodes at the scenegraph level for user interface feedback. Implemented originally as a part of the FreeCAD Trails Workbench. +[Method for converting output from the VTK pipeline into Inventor nodes](https://www.evl.uic.edu/scharver/vtkoiv.html). From 0.17 and beyond, VTK pipeline is added to the FEM workbench. + +[pivy trackers](https://github.com/joelgraff/pivy-trackers) - A small python library of pivy/coin3D-based objects for rendering lines / nodes at the scenegraph level for user interface feedback. Implemented originally as a part of the FreeCAD Trails Workbench. ### Discussion of 3D rendering library selection on FreeCAD Forum -Here are my questions on 3D rendering library selection, I posted on FreeCAD Forum: +The author's questions on 3D rendering library selection posted on the FreeCAD Forum: > I browse OpenCASCADE doc[1], showing graph of OpenCASCADE source code architecture. It is similar with FreeCAD. Why FreeCAD develops its own Foundation Class, Document controller, Object Tree Structure, etc. There are lot of overlapping. @@ -157,14 +155,14 @@ Transitioning from OpenGL to Vulkan will not happen in the future, while OpenGL ### C++11 -C++ is NOT a easy language but targeting at high performance, you need to manage memory manually and there are a lot of pitfalls, see . Even experienced C++ programmer will find himself/herself has not fully master C++. Exception safety will be beyond layman's brain. +C++ is NOT an easy language but targeting high performance, you need to manage memory manually and there are a lot of pitfalls, see . Even experienced C++ programmer will find themselves not mastering C++ fully. Exception safety is an especially difficult concept to grasp. -Common pitfalls for c++ are exampled in appendix. +Some common pitfalls of C++ are listed in the appendix. -Nevertheless, c++11 is almost a branch new language, or next generation c++. c++11 add some extra keywords like "explicit, overload/final, noexcept" to avoid some unintended mistakes, also introduce new features and extra STL functions like lambda and std::function, constexpr, enum class, smart pointer, auto type derivation, std::thread, atomic, regex etc. +C++11 is almost a brad new language, or next generation c++. It added some extra keywords like "explicit, overload/final, noexcept" to avoid some unintended mistakes and also introduce new features and extra STL functionality like lambda and std::function, constexpr, enum class, smart pointer, auto type derivation, std::thread, atomic, regex etc. ### Pyside 2 project for Qt 5.x -Official LGPL python wrapping for Qt 5.x, pyside2, or Qt for Python, has been released with Qt 5.12. +Official LGPL python wrappers for Qt 5.x, called pyside2 or Qt for Python have been released with Qt 5.12. > The Pyside 2 project aims to provide a complete port of PySide to Qt 5.x. The development started on GitHub in May 2015. The project managed to port Pyside to Qt 5.3, 5.4 & 5.5. During April 2016 The Qt Company decided to properly support the port (see details). diff --git a/chapters/2.FreeCAD_source_code_structure.md b/chapters/2.FreeCAD_source_code_structure.md index 10166b5..13997ba 100755 --- a/chapters/2.FreeCAD_source_code_structure.md +++ b/chapters/2.FreeCAD_source_code_structure.md @@ -1,31 +1,24 @@ # Organization of FreeCAD Source Code -The FreeCAD official repository has the standard github project layout, with README, License, Continuous Integration setup files at the repository root. The FreeCAD [source tree in the `src/` folder](https://github.com/FreeCAD/FreeCAD/tree/master/src/Ext/freecad) reflects its modular design. +The FreeCAD official repository has the standard github project layout, with README, License, Continuous Integration setup files at the repository root. The FreeCAD [source tree](https://github.com/FreeCAD/FreeCAD/tree/master/src/Ext/freecad) found in the `src` directory reflects the applications modular design. ## List of files and folders in FreeCAD source folder [[This section will be generated by python script]] - ## List of modules in FreeCAD Mod folder [[This section will be generated by python script]] - - ## Documentation -### Doxygen generated documents - -The source documentation is generated by **doxygen** from C++ and python source in-code documentation strings. The **doxygen** official website of doxygen project has an excellent documentation on writing in-source document and document generation. FreeCAD project has a dedicate Wiki Doxygen page: https://www.freecadweb.org/wiki/Doxygen +### Doxygen auto-generated documents +The source documentation is generated by **doxygen** from C++ and python source in-code documentation strings. The **doxygen** official website of doxygen project has an excellent documentation on writing in-source document and document generation. FreeCAD project has a dedicate [wiki page](https://www.freecadweb.org/wiki/Doxygen) on doxygen. ![Schematic of documentation generation by doxygen](../images/FreeCAD_doxygen_workflow.png) -The generated doxygen documentation (static html contents) can be found on the author's personal website [Doxygen generated online documentation of source for 0.19dev on 2019-06-24](https://www.iesensor.com/FreeCADDoc/0.19/modules.html) +The generated Doxygen documentation (static html contents) can be found on the author's personal website [Doxygen generated online documentation of source for 0.19dev on 2019-06-24](https://www.iesensor.com/FreeCADDoc/0.19/modules.html) ### FreeCAD wiki - -In addition to doxygen generated source documentation, FreeCAD wiki are anther source of documentation giving more information on topics like software design, specific module. - -https://www.freecadweb.org/wiki/Main_Page +In addition to doxygen generated source documentation, the [FreeCAD wiki](https://www.freecadweb.org/wiki/Main_Page) is another source of documentation giving more information on topics like software design or specific module. There are 3 user hubs @@ -35,36 +28,30 @@ There are 3 user hubs > > [![Crystal Clear app tutorials.png](https://www.freecadweb.org/wiki/images/thumb/0/0b/Crystal_Clear_app_tutorials.png/64px-Crystal_Clear_app_tutorials.png)](https://www.freecadweb.org/wiki/File:Crystal_Clear_app_tutorials.png) [Developers hub](https://www.freecadweb.org/wiki/Developer_hub): This section contains material for developers: How to compile FreeCAD yourself, how the FreeCAD source code is structured and how to navigate in it, and how to develop new workbenches, or embed FreeCAD in your own application. -Among, Developers hub is essential readings for module developers. - - ### User manual +Reading content from the Developers hub is an essential read for module developers. -One of the principal developer, has wrote a proper user manual for FreeCAD version **0.18**. +### User manual +One of the principal developer wrote a user manual for FreeCAD version **0.18**. -> [![Crystal Clear manual.png](https://www.freecadweb.org/wiki/images/thumb/2/2f/Crystal_Clear_manual.png/64px-Crystal_Clear_manual.png)](https://www.freecadweb.org/wiki/File:Crystal_Clear_manual.png) [The FreeCAD manual](https://www.freecadweb.org/wiki/Manual:Introduction) is another, more linear way to present the information contained in this wiki. It is made to be read like a book, and will gently introduce you to many other pages from the hubs above. +> [![Crystal Clear manual.png](https://www.freecadweb.org/wiki/images/thumb/2/2f/Crystal_Clear_manual.png/64px-Crystal_Clear_manual.png)](https://www.freecadweb.org/wiki/File:Crystal_Clear_manual.png) [The FreeCAD manual](https://www.freecadweb.org/wiki/Manual:Introduction) is another, more linear way to present the information contained in this wiki. It is made to be read like a book, and will gently introduce you to many other pages from the hubs above. - - -## Build System for FreeCAD +## FreeCADs build system ### Introduction to CMake - -[CMake](https://cmake.org/) is the cross-platform build tool for FreeCAD. Along with generating the make files that are used to build FC, it also generates the installer for Windows, the DEB/RPM packages for Linux, and an image bundle MacOS X. +[CMake](https://cmake.org/) is the cross-platform build tool used to make FreeCAD executables/binaries. Along with generating the make files that are used to build FreeCAD, it also generates the installer for Windows, the DEB/RPM packages for Linux, and an image bundle for MacOS X. See [Appendix 2 cmake cheatsheet](./A2.cmake_cheatsheet.md) for a quick start on CMake. - ### CMake in FreeCAD +The project top level `CMakeLists.txt` at the repository root is very long, detecting third party libraries and dealing with compiler and OS differences. In contrast, `src/CMakeLists.txt` is much shorter, with `add_directory(subfolder_name)`. -The project top level `CMakeLists.txt` at the repository root is very long, detecting third party library detection and dealing compiler and OS differences. In contrast, [src/CMakeLists.txt] in the source tree is the much shorter, with `add_directory(subfolder_name)`. - -[CMake](https://github.com/FreeCAD/FreeCAD/tree/master/cMake) folder in the repo root is filled with `*.cmake` files to detect libraries. If a new workbench with c++ code is added, then CMake's third parties detection CMake file is probably needed. +[CMake](https://github.com/FreeCAD/FreeCAD/tree/master/cMake) folder in the repo root is filled with `*.cmake` files to detect libraries. If a new workbench with C++ code is added, then CMake's third parties detection CMake file is probably needed. ```shell set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cMake") ``` -The following hypothetical code demonstrates how we can specify with CMake to not build OpenFOAM from source but instead we can just install as a binary. The same can be done for other dependencies like other FEM meshing tools like `netgen`, and `gmsh`. +The following hypothetical code demonstrates how we can specify with CMake to not build OpenFOAM from source but instead we can just install it as a binary. The same can be done for other dependencies like other FEM meshing tools like `netgen`, and `gmsh`. ```shell if(NOT MSVC) @@ -129,98 +116,83 @@ ENDIF(SMESH_LIBRARY) ## Continuous Integration (CI) -Continuous Integration (CI) is basically a paradigm for building and testing automation. -CI is crucial to maintain a software project efficiently. There are several CI tools -that are utilized by FreeCAD. +Continuous Integration (CI) is a paradigm for building and testing automation. +CI is crucial to maintain a software project efficiently. There are several CI tools that are utilized by FreeCAD. ### Travis CI - Travis is tightly integrated with github and it is widely used in the FreeCAD github repo. For more information on how to set Travis CI for a code repository read this [useful guide](https://github.com/dwyl/learn-travis). -Travis uses YAML files. For the Linux and MacOS platform, the main Travis config file for FreeCAD is [.travis.yml](https://github.com/FreeCAD/FreeCAD/blob/master/.travis.yml). Travis CI has experimental support of windows platform, used by FreeCAD 0.19 development. +Travis uses YAML files for configuration. For the Linux and MacOS platform, the main Travis config file for FreeCAD is [.travis.yml](https://github.com/FreeCAD/FreeCAD/blob/master/.travis.yml). Travis CI has experimental support of the windows platform, used by FreeCAD 0.19 development. For Windows, the config file is [.travis/build.bat](https://github.com/FreeCAD/FreeCAD/blob/master/.travis/build.bat). -To understand the process of building on windows, see wiki page: - - +To understand the process of building on windows, see the corresponding [wiki page](https://www.freecadweb.org/wiki/Compile_on_Windows). ### Other CI tools: CircleCI and AppVoyer - Along with Travis, there is a whole ecosystem of CI Software, you can learn learn more about them through a dedicated [Wikipedia page](https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software) [.circleci/config.yml](https://github.com/FreeCAD/FreeCAD/tree/master/.circleci/config.yml) which will pull a docker image to setup testing environment. -FreeCAD project use AppVoyer for building on windows, although it is a cross-platform solution. Sign up and setup github and bitbucket repo is simple, see official document . +FreeCAD project use AppVoyer for building on windows, although it is a cross-platform solution. Sign up and setup github and bitbucket repo is simple, see the official documentation [here](https://www.appveyor.com/docs/). ### arcconfig and phabricator - ```javascript "phabricator.uri" : "http://pha.geofinder.eu/" ``` ### vagrant cloud VM - FreeCAD has a subfolder to setup cloud VM for building and testing ### docker configuration [subuser/freecad-dev](https://github.com/FreeCAD/FreeCAD/blob/master/subuser/freecad-dev) [.subuser.json] adds subuser files for developing freecad within a Docker container. - - - ## Packaging and Deployment -see wiki for binary release of FreeCAD +See [wiki](https://www.freecadweb.org/wiki/Download) for binary release of FreeCAD. ### Linux RPM and Deb, AppImage - -FreeCAD has been in official repo of major Linux distro, but the version may be outdated. For Ubuntu, there is PPA to install the latest or even daily development build. Similarly, there is kind of FreeCAD daily build provided by FreeCAD team for fedora systems. It is recommended for developers to install latest version, especially Qt5+Python3 combination. see instruction of install the latest FreeCAD on the wiki page +FreeCAD has been in the official repositories of major Linux distributions, but these versions are often outdated. For Ubuntu, there is PPA to install the latest or even daily development build. Similarly, there is kind of FreeCAD daily build provided by FreeCAD team for fedora systems. It is recommended for developers to install latest version, especially Qt5+Python3 combination. see instruction of install the latest FreeCAD on the [wiki page](https://www.freecadweb.org/wiki/Install_on_Unix). ### Windows installer - Windows installer is generated by NSIS, and open source windows installer generation tool. Packaging for windows its in another subproject `FreeCADInstProj`, see https://github.com/FreeCAD/FreeCAD/tree/master/src/WindowsInstaller. ### OSX prebuild - The main Travis config file for FreeCAD is [.travis.yml](https://github.com/FreeCAD/FreeCAD/blob/master/.travis.yml). has the deployment section, to build package for OSX. ### Other cross platform package managers - The package folder in the repository root contains the `[conda]()` recipe to build Anaconda package. `Conda` is a popular binary python package (python module compiled from other languages) distribution system. On FreeCAD forum, there is a full list of platforms supproted, [[WIP\] FreeCAD Packagers and Package Status](https://forum.freecadweb.org/viewtopic.php?f=42&t=36818) FreeCAD Dependency Package Ecosystem Tracker https://github.com/luzpaz/FreeCAD-dependencies/ - - ## Learning path -1. be familiar with FreeCAD Gui Operation as a user +1. Become familiar with FreeCAD Gui Operation as a regular application user: -see [FreeCAD wiki user hub](https://www.freecadweb.org/wiki/), tutorials on youtube and [user manual]() +See [FreeCAD wiki user hub](https://www.freecadweb.org/wiki/), tutorials on youtube and [user manual]() -2. be familiar with Python scripting, learning from macro recording. +2. Get familiar with Python scripting, learning from macro recording. The amazing feature of FreeCAD is that all GUI operation is recorded in Python console [FreeCAD wiki power user hub](https://www.freecadweb.org/wiki/Power_users_hub) [FreeCAD wiki developer hub](https://www.freecadweb.org/wiki/Developer_hub) -3. be familiar with key classes in FreeCAD source code: Base, App, Gui, Part +3. Get familiar with key classes in FreeCAD source code: Base, App, Gui, Part + +It is really challenging to code in C++, Python, Coin3D, OpenCASCADE. Fortunately, it is not needed to know about OpenCASCADE as a module developer. +FreeCAD has a online API document for import classes like Properties, Document Objects [here](https://www.freecadweb.org/wiki/Power_users_hub#API_Functions). -It is really challenging to code in C++, Python GIL, Coin3D, OCC. However, it is not needed to know about OCC as module developers. -FreeCAD has a online API document for import classes like Properties, Document Objects, see +To explore the source code, doxygen generated document is available on [here](https://freecad.github.io/SourceDoc/). Furthermore, `Sourcetrail` can also be one of the tools to help in this effort. It is a powerful tool, free for non commercial usage, to explore large softwar projects, see [FreeCAD forum discussion](https://forum.freecadweb.org/viewtopic.php?f=10&t=37386). The software can be downloaded from -To explore the source code, doxygen generated document is available on `iesensor.com`. Furthermore, `Sourcetrail`can also be one of the tools to help in this effort -is a powerful tool, free for non commercial usage, to explore large softwar projects, see [FreeCAD forum discussion](https://forum.freecadweb.org/viewtopic.php?f=10&t=37386). The software can be downloaded from +4. Develop or extend pure Python modules -4. develop/extend pure Python module, the challenging Python wrapping task can be avoided +The challenging Python wrapping task can be avoided -5. develop/extend hybrid C++ and Python module +5. Develop or extend hybrid C++ and Python modules -6. write 3D rendering code, i.e. ViewProvider derived classes +6. Write 3D rendering code, i.e. ViewProvider derived classes ************************************************************************