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.
Body Origin Axes and Planes
The Origin of a Part Design workbench Body called
myBody can be acquired via:
origin = App.getDocument('Unnamed').getObject('myBody').Origin
The axes and planes for this Origin are available as
OriginFeatures which can be identified as follows:
for feat in b.Origin.OriginFeatures: feat.Name
'X_Axis' 'Y_Axis' 'Z_Axis' 'XY_Plane' 'XZ_Plane' 'YZ_Plane'
Hence to get a reference to one of these you can iterate through
OriginFeatures matching against the desired feature
However if you want to live dangerously, you can rely on indexing into the array of
OriginFeatures with these values:
ORIGIN_X_AXIS_INDEX = 0 ORIGIN_Y_AXIS_INDEX = 1 ORIGIN_Z_AXIS_INDEX = 2 ORIGIN_XY_PLANE_INDEX = 3 ORIGIN_XZ_PLANE_INDEX = 4 ORIGIN_YZ_PLANE_INDEX = 5
The risk here is that the native code layer
OriginFeatures array order may change between FreeCAD releases.
Sketch Geometry and Constraints
Geometry Item Indices
Special indices are defined as follows:
- Horizontal axis: -1
- Vertical axis: -2
- First external geometry construction item: -3.
Hence, external geometry constructions items in a sketch are indexed from -3 descending!
The start vertex of a geometry line segment has index 1 and the end vertex has index 2.
The centre vertex of a geometry circle is index 3.
DistanceX constraint between a line segment start and the origin point:
SKETCH_GEOMETRY_VERTEX_START_INDEX = 1 SKETCH_GEOMETRY_ITEM_HORIZONTAL_AXIS_INDEX = -1 my_constraint = Sketcher.Constraint("DistanceX", segment_index, SKETCH_GEOMETRY_VERTEX_START_INDEX, SKETCH_GEOMETRY_ITEM_HORIZONTAL_AXIS_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, distance)
PointOnObject constraint between a line segment start and an external item used as a geometry construction item:
SKETCH_GEOMETRY_VERTEX_START_INDEX = 1 SKETCH_GEOMETRY_FIRST_CONSTRUCTION_INDEX = -3 my_sketch.addExternal(my_datum_plane.Label, '') my_constraint = Sketcher.Constraint("PointOnObject", segment_index, SKETCH_GEOMETRY_VERTEX_START_INDEX, SKETCH_GEOMETRY_FIRST_CONSTRUCTION_INDEX)
DistanceY constraint between the centre of a circle and the origin point:
SKETCH_GEOMETRY_VERTEX_START_INDEX = 1 SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX = 3 SKETCH_GEOMETRY_ITEM_HORIZONTAL_AXIS_INDEX = -1 my_constraint = Sketcher.Constraint("DistanceY", segment_index, SKETCH_GEOMETRY_VERTEX_CENTRE_INDEX, SKETCH_GEOMETRY_ITEM_HORIZONTAL_AXIS_INDEX, SKETCH_GEOMETRY_VERTEX_START_INDEX, distance)