I’ve been developing a FreeCAD macro for a while with the following aims:

  • Get to grips with FreeCAD and parametric modelling concepts: sketches, constraints, datum planes etc.
  • Learn Python and use it for FreeCAD scripting

To really push the boundaries, I challenged myself to use Python scripting in conjunction with the PartDesign workbench: I wanted to end up with a parametric model fully based on sketches and datum planes.


There are several limitations when referencing items in FreeCAD via Python script. This includes needing to reference Part items such as edges and faces by name, whilst the names are liable (and likely) to change each time the model is modified.

There are also a number of exposed native methods in the Python scripting layer which expect (rarely documented) integer based constants. In this post I collate what I’ve learnt about these constants for future reference.

Beyond simple scripts, FreeCAD macro development really benefits from using a Python IDE. My Python IDE of choice is PyCharm.

I have been able to setup the same Python environment with FreeCAD and PyCharm using this great project https://github.com/FreeCAD/FreeCAD_Conda.

This allows the same Python syntax and semantics to be applied (especially important when switching from Python 2 to Python 3). Unfortunately however, having code completion for FreeCAD modules still eludes me…


I’ve been developing a fairly complex macro for FreeCAD and wanted to re-run it after making code changes without having to restart FreeCAD.

I found this forum posting which gave me the answer.

This post was discussing reloading code for workbenches and GUI Commands (which has some caveats) and it also works perfectly for macros.


I’ve been developing a fairly complex macro for FreeCAD and wanted to split the code out into a module with separate files.


I’ve been writing a Python macro for FreeCAD as a learning exercise on both subjects. I thought it would be nice to display the Circled Information Source unicode character as a tooltip icon in a GUI form. It looks like this: 🛈 (if your current viewing font supports it).

After attempting this for a couple of hours, I wanted to stop learning Python and head back to Java…