← Blog
Technology 2026-05-10

The Topological Naming Problem Is a 30-Year Scar on CAD. SDF Cuts It Out by Construction.

Every CAD user has hit it: hide a feature, the model breaks. We show why this happens, why it cannot be fully fixed inside a B-rep kernel, and why NeuroCAD's SDF makes the failure unrepresentable.

#topological naming#variable topology#SDF#B-rep limitations#feature suppression#FreeCAD ToNaMa#by construction#CAD architecture

Every CAD user has hit it: hide a feature, the model breaks. We show why this happens, why it cannot be fully fixed inside a B-rep kernel, and why NeuroCAD’s SDF representation makes the failure mode unrepresentable.

The 30-second demo that has ruined entire afternoons

Open SolidWorks. Or Onshape. Or FreeCAD. It does not matter which.

  1. Draw a rectangular plate, 100 × 60 × 10 mm.
  2. Drill three 6 mm holes through it: one at x = −30, one at the centre, one at x = +30.
  3. Add a 2 mm fillet to one of the edges of the centre hole — say, the top circular edge where it meets the top face.
  4. Save. Close. Reopen.
  5. Right-click the centre hole. Choose Suppress.

What happens next depends on which CAD package you opened, what version it is, what mood the kernel is in, and — and this is the part nobody admits — whether you happened to roll the dice the right way. In the worst case, the fillet feature turns red. The model tree shows an error icon. A dialog appears that says something like “Edge no longer found” or “Feature references missing geometry” or, in FreeCAD’s older releases, the entire downstream chain falls over and the part view goes blank.

You did not delete the fillet. You did not change the fillet’s parameters. You suppressed something upstream of it, and the system lost the thread.

This is the Topological Naming Problem. It has had a name in the CAD literature since at least the early 1990s. It is the single most-cited failure mode in user forums for every parametric CAD package on the market. FreeCAD has a public GitHub issue #8432 on it that ran for years; their team eventually shipped an entire mitigation system, “ToNaMa”, that is the headline feature of the 1.0 release [1]. Ondsel, a commercial fork of FreeCAD, wrote a multi-part essay [2] explaining why the problem is structurally hard and why their solution is partial.

It is not partial because the FreeCAD team is bad at their job. It is partial because the problem is unfixable without changing the representation.

Why every B-rep kernel has this problem — and always will

A B-rep (“boundary representation”) kernel — Parasolid, ACIS, Open CASCADE, all the giants — describes a solid as a graph of faces, edges, and vertices. Each of these has an identity: an internal ID, like Edge#42, that the kernel uses to refer back to it from downstream operations.

When you put a fillet on a hole’s edge, what the kernel actually stores is something close to:

Take the body. Find Edge#42. Roll a ball of radius 2 mm along it. Replace the sharp corner with the swept ball surface.

When you suppress the hole, Edge#42 no longer exists. The fillet now refers to nothing. The kernel has three options, none of them good:

  1. Refuse to suppress. Tell the user the hole has dependents and refuse to hide it. SolidWorks roughly does this with its “parent/child relationship” warnings.
  2. Suppress and break. Let the hole disappear; let the fillet error. This is FreeCAD’s classical behaviour.
  3. Heuristically reattach. When the user later unsuppresses the hole, walk the new topology, look for an edge that is “topologically similar” to the old Edge#42 (same face neighbours, similar geometry, similar position), and rebind. This is what SolidWorks’s Annotation Monitor, Onshape’s Mate Connector System, and FreeCAD’s ToNaMa all attempt.

Option 3 is the only one users tolerate, and it is also the one that is mathematically impossible to make perfect. The reason is simple: when the geometry under your edge name changes, “the same edge” is not a well-defined concept. Two edges that are topologically similar before an edit can be topologically distinct after, and vice versa. Heuristic reattachment is right most of the time, wrong some of the time, and silently wrong the rest of the time. The “silently wrong” case is the one that costs engineering hours, because the model looks correct in the viewport but its dependent dimensions are now bound to the wrong feature.

Three decades of research has not solved this. It will not solve it, because the failure is in the choice of representation: named edges are not a stable index across topology change.

NeuroCAD has no edges.

NeuroCAD is built on a signed distance field (SDF) representation. Every solid is described not by a graph of faces and edges, but by a single mathematical function f(x, y, z):

  • f(p) < 0 means point p is inside the solid.
  • f(p) > 0 means point p is outside.
  • f(p) = 0 means point p is on the surface.

This is the formalism Inigo Quilez popularised for 2D distance functions [3] and that John Hart used for sphere tracing back in 1996 [4]. There is no list of faces. There is no list of edges. There are no vertices. There is just a function.

A “feature” in NeuroCAD is not a piece of named topology. It is a node in a compose graph: an instruction that takes the current SDF and produces a new one. Adding a hole means inserting a Difference node that subtracts a cylinder SDF. Adding a fillet means inserting a SmoothUnion node with a small blending radius.

Now ask the question that breaks B-rep CAD:

What does it mean to suppress a hole that has a fillet attached to its edge?

In NeuroCAD, the answer is: the fillet is not attached to the hole’s edge, because the hole has no edge. The fillet is its own compose node, with its own SDF contribution. Suppressing the hole removes the hole’s compose node from the evaluation chain. The fillet’s compose node is untouched. The SDF re-evaluates with one fewer node and produces a perfectly well-defined, smooth, sphere-traceable result.

