Why won't my STEP file convert? NURBS surfaces vs plane-only tools
This is the question that appeared word-for-word in the FAQ of a competitor tool that ranks ahead of this one. Their own answer says they only support planar STEP files. Every number below was measured on the machine that wrote it and re-checked by npm test.
The short answer
Most STEP files from real CAD tools (SolidWorks, Fusion 360, Inventor) are not flat triangles — they are NURBS surfaces — and many online STEP-to-STL tools cannot read them. Those tools silently skip anything that is not already a triangle mesh, or refuse the file outright. If your conversion “hangs,” says it “cannot read the file,” or produces a mesh where the curved parts are gone entirely, the problem is almost certainly not your STEP file. It is that the tool you chose is only a mesh relay, not a STEP converter.
1. What NURBS actually is in the STEP file
A STEP file is text that describes geometry the way a CAD tool thinks about it. When that geometry is a flat cube, the file says six planar faces connected by an edge loop. When that geometry is a cone, the file does not store thousands of little triangles. It stores one parameter block that says “here is the axis, here is the base radius, here is the half-angle.” The triangles — if any — are calculated later, when someone asks for a mesh.
The parameter block for the conical surface we run every test day is:
#15=CONICAL_SURFACE('',#102,0.450944881889764,0.785398163397449);
That is one line — one surface — with no triangles anywhere in it. The half-angle value 0.785398163397449 radians equals exactly 45°, and the position reference #102 is the point the cone is anchored to. This is what NURBS and its cousin surfaces look like in practice: small blocks of high-precision math, not long lists of coordinates.
Tools that only support planar or faceted STEP read the file, skip every line that says CONICAL_SURFACE, CYLINDRICAL_SURFACE, or B_SPLINE_SURFACE_WITH_KNOTS, and then either report that nothing useful was found or hand you a mesh with the curved parts removed. The vendor of one such tool even admits this limitation in their own FAQ — they tell NURBS users to go re-export from FreeCAD as faceted geometry. That is not a workaround; that is a different conversion pipeline.
2. The self-test: one cone, three presets, one number that proves it
You do not need to read the STEP file yourself to find out whether a converter handles NURBS. You need one curved part and two quality presets:
- Take any part with a curved face — a cone, a fillet, a sphere — and convert it at the coarsest preset.
- Convert the same part again at the finest preset.
- If the triangle count does not change, the tool was never subdividing anything. It was passing through whatever mesh was already inside your STEP file, or dropping curved faces and triangulating only the planar leftovers.
Here is what happens on this converter. The conical surface we ship in our own test set converts like this:
| Preset | Linear deflection | Angular deflection | Triangles | STL bytes |
|---|---|---|---|---|
| Draft | 0.02 | 0.5 | 286 | 14,384 |
| Normal | 0.005 | 0.3 | 516 | 25,884 |
| Fine | 0.001 | 0.1 | 2,142 | 107,184 |
286 to 2,142 is a 7.5× spread. No triangle mesh can grow or shrink by that much. A mesh has a fixed number of triangles; you cannot “tighten the tolerance” on a mesh. Only a true CAD kernel — one that read the STEP file as NURBS surfaces and is now triangulating them with tighter tolerances — can produce numbers like this.
The flat cube is the control that every real converter produces the same numbers for: 12 triangles at every preset, giving exactly 684 bytes. Six flat faces are always twelve triangles, and there is nothing to approximate. If a converter gives different triangle counts for a flat cube across presets, it is adding or dropping triangles for no reason and you should not trust its output.
3. Turning the triangle count into the file size you get back
The STL file you download is a binary record with exactly two variable parts: an 84-byte fixed header, and then 50 bytes per triangle. So the file size is always exactly 84 + 50 × triangle count. That means the three rows above translate directly to what you will download:
- Draft cone: 286 triangles → 84 + (50 × 286) = 14,384 bytes
- Normal cone: 516 triangles → 84 + (50 × 516) = 25,884 bytes
- Fine cone: 2,142 triangles → 84 + (50 × 2,142) = 107,184 bytes
That file size “jump” between Draft and Fine — 14 kilobytes to 107 kilobytes on the same cone — is not a bug and not a compressor malfunction. It is how much more tightly the kernel approximated the curved surface. The five checks on the verification page start with this exact arithmetic, so you can confirm any conversion independently.
4. The silent problem: competitors that don't say what they do not read
None of the three competing sites the owner picked as benchmarks (polyd.com, convert3d.org, imagetostl.com) publish a disclaimer like the one we read on step-to-stl.com's FAQ. They advertise “STEP to STL” on their landing pages without stating which subset of STEP they actually read. When you try their tool on a NURBS file from SolidWorks or Fusion 360, the failure can look like anything from an empty download to a file where the curved parts are gone — and they will not tell you why.
The one advantage a NURBS-capable converter has is not a marketing slogan. It is numbers: when the triangle count changes across presets, you know the kernel did something real. When it doesn't, you know it didn't. That is a check anyone can run on any converter, with any curved STEP file, in under a minute.
Where these numbers come from
- 286 / 516 / 2,142 triangles for the cone at three presets — produced by running the shipped engine version (occt-import-js 0.0.23, a WebAssembly build of OpenCASCADE) in Node.js over the project's own conical-surface test file. The test suite re-runs this every time with a fresh load of the engine and the same deflection pairs (Draft 0.02/0.5, Normal 0.005/0.3, Fine 0.001/0.1).
- 12 triangles = 684 bytes for the flat cube at every preset — produced the same way, from the project's simple-cube STEP file. This is the control that every converter reading the same file should reproduce.
- 84 + 50 × triangles = file size — the published binary STL record layout, cross-checked against the reference STL shipped with the engine vendor's own test set.
- The CONICAL_SURFACE line from the STEP file — a real entity line from one of the project's own test files, reprinted without modification. The test suite confirms that this exact line appears in the source file and that the half-angle 0.785398163397449 radians equals 45 degrees.
The converter on the front page reports the bounding box, triangle count and solid-part count for your own file after every run. You can apply the self-test — pick Draft and Fine, compare the triangle counts — without leaving the tab. What each quality preset means, what the two deflection numbers control, and how the verification page checks the result, are linked from the tool itself.