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
```

which outputs:

```
'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 `Name`

.

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!

### Vertex Indices

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.

### Examples

Creating an `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)
```

Creating a `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)
```

Creating a `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)
```