How to convert CAD to STL
- Drop the CAD fileUse .step, .stp, .iges, .igs or .brep. The bytes stay in the tab: an embedded WebAssembly kernel does the reading, so there is no upload stage, no queue and no account between the drop and the download. Anything else, including .dwg and .dxf, has no reader here and is refused on purpose; .ifc has a reader, but it lives in the full workspace rather than in this box.
- Choose what kind of source you loadedSolid boundary-representation files (STEP, STP, IGES, IGS, BREP) are meshed by the OpenCascade kernel, which sees analytic surfaces and discretises them. IFC is a building model whose elements already contain triangles, so it goes through a different reader in the workspace and behaves differently in three ways described below.
- Pick a tessellation levelFor the solid formats, Draft, Balanced, Fine and Maximum each set a chord deflection and an angular deflection. Coarser means fewer triangles, a smaller file and visible faceting on cylinders and fillets; finer tracks the curved surface more closely at the cost of file weight. This control is inert for IFC.
- Convert and inspect the meshThe kernel walks each face or, for IFC, each element mesh, then every triangle is concatenated into a single geometry holding only vertex positions and normals. Part names, colours, property sets and the assembly hierarchy are dropped at this step, and placements are baked into the coordinates.
- Download and verify scale in the slicerYou receive a binary STL: an 80-byte header, a 32-bit facet count, then exactly 50 bytes per triangle. Measure the bounding box on import, because the format carries no unit and the numbers are whatever the source coordinates happened to be.
What happens when a CAD file becomes an STL
“CAD” is five readable formats plus a building schema
This page is a landing point for a search term, not a single parser. The files it covers split into two families with different machinery behind them. The first is exact solid geometry: .step and .stp are ISO 10303 Part 21 exchange documents; .iges and .igs are the older entity-based surface format; .brep is the native serialisation of the same kernel this site uses. All three go down one code path into the OpenCascade WebAssembly module, which reconstructs trimmed faces, shells and manifold solids and then meshes them. The second family is .ifc, the Industry Foundation Classes schema used by BIM tools. Its geometry is already triangulated inside the file, so a separate reader — web-ifc — streams those meshes out without any deflection decisions being made.
The solid path: STEP, IGES and BREP
A boundary representation describes a volume by its skin. Faces are bounded curves over analytic or NURBS surfaces, edges are shared between faces, and shells close into solids. STL cannot hold any of that, so the kernel performs a meshing pass over each trimmed face: it samples the surface, splits it, and keeps subdividing until the maximum distance between a curved patch and its faceted approximation falls under the linear deflection and adjacent normals stop diverging beyond the angular deflection. That is why one triangle count is not intrinsic to a STEP file — it is a function of the tolerance you chose. The three extensions differ only in how the B-rep gets into the kernel: Part 21 text, IGES entities or the native B-rep form.
The BIM path: IFC arrives pre-triangulated
IFC is semantics first and geometry second. An element such as a wall carries a global ID, a type, a storey relationship, property sets, quantity values and material associations, and only then a shape representation. In practice that representation is frequently a faceted or meshed one rather than an analytic solid, which is what makes IFC behave differently in the converter: the triangles are read, not generated, so the four tessellation levels have no effect and the output resolution is whatever the exporting BIM application decided years ago. The semantic half has no destination at all in an STL, so a converted building is a single skin with every identifier stripped.
One practical difference between the two paths: the STEP, IGES and BREP kernel is served by this site and starts working as soon as a file is dropped. An .ifc file needs the IFC reader, which the full workspace loads on demand and then tessellates the same way, still inside your tab and with no upload. See IFC to STL for the BIM-specific limits in detail.
What each source loses on the way to STL
| Source | Reader | Geometry model | Tessellation presets | First thing lost |
|---|---|---|---|---|
| .step / .stp | OpenCascade B-rep kernel | Trimmed surfaces over exact solids, named assembly | Apply | Feature history and PMI annotations |
| .iges / .igs | OpenCascade B-rep kernel | Entity surface patches, often not stitched into solids | Apply | Face grouping and surface precision |
| .brep | OpenCascade native reader | Same B-rep structures as STEP | Apply | Product names, which STEP would have carried |
| .ifc | web-ifc | Already-meshed element representations in metres | Inert | Global IDs, property sets, storeys, materials |
Why IGES and STEP are not interchangeable
Both reach the same kernel, but they arrive with different degrees of topological discipline. STEP was designed around manifold solids with shared edges, so a well-formed file tessellates into a closed shell. IGES was designed around the exchange of surface entities and has no obligation to stitch them: it is normal for an IGES export of a simple bracket to be a pile of adjacent trimmed patches whose edges coincide visually but not numerically. The meshing step will happily produce triangles for every patch, and the resulting STL can look correct on screen while being open along every seam. A slicer will then refuse it or repair it silently, which is why an IGES that prints badly is worth re-exporting as STEP before you blame the converter.
Flattening, then the 50-byte record
Whatever the source, the last stage is identical. All triangles from all faces or all elements are appended into one geometry carrying exactly two attributes, position and normal, with placement matrices baked into the coordinates so a part in an assembly lands where the assembly put it. The STL serialiser then writes an arbitrary 80-byte header, a 32-bit little-endian facet count and a stream of fixed 50-byte records: three floats for the facet normal, nine floats for the three vertices, and a two-byte attribute word written as zero. Vertices are duplicated per facet rather than shared, so the format records no topology at all — the slicer has to weld near-identical coordinates before it can even ask whether your shell is closed.
CAD vs STL
| CAD source | Binary STL output | |
|---|---|---|
| Geometry basis | Exact B-rep surfaces, or pre-meshed IFC elements | Planar triangles only |
| Units | STEP and IFC each declare their own unit | None; bare 32-bit floats |
| Colour and material | AP214/AP242 colours, IFC material associations | Attribute word zero; no colour field exists |
| Assembly / structure | Named products, storeys, element relationships | One flat triangle list |
| Metadata | Properties, quantities, global IDs, layers | 80 free header bytes, nothing else |
| Curvature | Analytic: cylinders and fillets are exact | Approximated by chords within the deflection |
| Topology | Shared edges and closed shells | Duplicated vertices; connectivity implicit |
| Editability | Parametric or semantic model | Snapshot; not reversible |
| Typical size | Compact relative to geometry | 50 bytes per triangle, grows with tolerance |
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 | 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
DWG and DXF are deliberately absent
The phrase CAD to STL makes people expect AutoCAD files, and this converter will not take them. DWG and DXF describe drawings: lines, arcs, splines, polylines, blocks, hatches and dimensions laid out on a plane. That is 2D annotation content, not a bounded volume, and STL needs closed triangle shells to produce anything a slicer will accept. Rather than emit a hollow or degenerate mesh, the workspace refuses those extensions. The workable path is to export STEP or IGES from whatever application holds the model; if the design exists only as a 2D outline, extrude it into a solid in that application first. See the format list for exactly what this site reads and writes.
No unit survives, so scale is your responsibility
STL has no unit field. A STEP file written in millimetres produces numbers that a slicer happens to read correctly; the same part written in inches prints 25.4 times too small, and an IFC model in metres prints a building that is a thousand times too big for the intended part. Nothing in the pipeline inspects the source declaration and rescales it, because there is no agreed place to put the answer. Check the bounding box on import and apply the factor in the slicer.
IGES files without stitched solids
An IGES export can tessellate successfully and still yield a non-manifold STL, because unconnected surface patches tessellate into unconnected triangle groups. Cracks sit along seams that looked closed in the CAD viewer. If the slicer reports holes on an IGES-derived file, re-export the same geometry as STEP before assuming the converter lost data.
IFC: only elements with a mesh representation appear
web-ifc streams geometry for elements that actually carry one. An IFC file whose walls are pure parametric extrusions, or one written with a boolean or clipped-with-b-rep representation the reader does not expand, contributes nothing to the output, and the resulting STL can be visibly incomplete while the conversion itself reported no error. Space-boundary semantics, property sets and quantities are never in the output regardless.
Very large models run into WebAssembly memory
The kernel lives in a 32-bit linear memory, and tessellation is the expensive step: an assembly whose source file is a few megabytes can expand into tens of millions of triangles. When memory is exhausted the conversion aborts with an error instead of writing a partial file. Reduce the tessellation level, convert a sub-assembly, or split the model in the CAD application.
The IFC kernel is fetched the first time you need it
The model file is never uploaded, but in the workspace the IFC reader is a WebAssembly library loaded on demand from a content delivery network, so the first IFC conversion in a session requires network access. The STEP, IGES and BREP kernel is served from this site itself. If an IFC load fails in a locked-down network, that fetch is the thing to look at, not your file.
Frequently asked questions
Can I convert on this page itself?
No. This page is the reference for the CAD to STL path, and the conversion itself runs in the workspace that the button above opens, with both formats already selected. Your file is read in that browser tab and the download is written locally, so there is no upload stage in either place. Keeping the documentation and the engine on separate addresses lets file support and detail levels change behind one workspace without breaking the page you are reading.
Can I convert DWG or DXF to STL here?
No, and it is worth being blunt about it before you lose time to one. DWG and DXF are 2D drawing formats: a DWG holds line, arc, polyline, block and dimension entities on a flat plane, not a bounded solid, and there is nothing for a tessellator to slice into closed triangle shells. This site reads only the 3D formats listed in the supported table, so a .dwg or .dxf file has no reader and will be refused rather than producing a broken mesh. If your geometry genuinely lives in CAD software, export it from there as STEP or IGES and bring that file to the workspace; if you only have a 2D outline, what you need is an extrusion step in a modeller first, because a flat outline is not a printable solid.
Which CAD file should I export from my modeller?
STEP, unless something forces your hand. A STEP file carries manifold solids with trimmed surfaces and an assembly hierarchy, so the tessellator sees closed volumes and produces a closed triangle shell. IGES predates that discipline and is full of unconnected trimmed surface patches; an IGES export of the same part can look complete in a viewer yet leave gaps along the edges where two patches meet, and those gaps become non-manifold STL. BREP is the OpenCascade native form and behaves like STEP, but few modellers export it. The practical rule is STEP first, IGES only when the other side insists.
Does the converter keep the assembly structure of my CAD file?
It cannot. A binary STL facet record is twelve floats and a two-byte attribute word; there is no field for a part name, a placement matrix or a child reference. Whatever hierarchy the source declared — STEP product definitions, IFC storeys and elements, or the node tree of an IGES assembly — is resolved into world coordinates and concatenated into one flat triangle list before serialisation. Bolts, plates and housings that were separately selectable become indistinguishable neighbours in a single mesh, so re-splitting them later means selecting by geometry in a mesh editor.
Why is my STL the wrong physical size?
Because STL declares no unit and the converter adds none. A STEP file states its length unit in its header and an IFC model is consistently in metres, but the exported numbers are simply the source coordinates written out as 32-bit floats. Slicers assume the file is in millimetres, which happens to match a mechanical STEP exported in millimetres, so that case works by accident. An inch-authored STEP prints 25.4 times too small and a metre-authored IFC prints a thousand times too large. Measure the bounding box in the receiving tool and scale on import; that is the only reliable fix.
Do the four tessellation levels apply to every CAD format?
Only to the solid-kernel formats. STEP, STP, IGES, IGS and BREP are exact boundary representations, so Draft, Balanced, Fine and Maximum set a linear chord deflection and an angular deflection that the kernel honours while meshing each face, and each level changes the triangle count and the file size. IFC is different: buildingSmart schemas store mesh geometry rather than analytic surfaces, so web-ifc reads the triangles that are already in the file and a deflection setting has nothing to act on. For IFC, the resolution is fixed by whoever exported it.
What happens to materials, colours and properties?
All of it is dropped, because there is nowhere in an STL to put it. STEP AP214 and AP242 colour assignments disappear; IFC property sets, quantity take-off values, global IDs, layer assignments and material associations disappear; glTF-style PBR values disappear. IFC is the most painful case for building work, since the semantic model is the useful part — after conversion you hold the outer skin of a wall with no clue which wall it was. Keep the source file as the record and treat the STL strictly as a printing or viewing artefact.
Is my file uploaded to a server to be converted?
No. The bytes are read into the page you are looking at and the tessellation runs on your own machine inside a WebAssembly module, which is why the workspace shows a progress bar rather than an upload bar and why there is no queue, size quota or account step. One honesty note: for IFC specifically, the conversion runs in the workspace and its geometry kernel is a WebAssembly library fetched from a CDN the first time, so the page needs network access even though the model file never travels anywhere.
Why does a very large CAD model fail with a memory error?
Because a browser tab is a 32-bit WebAssembly address space and a tessellated solid is expensive: every triangle costs 12 floats of geometry plus a normal on the GPU side before STL packing, and a large assembly can generate tens of millions of facets from an apparently small source file. When the kernel cannot grow its linear memory any further the conversion aborts rather than returning a truncated file. The workable answers are to open the sub-assembly you actually intend to print, to choose Draft instead of Maximum, or to split the model in the source CAD application before exporting.
Can I convert several CAD parts in one go?
One file per run. The workspace holds a single source and produces a single STL, so a batch of twenty .step files means twenty conversions. There is no account, queue or per-day limit behind this, so nothing stops you from working through them one after another, and because each run is local the previous file is discarded when you load the next. If you want the twenty parts as one printable STL, the efficient route is to assemble them into a single STEP or IGES export from your modeller and convert that one file.
How do I check the STL is actually printable?
Load it into the slicer and read the reported diagnostics rather than trusting the export. A tessellated CAD solid is usually closed, but trimmed-edge cracks, coincident faces from overlapping solids and tiny sliver triangles are all common enough that the slicer's own hole count, non-manifold edge count and volume test are the real verdict. Also confirm the bounding-box dimensions match the part you expect, since the unit question above is the single most common reason a good-looking STL prints at the wrong scale.
References
- ISO 10303-21:2016 — STEP exchange file structure
- OpenCascade documentation — B-rep, IGES and tessellation
- three.js documentation — loaders and exporters
- How this site is built and tested
Related converters
All converters
Last updated: