What Is STEP?
STEP — Standard for the Exchange of Product model data — is the ISO 10303 international standard for representing and exchanging 3D product data. Developed throughout the 1980s and 1990s and first published as an ISO standard in 1994, STEP is the dominant format for transferring CAD models between different software systems in engineering, manufacturing, architecture, and aerospace.
STEP files use the .step or .stp extension and contain precise geometric representations that go far beyond the triangulated mesh formats used in visualization (STL, OBJ, PLY). STEP captures exact geometry using mathematical descriptions: B-spline surfaces, NURBS curves, and boundary representation (B-rep) solids that can be re-edited in any CAD package with full fidelity.
STEP Application Protocols
STEP is not a single format but a family of Application Protocols (APs), each defining a subset of data for a specific domain:
| Protocol | Domain | Status |
|---|---|---|
| AP203 | Configuration-controlled design (basic mechanical) | Widely supported |
| AP214 | Automotive design (with color, material) | Common in automotive |
| AP242 | Managed model-based 3D engineering (superset of 203+214) | Modern standard |
| AP209 | Composite and metallic structural analysis | Aerospace/FEA |
| AP219 | Casted parts design | Foundry |
For general use, AP214 or AP242 are recommended. AP203 lacks color and material properties; AP242 adds GD&T (Geometric Dimensioning and Tolerancing) and model-based definition support.
STEP File Structure
A STEP file is a plain-text file with two sections:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('Product Design'), '2;1');
FILE_NAME('bracket.stp','2024-04-15T14:30:00',('Alice Smith'),('ACME Corp'),'FreeCAD','FreeCAD','');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
ENDSEC;
DATA;
#1 = PRODUCT_CONTEXT('',#2,'mechanical');
#2 = APPLICATION_CONTEXT('automotive design');
#3 = PRODUCT('Bracket','Mounting Bracket','',( #4 ));
#4 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
#5 = PRODUCT_DEFINITION('design','',#3,#4);
...
#150 = ADVANCED_FACE('',(#151,#155,#160),#200,.T.);
#200 = PLANE('',#201);
#201 = AXIS2_PLACEMENT_3D('',#202,#203,#204);
#202 = CARTESIAN_POINT('',(0.,0.,0.));
...
#999 = CLOSED_SHELL('',(#150,#160,#170,...));
#1000 = MANIFOLD_SOLID_BREP('Bracket',#999);
ENDSEC;
END-ISO-10303-21;
Key STEP entities:
CARTESIAN_POINT— 3D coordinate (x, y, z)DIRECTION— Unit vectorAXIS2_PLACEMENT_3D— Coordinate system (origin + two axes)PLANE— Infinite planar surfaceCYLINDRICAL_SURFACE— Cylinder surface (origin + radius)B_SPLINE_SURFACE_WITH_KNOTS— NURBS surface for complex shapesEDGE_LOOP— Closed loop of edges bounding a faceADVANCED_FACE— A bounded surface (face in B-rep)CLOSED_SHELL— Collection of faces forming a closed solidMANIFOLD_SOLID_BREP— The solid body
STEP vs STL vs DXF: When to Use Each
| Aspect | STEP | STL | DXF |
|---|---|---|---|
| Geometry type | Exact B-rep (NURBS) | Triangulated mesh | 2D/3D CAD entities |
| Re-editable in CAD | Yes (fully parametric) | No (triangles only) | Yes (2D) |
| Colors/materials | Yes (AP214/AP242) | No | Layers/colors |
| Assembly support | Yes | No | Blocks |
| GD&T/tolerances | Yes (AP242) | No | Yes (DIMENSION entity) |
| File size | Medium | Small | Small |
| 3D printing | Via conversion to STL | Direct | No |
| Manufacturing | Standard for CNC, EDM, QC | Not used | CNC (2D/2.5D) |
| Open standard | Yes (ISO) | Yes (de facto) | Yes (Autodesk) |
| Python library | PythonOCC, steptools | trimesh, numpy-stl | ezdxf |
Use STEP when:
- Transferring mechanical designs between CAD packages (Fusion 360 → FreeCAD → SolidWorks → CATIA)
- Preserving curved surfaces without tessellation loss
- Sharing models for CNC machining (exact geometry needed for toolpath calculation)
- Archiving official product design documentation
Use STL when: 3D printing or visual preview Use DXF when: 2D/2.5D CNC or laser cutting
Working with STEP in Python
FreeCAD Python API
FreeCAD is the leading open-source CAD application and provides a full Python API:
import FreeCAD
import Part
def inspect_step_file(filepath: str) -> dict:
"""Load a STEP file and report solid bodies and faces."""
shape = Part.read(filepath)
solids = shape.Solids
faces = shape.Faces
edges = shape.Edges
vertices = shape.Vertexes
print(f"STEP file: {filepath}")
print(f" Solids: {len(solids)}")
print(f" Faces: {len(faces)}")
print(f" Edges: {len(edges)}")
print(f" Vertices: {len(vertices)}")
# Bounding box
bb = shape.BoundBox
print(f" Bounding box: {bb.XLength:.2f} × {bb.YLength:.2f} × {bb.ZLength:.2f} mm")
print(f" Volume: {shape.Volume:.2f} mm³")
return {
'solids': len(solids),
'faces': len(faces),
'volume_mm3': shape.Volume,
}
# Must be run within FreeCAD's Python environment
info = inspect_step_file('/path/to/bracket.step')
Converting STEP to STL with FreeCAD
import FreeCAD
import Part
import Mesh
def step_to_stl(
step_path: str,
stl_path: str,
linear_deflection: float = 0.1, # mesh precision (mm)
angular_deflection: float = 0.5, # angle in degrees
) -> None:
"""
Convert a STEP file to STL using FreeCAD's mesh tessellation.
Args:
linear_deflection: Maximum distance between mesh and surface (mm).
Smaller = finer mesh, larger file.
angular_deflection: Maximum angle between adjacent triangles (degrees).
"""
shape = Part.read(step_path)
# Tessellate the B-rep surface into triangles
mesh = Mesh.Mesh()
mesh.addMesh(MeshPart.meshFromShape(
shape,
LinearDeflection=linear_deflection,
AngularDeflection=angular_deflection * 3.14159 / 180.0,
Relative=False,
))
mesh.write(stl_path)
print(f"STL saved: {stl_path}")
print(f" Triangles: {mesh.CountFacets:,}")
step_to_stl('bracket.step', 'bracket.stl', linear_deflection=0.05)
Using cadquery for Programmatic STEP Generation
cadquery is a Python library for parametric CAD modeling that exports to STEP:
pip install cadquery
import cadquery as cq
def create_bracket_step(output_path: str) -> None:
"""Create a simple mounting bracket and export as STEP."""
# Create base plate
result = (
cq.Workplane("XY")
.box(100, 60, 5) # 100×60×5 mm base
.faces(">Z") # top face
.workplane()
.rect(80, 40) # rectangle for holes
.vertices()
.hole(5) # 5mm diameter holes at corners
.edges("|Z")
.fillet(3) # 3mm fillet on vertical edges
)
# Export to STEP
result.val().exportStep(output_path)
print(f"STEP saved: {output_path}")
create_bracket_step('bracket.step')
Reading STEP Metadata with steptools
pip install steptools
from steptools import model
def read_step_metadata(filepath: str) -> dict:
"""Extract metadata from STEP file header."""
m = model.read(filepath)
return {
'filename': m.filename,
'description': m.description,
'author': m.author,
'organization': m.organization,
'timestamp': m.timestamp,
'schema': m.schema,
}
meta = read_step_metadata('product.step')
print(meta)
STEP in Manufacturing Workflows
STEP is central to modern Model-Based Definition (MBD) workflows where the 3D model IS the authoritative engineering document (replacing 2D drawings):
- Design — Engineer creates B-rep solid in Fusion 360, SolidWorks, or CATIA
- Export STEP — With AP242 preserving GD&T annotations, material specs, and PMI
- Import to CAM — CNC programming software (Mastercam, Hypermill, HSMWorks) reads STEP for toolpath planning
- Import to CMM — Coordinate measuring machine software imports STEP for QC inspection planning
- Archive — STEP AP242 as the long-term archival format (ISO compliant, software-agnostic)
The STEP exchange chain ensures that the machinist's CAM software, the quality engineer's CMM, and the customer's review tool all work from the same authoritative geometry.
Related conversions
Frequent conversions across the catalogue: