The part is perfect in CAD. It is a NURBS surface, or a B-rep solid, or whatever your kernel calls it. The curvature is exact. The mating face is exact. Then someone opens an export dialog, clicks Save, and the shop receives a mesh. The mesh is not the model. The mesh is a decision.
That decision has a number attached to it. In most CAD exporters, the number is called chord height, surface deviation, or linear tolerance. It defines the maximum distance between the true curved surface and the flat triangles that replace it. If you do not set it, the exporter sets it for you. If you do not document it, the next person sets it differently. The result is a handoff that looks clean and carries dimensional error nobody priced.
STEP carries the model. STL and 3MF carry a mesh.
ISO 10303-21 specifies an exchange structure format using clear text encoding of product data whose conceptual model is specified in the EXPRESS language. ISO 10303 is an International Standard for the computer-interpretable representation of product information and for the exchange of product data, intended as a neutral mechanism for describing products throughout their life cycle. In plain terms: STEP carries the model, not a triangulation of it. A STEP file contains mathematical data to represent curves and finer detail, with exact precision and true shapes. For 3D printing, that STEP file must be converted to a triangulated format before a slicer or printer can use it.
3MF is a different animal. The 3MF Consortium describes it as a 3D printing format that allows design applications to send full-fidelity 3D models to a mix of other applications, platforms, services and printers. The specification is now recognized as an International Standard: ISO/IEC 25422:2025. 3MF works off triangular data similar to STL, but produces a much smaller file size, allowing a higher number of triangles while maintaining a smaller file size. That is a packaging advantage, not a geometry advantage. The triangles are still triangles.
STL is the oldest and bluntest of the three. It converts a CAD model typically composed of precise mathematical surfaces into a triangular mesh. Each triangle is flat. Each triangle is an approximation. The accuracy of that approximation is set entirely by export parameters.
The three parameters that govern the mesh
Most CAD exporters expose three controls that matter. They are not cosmetic. They are dimensional.
Chord height, sometimes called surface deviation or linear tolerance, defines the maximum distance between the true curved surface and the flat triangles of the STL mesh. If you set chord height to 0.2 mm, you are telling the exporter that a 0.2 mm gap between the real curve and the mesh is acceptable. On a large architectural panel, that gap is invisible. On a mating curve or a press-fit feature, that gap is the entire error budget.
Normal deviation, also known as angular tolerance, limits the maximum angle between the surface normals of adjacent triangles in the mesh. This controls how smoothly curvature is approximated. A large normal deviation produces visible faceting on domes, fillets, and organic shapes. A small normal deviation produces more triangles and a larger file.
Maximum cell size, sometimes referred to as maximum edge length or facet size, determines the largest triangle allowed in the STL mesh. This setting prevents the exporter from creating a few enormous triangles across a flat region where chord height alone would permit them. It matters most on parts with mixed curvature and flatness.
These three parameters interact. Tightening chord height without tightening normal deviation can leave faceting on curved surfaces. Tightening normal deviation without tightening maximum cell size can leave coarse triangles on large flat regions. The exporter does not know which features matter. You do.
Chord height is a dimensional budget, not a slider
The common mistake is treating chord height as a quality setting. It is not. It is a tolerance. When you set chord height to 0.1 mm, you are accepting up to 0.1 mm of deviation between the true surface and the mesh. That deviation is real. It shows up in the printed part. It shows up in the fit. It shows up in the inspection report.
The proposed title of this article mentions a 0.2 mm budget. That number is not a standard. No retrieved source establishes 0.2 mm as a universal or typical chord height for any part class. It is a hypothetical. But it is a useful hypothetical because it forces the question: what is your chord height, and who decided it?
If your firm has no documented chord height, the answer is whoever last clicked Save. That is not a standard. That is a coin flip.
The file size tradeoff is real, and it is exponential
Finer tolerances produce more triangles. The source material describes the relationship between deviation and face count as exponential: increases in deviation create exponentially more faces, meaning lower deviation values can increase quality but also make file sizes very large. This is not a linear tradeoff. Halving chord height does not double the triangle count. It can multiply it.
That matters because file size affects more than storage. It affects slicing time, mesh repair time, and the ability to email a file to a shop. A 500 MB STL is not a quality signal. It is a processing problem. The right answer is the coarsest tolerance that still holds the feature. That requires knowing which features matter before you export.
The unit trap is a handoff failure, not a modeling failure
STL files do not store explicit units. Millimeters, inches, and centimeters are all possible. Exporting in inches but importing as millimeters scales the model by 25.4x. A perfectly modeled part arrives 25.4 times too large. The geometry is correct. The handoff is wrong.
This is not a beginner mistake. It is a process mistake. It happens when the export dialog and the import dialog are owned by different people with different assumptions. The fix is not a better model. The fix is a release checklist that includes unit verification alongside geometry checks.
What the slicer actually does
The slicer receives a mesh. It does not receive the NURBS surface. It does not receive the B-rep solid. It receives triangles. The slicer then slices those triangles into layers. The slicer cannot recover the original surface. It cannot smooth away faceting that the exporter introduced. It cannot correct a chord height that was set too coarse.
This is the core misunderstanding. The slicer is not the problem. The slicer is the messenger. The problem is the export dialog, and the problem is the absence of a documented standard for what that dialog should contain.
If you send a STEP file to a shop that can handle it, the shop controls the triangulation. If you send an STL, you have already made the triangulation decision for the shop. You own the consequences. If you send a 3MF, you have made the same decision with better packaging. The triangles are still yours.
A practical standard for a firm
The export dialog is a handoff contract. Whoever sets chord height decides how much dimensional error the downstream shop inherits. That decision should be owned by a named role, not left to whoever clicks Save.
A workable standard has four parts:
One: Define chord height per part class. A bracket and a mating curve do not need the same tolerance. Write the number down. Make it a fraction of the smallest critical feature or the layer height. The source material suggests choosing a chord height one-tenth the layer height or less for optimal fidelity, but that is general guidance, not a validated rule for every part. Your part class determines your number.
Two: Define normal deviation per part class. Curved surfaces need tighter angular tolerance than flat ones. If your part has no curvature, normal deviation is irrelevant. If your part is all curvature, it is the dominant control.
Three: Verify one known dimension after import. Before committing to a print run, measure a known feature in the slicer. If the dimension is wrong, the unit is wrong. If the dimension is right but the surface is faceted, the chord height is wrong. This takes two minutes and catches the two most common handoff failures.
Four: Document the export settings in the release package. The shop should not have to guess what chord height you used. If they need to re-export from STEP, they should know what tolerance you intended. If they need to repair the mesh, they should know what deviation is acceptable.
What this costs
The cost of a documented standard is the time to write it and the time to verify it. That is hours, not days. The cost of not having one is a failed print, a rework, or a fit that does not fit. That is days, not hours. The math is not close.
The 0.2 mm nobody budgets is not a number in a standard. It is the error that accumulates when no one owns the number. The fix is not a better slicer. The fix is a named owner, a written tolerance, and a verification step before the file leaves the building.
FAQ
Does 3MF preserve the original NURBS surface? No. 3MF works off triangular data similar to STL. It packages that data more efficiently and supports additional properties like materials and colors, but the geometry is still a mesh. If you need the original surface, you need STEP.
Can a slicer import STEP directly? Some slicers can, but the slicer still has to triangulate the STEP file internally before slicing. The triangulation happens either in your CAD exporter or in the slicer. Either way, a chord height is applied. The question is who sets it.
What chord height should I use for architectural models? There is no universal answer. The source material suggests 0.1 to 0.3 mm for architectural and large prints, but that is general guidance, not a validated standard for your parts. The right number depends on the smallest critical feature and the layer height. Document it per part class.
Why does my STL look faceted when my CAD model looks smooth? Your CAD system uses a graphical mesh to display smooth surfaces. That display mesh is not the same as your export mesh. The export mesh is controlled by chord height and normal deviation. If those are too coarse, the exported mesh will be faceted even though the CAD display looks smooth.
How do I check for unit errors before printing? Measure a known dimension in the slicer. If you modeled a 100 mm bracket and the slicer reports 2540 mm, you have a unit mismatch. Fix the import units before slicing.