How to convert STEP to STL
- Load the STEP assemblySelect a .step or .stp file. The parser reads ISO 10303 Part 21 entities such as manifold_solid_brep, advanced_face, edge curves and product definitions, reconstructing the exact NURBS surfaces and the named assembly tree before any triangle is produced.
- Pick a deflection presetChoose Draft, Standard, Fine or Max. Each level fixes a linear chord tolerance and an angular tolerance; coarser presets emit fewer triangles, while finer ones shrink the gap between a curved face and its faceted approximation.
- Tessellate the B-repThe OpenCascade WebAssembly kernel walks each trimmed face and subdivides it until both deflection bounds are met, emitting a set of triangles whose vertex normals are sampled from the underlying analytic surface.
- Flatten into one meshAll generated triangles are merged into a single BufferGeometry holding only position and normal attributes. Materials, texture coordinates, groups, part names and the assembly hierarchy are dropped at this stage.
- Serialize binary STLThe exporter writes an 80-byte header, a 32-bit little-endian facet count, then 50 bytes per facet, namely twelve 32-bit floats for the normal and three vertices plus a uint16 attribute word, and returns the .stl blob.
What happens when STEP is converted to STL
What a STEP file actually contains
A STEP exchange file is a text document governed by ISO 10303, most often the AP203, AP214 or AP242 application protocols. Rather than storing a mesh, it records exact boundary-representation geometry: advanced_face entities bounded by trimmed NURBS patches, edge curves, vertices, closed shells and manifold solids. Product definitions give parts names and an assembly hierarchy, and AP214 or AP242 can attach colour assignments to faces. AP242 additionally carries product and manufacturing information (PMI) such as geometric tolerances and annotations. None of these constructs is a triangle, so a downstream mesh format like STL cannot represent them directly; the surfaces must first be discretised.
Why exact surfaces need tessellation
STL knows only planar triangular facets, whereas a STEP solid may be built from cylinders, spheres, tori, B-spline surfaces and trimmed patches. To bridge that gap the OpenCascade WebAssembly kernel performs a meshing pass over the B-rep. It is governed by two tolerances: a linear deflection that caps the chord height between a curve and its polyline approximation, and an angular deflection, expressed in radians, that limits how far adjacent segment normals may diverge. Each face is subdivided until both bounds hold, producing a triangle set that approximates the analytic surface. The result is deliberately lossy, since curvature is replaced by chords, but it is the only representation STL can encode.
Four presets and the triangle-count trade-off
The converter exposes Draft, Standard, Fine and Max, which select progressively stricter chord and angular tolerances. Draft accepts a relatively large chord error and yields a coarse mesh with few triangles, which keeps the .stl small but leaves visible faceting on rounded features. Max tightens both bounds, so tightly curved regions spawn many small triangles and the silhouette tracks the original NURBS surface closely. Because facet count drives file size linearly, with each triangle costing a fixed 50 bytes, choosing a level is a direct trade between geometric fidelity and output weight. The same preset governs the whole model; there is no per-face control.
Flattening before serialization
Regardless of how many solids or sub-assemblies the STEP file held, the exporter concatenates every tessellated triangle into one BufferGeometry. That geometry carries exactly two attributes, position and normal, and nothing else: no index buffer of shared vertices is required for STL, no material, no UV set, no groups and no transformation stack survive. Assembly placement matrices are baked into the vertex coordinates, so parts that were separate products in the source become indistinguishable triangles in a single flat soup. This collapse is what makes the STL a pure triangle list, and it is also why hierarchy and part identity are irrecoverable after export.
Inside the binary STL record
Binary STL has a rigid, almost headerless layout. It opens with an arbitrary 80-byte header, commonly used for a text label but ignored by readers, followed by a 32-bit unsigned integer giving the number of facets. Each facet then occupies exactly 50 bytes: a normal vector of three 32-bit floats, three vertex vectors of three floats each, and a final unsigned 16-bit attribute byte count that is normally zero. That is twelve floats plus one short integer per triangle. Because the facet count is a 32-bit field, a single file tops out at roughly four billion facets; more practically, the fixed 50-byte record is why triangle count and file size move in lockstep.
Facet normals and watertightness
Every STL facet stores its own normal vector, computed from the winding of its three vertices rather than copied from a smoothing group. Adjacent triangles over a once-smooth cylinder therefore carry slightly different normals, giving the classic faceted shading that coarse deflection accentuates. The format has no explicit topology: vertices are repeated per facet, so the consumer must weld coordinates within a tolerance to discover shared edges and test for a closed, manifold shell. Where tessellation leaves a sliver gap along a trimmed edge, or where two shells meet, the resulting mesh may be non-watertight and require repair in a slicer before it can be printed.
STEP vs STL
| STEP source (B-rep) | Binary STL output | |
|---|---|---|
| characteristic | STEP (B-rep) | STL (binary) |
| Geometry basis | Exact NURBS surfaces and trimmed faces | Planar triangular facets |
| Units | Declared (mm, inch, etc.) via SI unit | None; bare float coordinates |
| Colour / appearance | Names and RGB colours in AP214/AP242 | None; attribute word zero |
| Assembly structure | Named product hierarchy with placements | Single flat triangle list |
| Normals | Implicit analytic surface normals | One explicit vector per facet |
| Vertex sharing | Shared topological edges and vertices | Duplicated three vertices per facet |
| File layout | ISO 10303 Part 21 text entities | 80-byte header + uint32 count + 50-byte records |
| Parametric history | Feature tree and constraints | None; snapshot only |
| Textures / UVs | Optional presentation data | Not representable |
Supported formats
| Format | Read | Write | Notes |
|---|---|---|---|
| STEP (.step .stp) | Yes | – | ISO 10303 B-rep, AP203 / AP214 / AP242 |
| IGES (.iges .igs) | Yes | – | Entity-based surfaces, up to 5.3 |
| BREP (.brep) | Yes | – | OpenCascade native B-rep |
| STL (.stl) | Yes | Yes | Binary and ASCII triangles, no units |
| OBJ (.obj) | Yes | Yes | v / vn / f records; .mtl references ignored |
| PLY (.ply) | Yes | Yes | Binary position and normal arrays |
| GLB / glTF (.glb .gltf) | Yes | Yes | glTF 2.0, binary or JSON with data URI |
| 3MF (.3mf) | Yes | Yes | OPC/ZIP package, declares millimetres |
| FBX (.fbx) | Yes | – | Binary and ASCII, static mesh only |
| DAE (.dae) | Yes | – | Collada scene graph is flattened |
| 3DS (.3ds) | Yes | – | Legacy chunk-based 3D Studio format |
| AMF (.amf) | Yes | – | XML, ZIP-compressed packages supported |
| USDZ (.usdz) | Yes | Yes | ZIP containing a USD stage |
Known limitations and why a conversion can fail
No physical units are carried
Although the STEP source can name its measurement unit, the emitted STL stores raw 32-bit coordinates with no scale metadata of any kind. Slicers conventionally assume those magnitudes are millimetres, which is usually correct for mechanical parts but fails for a model authored in inches, metres or micrometres. There is no field in the 80-byte header or the 50-byte facet where a unit string could live, and the exporter does not rescale coordinates to compensate. Confirming the overall bounding box in the receiving application is the only dependable check, and any correction must be applied as a manual scale on import.
Colour, material and texture data are gone
STEP AP214 and AP242 can bind RGB colours, transparency and material names to individual faces or parts, but a binary STL facet has exactly one spare field, the uint16 attribute count, which carries no standard colour meaning. The converter writes it as zero. Some tools stash a 16-bit RGB value in the attribute word, but this exporter leaves it clear rather than adopting that non-standard convention. Combined with the flattening into a single BufferGeometry that holds only position and normal arrays, there is nowhere to attach per-face appearance, UV coordinates or a material library. The resulting mesh is uniformly uncoloured geometry; any shading seen later is a viewer default, not exported data.
Assembly structure and names do not survive
A STEP assembly is a tree of product definitions, each with a name, a placement transform and references to child components. STL has no object, group or node concept, since it is a flat sequence of triangles. Because the exporter fuses every solid into one mesh and bakes transforms into vertex positions, bolts, housings and sub-assemblies become an undifferentiated soup from which the original part boundaries cannot be reconstructed. PMI annotations, face names and the bill of materials are likewise discarded. Users who need separated components must export each part individually rather than relying on a single combined file.
Exact geometry and design history are lost
Conversion is a one-way approximation. Cylindrical bores, fillets and freeform NURBS patches are replaced by planar chords whose deviation is bounded by the chosen deflection preset, so a nominally perfect circle becomes a many-sided polygon. Parametric dimensions, feature trees, constraints and the ability to roll back an edit are absent from STL; the triangle list is a snapshot, not a model. Re-importing it into a CAD system yields a faceted mesh that must be reverse-engineered or re-authored. Fine presets reduce but never eliminate this chord error, and they do so at the cost of proportionally larger files.
Mesh closure is not guaranteed
Tessellation can leave a binary STL that is technically non-manifold. Along a shared trimmed edge between two faces, independent meshing may produce vertices that differ by a tiny floating-point amount, opening a microscopic crack. Self-intersecting shells, degenerate zero-area triangles or coincident facets from overlapping solids can also appear. Because facet vertices are duplicated and normals are per-facet, the format offers no topology to detect these problems; a slicer must weld near-coincident points and may report errors or fill gaps heuristically. Choosing a finer deflection reduces slivers but cannot certify watertightness for an arbitrary STEP assembly.
Frequently asked questions
What units does the exported STL use?
STL stores dimensionless 32-bit floats with no unit declaration, so the numbers are whatever the STEP coordinates were after tessellation, and the converter does not add a scale or a unit tag. Slicers and most mesh viewers assume millimetres by convention, which matches the typical mechanical STEP file. If the source was authored in inches, the printed part will be about 25.4 times too small unless you scale it on import. Always measure the bounding box in the receiving tool to confirm physical size.
Does the STL keep the colours from my STEP file?
No. AP214 and AP242 colour assignments, transparency and material names are dropped during flattening, because the merged BufferGeometry carries only position and normal attributes and a binary STL facet has no colour channel. The spare uint16 attribute word is written as zero, and no .mtl-style sidecar exists for STL. What you see in a viewer is a default single-colour shading applied by that program, not data embedded in the file.
Is the resulting mesh watertight and printable?
The exporter does not certify a closed manifold shell. Triangles are generated face by face, so adjacent patches can end at slightly different coordinates, leaving sub-micron cracks along shared edges; overlapping solids may also produce coincident facets. Since binary STL repeats vertices per facet and stores no connectivity, a slicer has to weld near-equal points itself and may flag or repair defects. A finer deflection preset reduces sliver triangles but cannot guarantee watertightness for every assembly.
How does the deflection preset change the file?
Draft, Standard, Fine and Max set the linear chord tolerance and angular tolerance that the OpenCascade WebAssembly kernel uses when subdividing curved faces. A tighter bound produces more, smaller triangles, so the surface tracks the original NURBS patch more closely and faceting becomes less visible. Because each triangle costs a fixed 50 bytes in binary STL, finer presets grow the file roughly in proportion to facet count. There is no per-face adjustment; one preset governs the entire model.
Are assembly parts kept as separate objects?
No. A STEP product tree with named components and placement matrices is flattened into a single BufferGeometry before writing, and those transforms are baked into the vertex coordinates. STL has no group, object or node records, so bolts, brackets and housings merge into one undifferentiated triangle list. Part names, the bill of materials and AP242 PMI annotations are all discarded. To keep components distinct, export them one at a time instead of using a combined assembly file.
Do the STL facets carry surface normals?
Yes, each of the 50-byte facet records begins with a normal vector of three 32-bit floats, computed from the triangle winding during tessellation. These are per-facet normals, not smoothed per-vertex normals, so a curved region shows faceted shading that coarse deflection exaggerates. The flat BufferGeometry supplies a normal attribute, but that data is written out as one normal per triangle rather than as shared vertex normals, which is all the binary STL layout permits.
Can I recover STEP features after exporting?
Not from the STL itself. Parametric dimensions, sketches, constraints, feature history and exact analytic surfaces such as cylinders and B-spline patches are replaced by planar triangles bounded by the chosen chord error. The file is a static snapshot with no design tree to roll back. Re-importing into CAD gives a faceted mesh that must be reverse-engineered or rebuilt from scratch, so always retain the original .step document as the editable master.
Is the output ASCII or binary STL?
The converter produces binary STL, the compact layout with an 80-byte header, a 32-bit facet count and a stream of fixed 50-byte records. It does not emit the verbose ASCII variant built from facet normal and outer loop keywords. Binary is the natural target because the tessellated triangle count can be large, and the fixed record size keeps parsing trivial for slicers. Every facet still holds one normal, three vertices and a zeroed attribute word.
Related converters
All converters
Last updated: