CAD sources¶
Any CAD that exports STEP works. Fusion, SolidWorks, Rhino, Onshape, Inventor, NX, CATIA, FreeCAD — Hardcraft reads the solid, not the badge on the package. STEP is the general path.
The Plasticity bridge is the second path: a live link to one specific modeller, a convenience rather than a requirement.
Both paths end up as a mesh carrying the same metadata contract, so detection and fill are identical downstream. What differs is how much CAD truth survives the trip, and that changes what the fill can do.
| Plasticity bridge | STEP import | |
|---|---|---|
| Extra install | none | converter binary |
CAD face grouping (face_ids, groups) |
✅ | ✅ |
| CAD vertices → hard boundary splits | ✅ | ✅ |
| Surface-type oracle (plane/cylinder/torus/…) | ❌ | ✅ |
| Periodic-face seams | ❌ | ✅ |
CAD parametric UV (hc_cad_uv) |
❌ | ✅ |
| One object per CAD body | ❌ manual | ✅ automatic |
| Tessellation control | in Plasticity | linear/angular deflection, re-tessellation |
| Live round-trip while modelling | ✅ | ❌ file-based |
Rule of thumb: STEP by default, bridge for live iteration in Plasticity. STEP carries strictly more — the surface-type oracle, periodic seams and the CAD parametric UV exist only there, and wrapped walls, bores and repeated features lean on exactly those.
Exporter quality varies, the contract does not
Different CADs write different STEP: tessellation quality, how surfaces were built, whether a shell is clean. Import repairs what it can and says what it cannot. If a body shades badly, rebuild the surface in the source CAD and re-export — see Known issues.
The metadata contract¶
Both paths hand detection the same two mesh ID-properties:
mesh["face_ids"]- one integer per CAD face — the surface's persistent id.
mesh["groups"]- flat
(loop_start, loop_count)pairs, one per CAD face, indexing the loop buffer. A polygon inherits the CAD id of its loops.
Each CAD face arrives as its own shell — coincident but unwelded seam vertices. Neighbouring faces tessellate a shared edge independently, so matching boundary edges between them is unreliable. What does coincide is CAD vertices: a boundary vertex whose position is shared by three or more CAD faces is a real CAD 0-cell, and therefore a hard segment split. Between two CAD vertices the run is exactly one CAD edge — one parametric curve — fitted as a line or an arc.
That is the whole basis of detection accuracy, and the reason for the next warning.
Detection needs a raw export
Editing, separating, joining or re-extracting the CAD mesh destroys the metadata. Detection then falls back to pure geometry and the patch/curve split degrades. Do not debug detection on an edited mesh — re-export first. This is the single most common source of "the patches make no sense".
Plasticity bridge¶
The path of least friction: export or stream from Plasticity, hit New Target (fill all) or New Target (empty). Editing the CAD mid-retopo is supported — see Re-importing an edited CAD.
What it does not carry: BREP edge identity and per-vertex parametric UV. Both are on the wishlist for the bridge and neither is available today, so the STEP route is the only way to get surface-type and parametric-UV information into Hardcraft.
STEP import¶
Conversion runs through the bundled OCCT converter as a background process, and produces more than a mesh.
One object per CAD body. The XCAF assembly tree is walked to its leaves and
each part is additionally split by solid — a part built from ten solids arrives
as ten objects, named from the STEP MANIFOLD_SOLID_BREP entries, with a
parts.json sidecar recording the mapping.
A type oracle. Per CAD face, the analytic surface type OCCT reports. This is
what makes Select Similar (Shift+G in PATCH) work at all — on the bridge it
reports No CAD oracle — and lets
fill dispatch pick a tube/grid/loft route from CAD truth rather than from
guessed curvature.
Periodic seams. For a periodic face the converter traces the seam and records it, so the unwrap knows where the surface closes on itself instead of tearing a cylinder open at an arbitrary place.
CAD parametric UV. The converter's own (u, v) per corner is stamped as the
hc_cad_uv loop layer (plus per-face periods for closed surfaces). Fill can then
work in the CAD's own chart — the most reliable interior for wrapped walls and
faces with holes, where an LSCM unwrap has to invent something.
Priority when several charts exist: your manual UV cut wins, then the CAD chart, then LSCM.
Tessellation and repair¶
The imported CAD mesh shades from its own tessellation, and it is also what
you bake normals from later — so density is a per-import decision. The
Import STEP file dialog carries it in its sidebar: a Tessellation
preset (Retopo — the working default; Bake — dense enough to shade clean
as a bake source) and the two numbers behind it, Chord (in the file's own
units) and Angular (degrees), editable after picking a preset. The values
an import ran with are remembered on the mesh and Re-import CAD repeats
them; a denser mesh is a fresh import through the dialog. The converter floors
the chord at 2e-4 of the body's extent so a huge model cannot explode. The
dialog opens on the STEP_LIN_DEFL / STEP_ANG_DEFL_DEG defaults
(Settings). OCCT's mesher occasionally tears a closed
body at a given tolerance; the repair (STEP_REFINE_TORN, on by default)
re-runs only that body at denser steps, keeping the best result.
Imported normals are also repaired on the way in — collapsed triangles are dropped, inverted normals are judged by the triangle cone, and outliers are judged against their own CAD face's field (a single CAD face is smooth by construction, so the face's own normals are the honest reference).
Plasticity → STEP: swept faces
Plasticity writes some swept surfaces as OFFSET_SURFACE over a C0 base,
which OCCT refuses to load — the face goes missing. The workaround is to
enable convert analytics to NURBS on export, at the cost of the analytic
types the oracle would otherwise give you. Check the imported body for
missing faces before retopologizing it.
Re-importing an edited CAD¶
Fixing the CAD mid-retopo no longer costs you the work. Edit the part in the source CAD, re-export, and repoint the session:
- STEP: one click — Re-import CAD (PATCH section of the N-panel). It
re-reads the same
.stp, converts, and rebinds automatically. - Plasticity bridge: re-export the part, select the new import in Object Mode and press Rebind Target (re-export).
The rebind matches every island of the old CAD to the new one by persistent face identity (Plasticity kernel ids, or content hashes the STEP converter derives per face) and translates your session onto it. The report tells you exactly what happened; the same text lands in the log.
What happens to your patches:
| CAD face after the edit | Your patch |
|---|---|
| untouched | carried as-is — fills, spans, strokes, freeze all survive |
| re-trimmed (same surface, moved edges) | carried + marked stale — rebuilds on your next gesture with its parametric edits |
| surface rebuilt / deleted | the old fill is removed (there is nothing to hang it on) |
| split into pieces | the old fill stays as a legacy fill — press X on any piece to remove it whole |
| frozen + geometry changed | freeze is kept, reported as FROZEN AT RISK — you decide: rework by hand or unfreeze to rebuild |
Update the converter binary
Face identity on the STEP path needs per-face entity ids from the
converter. An older binary still
imports fine, but stamps no identity — the rebind then refuses instead of
guessing (the log says update the converter binary). Objects imported
with an older build carry no identity either: re-import them once after
updating.