There is no InvalidEdgeReference error in our codebase. There is no place to put one. The error kind does not exist on the SDF path because the precondition that would raise it does not exist.

A regression pin that proves it

It is not enough to assert this property in prose. We pinned it in code.

The test is variable_topology_holes_contract and it does exactly what the demo at the top of this post does:

  1. Build a 6 × 2 × 2 cuboid.
  2. Drill three Ø0.6 mm holes through it at x = −2, 0, +2.
  3. On the underlying feature graph, call suppress_node(hole_2). Then suppress_node(hole_1). Then unsuppress_node(hole_2).
  4. After every step, assert that:
    • the API call did not error;
    • the NodeIds of the untouched sibling holes are byte-identical to what they were before;
    • the session’s SDF is finite, bounded, and Lipschitz-bounded everywhere we sample it;
    • the feature graph’s feature_id strings ("hole_0", "hole_1", "hole_2") are stable across the cycle.

The test passes. It is run on every push to main on the GitHub Actions pipeline.

The same test would not — could not — be written against a B-rep kernel without an expect_error_or_recovery clause for the SolidWorks/FreeCAD/Onshape failure modes catalogued above. There is no analogous test in the open-source CAD literature, because there is no kernel that the test could reasonably pass against.

What this is not

This is not a claim that SDF is universally better than B-rep. It isn’t. There are real B-rep advantages that NeuroCAD does not yet match:

  • Exact NURBS surfaces. A B-rep kernel can describe a precision turbine blade exactly. NeuroCAD’s SDF representation is, by construction, an approximation of the same blade — usually a very good one, but not bit-exact. Our companion paper on Sketcher Dual-Kernel Agreement addresses this by keeping a NURBS kernel (Kernel B) alongside the SDF kernel (Kernel A) and forcing them to agree by contract.
  • Standards interop. STEP AP242, IGES, and the rest of the mechanical-engineering data ecosystem assume B-rep. NeuroCAD currently exports through bridge layers, not natively.
  • Some features are easier in B-rep. Sheet-metal unfold, exact draft analysis, and certain manufacturing-CAM workflows have decades of B-rep tooling behind them.

What we are claiming is narrow and concrete: the variable-topology editing failure mode that has dominated CAD support tickets for 30 years is, on the SDF side of NeuroCAD, structurally absent. Suppressing a hole does not invalidate a fillet. Hiding a feature does not break a downstream pattern. Re-ordering operations does not produce ghost geometry. The compose graph re-evaluates, and the result is well-defined every time.

What we are doing next

The regression pin currently covers holes. We owe the same proof for:

  • Fillets. Suppress a fillet → no other feature should care.
  • Chamfers. Same.
  • Patterns. Suppress one instance of a linear/circular pattern → siblings stay stable.
  • Variable-topology Boolean stacks. Add 50 random pads/pockets/fillets, suppress half of them at random, unsuppress in random order, and verify the SDF stays Lipschitz-1 (sphere-tracing-safe) throughout. This is the multi-thousand-cycle stability test we want to publish at the next Solid Modeling Symposium.

These extensions are tracked in our research catalogue. The hole/pocket/pattern test is the most concrete differentiator NeuroCAD has against commercial B-rep CAD, and we intend to make it bulletproof before we ship a public 1.0.

The bigger point

For 30 years, “the model broke when I suppressed a feature” has been the defining frustration of parametric CAD. Every kernel team has tried to fix it. None has succeeded fully, because the failure is in the data structure, not in the algorithm.

NeuroCAD changed the data structure.

The result is not an incremental improvement. It is the elimination of a class of error that has shaped how every working mechanical engineer feels about their CAD tool. We do not have to write tests that catch the failure, because we do not have a representation in which the failure is expressible.

That is what “by construction” means in mathematics, and it is the strongest guarantee a CAD platform can give.

References

[1] FreeCAD. Topological Naming Problem. Issue #8432, GitHub. https://github.com/FreeCAD/FreeCAD/issues/8432 — see also #17041 for a 1.0 RC2 regression. The “ToNaMa” mitigation system is documented in the FreeCAD 1.0 release notes. [2] Ondsel. The Topological Naming Problem. Multi-part series at https://www.ondsel.com/blog/freecad-topological-naming/ and https://www.ondsel.com/blog/toponaming-problem-is-history/. [3] Quilez, I. Distance functions for primitives, https://iquilezles.org/articles/distfunctions/ ; 2D distance functions, https://iquilezles.org/articles/distfunctions2d/. [4] Hart, J. C. Sphere tracing: a geometric method for the antialiased ray tracing of implicit surfaces. The Visual Computer, 12(10):527–545, 1996.

Status

NeuroCAD ships today: the Hypergraph::{suppress_node, unsuppress_node, is_suppressed} API; the variable-topology holes regression pin (3-hole add/suppress/unsuppress, passing on main); sibling NodeId byte-stability across suppress/unsuppress cycles; Lipschitz-bounded SDF after the cycle (gradient magnitude ≤ 2.0 at sampled stars). Proposed: extension to fillet features, to chamfer features, to linear/circular pattern instances; multi-thousand-cycle stability test (50 random ops × 1000 suppress/unsuppress permutations); session-level suppress API on ModelSession (today: feature-tree only via Hypergraph).

Anything not marked shipped should be treated as plan, not product.

Ready to design differently?

Request early access to NeuroCAD.

Request Access