Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

STEP import

SolidCraft reads STEP (ISO 10303-21; AP203, AP214 and AP242 geometry) with its own reader in crates/kernel/src/step_in (written from the public standards; no third-party STEP code). A STEP file becomes an Import base feature on the timeline: it holds the file’s B-rep (the STEP text is kept in the design, so the design reopens without the file) and later features — fillets, holes, cuts sketched on its faces, shells — build on its bodies.

  • Open: File → Open (doc.open) accepts .step/.stp in any case and starts a new design; solidcraft part.step; solidcraft-cli eval part.step, solidcraft-cli run script.json --in part.step; the MCP open tool.
  • Insert into the current design: File → Insert STEP… or SOLID → INSERT (file.insert_step {path}).
  • Drag and drop a STEP file on the window: inserted when the design has features, opened otherwise.

Imports are components

Every import (STEP, IGES, 3MF, STL, OBJ; inserted, dropped, opened as a new design, or run as file.insert_step, file.insert_mesh or doc.open from a script, the CLI or MCP) becomes a new component named after the file (bracket.step → component bracket), placed in the active component at the file’s origin. The Import feature belongs to it, so the file’s bodies never land loose next to your own. Opening a file as a design makes the component too, so the browser shows the file’s name. The command’s reply reports it: component (id), component_name and occurrence. With the top level (or any component above the part) active, an extrude, revolve or press-pull from a sketch on a part’s face cuts or joins that part’s body in its own component, wherever the part is placed, and every placement of the part shows the change. It is refused, with the reason, for a part linked to another design and for a face on a further placement of a part placed more than once (activate that placement to change it there).

A STEP assembly keeps its structure: each product under the file’s root becomes a component nested under the import’s, named after the product, at the place the file gives it. IGES groups and subfigures become nested components the same way. A part (or sub-assembly) the file places more than once becomes one component with an occurrence per placement: the Import feature builds the part once and skips the file’s later copies (skip in the feature, format 22), and the occurrences show it everywhere else. Placements that are scaled, mirrored or otherwise non-rigid keep their geometry in place in the parent component. The reply adds subcomponents (how many components were made below the import’s) and rigid_joints.

The Browser reuses body, sketch and construction-plane membership, child lists and resolved placements while the camera moves. Large assemblies keep their tree open without resolving every part and folder again on each frame. Geometry edits, assembly changes and uncaptured or reverted positions refresh those queries; selection, visibility and locking are read live.

Hover picking pauses while the mouse moves the view and resumes when navigation stops. A 3D mouse moving the view leaves it on: the pointer hand is free, so preselection and clicks keep working while the other hand turns the view. Picking uses the current camera and the cached body bounds directly in model order, so finding each body’s bounds does not scan the assembly again.

Hovering an assembly’s Browser row retains its whole-body highlight buffers during rotation, panning and zoom; the GPU transforms those buffers with the camera. The origin and construction widgets resize independently. Whole-body highlight generation scans each mesh once rather than scanning it again for every face. Sketch profile feedback still updates its projected curves and lift toward the eye as the view changes.

The contents of an imported assembly are rigid by default: rigid joints (a rigid group, its glyphs not drawn) hold each part where the file put it in its parent, so moving the import’s component moves everything, and an inner part doesn’t move on its own; joint degrees of freedom count the whole import as one body. To joint the parts one by one, release them with Unlock Contents on the component’s browser menu (component.unlock {component}), one undo step. Undo takes a whole import away in one step.

Designs saved before imports made components keep their Import where it is (no component is made for it) and rebuild as they did.

Read: manifold solid breps (with voids), faceted breps, shell-based surface models; planes, cylinders, cones, spheres, tori, B-spline and rational B-spline surfaces (with knots, Bézier, uniform, quasi-uniform), surfaces of revolution and linear extrusion, trimmed surfaces; lines, circles, ellipses, hyperbolas and parabolas (as exact rational curves, which export writes back as exact rational B-splines), B-spline curves, polylines, trimmed/surface/seam curves; length and angle units (SI prefixes, conversion-based units such as inches); product names (meaningful solid names are kept, placeholders use part names; names below chooses); surface colours; assemblies (next-assembly-usage occurrences placed by item-defined transformations, and mapped items) — the product tree is kept in the feature and becomes the import’s components (above). Files are untrusted: sizes, entity counts and nesting are capped and every kernel call is guarded. What cannot be read becomes a warning on the feature (a face left out gives an open body); not read yet: offset surfaces, pcurve-only edges.

Extruded circular and elliptical faces keep their profile’s parameter seam outside the face trim, or on an explicit seam edge. Narrow faces such as rounded gear tooth tips therefore stay narrow through the full thickness instead of wrapping around the supporting ellipse in the middle.

Files from other CAD systems

Files from different systems differ in which way is up and in what they call their solids. doc.open, file.insert_step and the MCP open tool take two options for STEP and IGES files; without them a file comes in as written.

  • up: "z" (the default) keeps the file’s axes. Many systems write Y up, so such a part lies on its back in SolidCraft’s Z-up space. "up": "y" turns the import’s component a quarter turn about X (+90°: Y becomes Z), as the window’s “Stand it up” offer does, so an assembly’s parts and instances turn together. The import and the turn are one undo step, the reply names the turned occurrence as stand_up, and only the file’s component turns, not what is already in the design. The window offers to stand a part up after a STEP file opens unless the call said which way is up (up: "z" as well as "y") or the file came from SolidCraft, which already writes Z up. A STEP reply’s system is the originating system the file’s header names (SolidCraft for SolidCraft’s own exports). A header that names SolidWorks (in FILE_NAME’s originating system or preprocessor version, or in FILE_DESCRIPTION; for IGES, the start of the global section’s native system ID, which becomes the originating system) says the file has Y up: the reply carries exporter (SolidWorks) and exporter_up (y), and the window asks in the “Stand this part up?” dialog, which says so (“Exported by SolidWorks, which usually saves Y up”). The first opening never turns a file without asking, because the exporter may have saved it Z up; unchanged files reuse a remembered stand-up answer unless Preferences › Design › Remember stand-up answers is off; a component’s right-click menu has Placement → Turn Up Axis (Y up → Z up, Z up → Y up: a quarter turn about X, one undo step) for fixing it any time. SolidCraft’s own files say z and are left alone. Any other exporter is unknown, and such files are often upright already, so by default the window first looks at how the bodies rest: a part rests on its flat faces, so the flat area facing down Z is weighed against the larger flat area facing down or up Y (faces within 10° of the direction; one side must have at least 1.5 times the other’s, else the thinner of the box’s Y and Z sizes decides). Unless the file clearly stands upright, the window shows a small note over the view (“Did this part open the wrong way up?” with Stand it up and Close) that goes by itself after 10 seconds and never blocks input; a file that clearly stands upright gets nothing, and an unclear shape still gets the note. A SolidWorks file whose bodies clearly stand on Z already gets the note instead of the dialog, since it may have been saved Z up. Preferences › Design › “For files from unknown programs” picks the dialog for every file from another program, SolidWorks too, without looking at how it rests (Ask in a dialog, as before) or no offer (Don’t offer) instead. The dialog and the note say “assembly” when the file brought more than one body or a component tree.
  • names: "auto" (the default) keeps meaningful solid names and replaces placeholders such as Body1 or Body 2 (3) with the nearest named product, then the occurrence name if no product is named. "solid" keeps the solid’s name; "product" chooses the part’s name; "instance" chooses the assembly occurrence (Post-2), falling back to the product. If the chosen name is missing, the solid’s name remains. Repeated names are numbered (Post, Post (2)). Names are stored with the Import feature and survive reopening the design. Files without names or assembly metadata retain generated body names and a flat structure.
  • Vertices off their curves: some systems write an edge’s vertex a little beside the end of its curve, often further off than the accuracy the file declares (UNCERTAINTY_MEASURE_WITH_UNIT). A vertex up to the file’s own tolerance off, or up to 1/1000 of the model’s size (never more than 1 mm), is read as that end of the edge: the curve’s end is moved onto the vertex. A vertex further off leaves its face out, with a warning that says how far off it is.
{"command": "file.insert_step", "params": {"path": "frame.step", "up": "y", "names": "instance"}}

Imported appearances

Imported body colours and face colours are retained through later features. Body colours remain the fallback under explicit design appearances and materials; face colours follow persistent face names. A removed face has no colour assignment to display on the resulting body.

IGES

IGES 5.3 files (.igs/.iges) open, insert and drop the same way: crates/kernel/src/iges_in.rs (written from the published specification) restates the file as STEP and the STEP reader reads it, so the feature holds STEP text. Read: manifold solid B-reps (186) with their shells, faces, loops, edge and vertex lists; trimmed (144) and bounded (143) surfaces, and bare B-spline patches, sewn within their owning group into a solid by their shared edges (an open body when they do not close); groups (402 forms 1, 7, 14 and 15), subfigure definitions (308) and instances (408), retaining names, nesting and placements; lines, circular arcs, ellipses, composite curves, rational B-spline curves; planes (108, 190), cylinders, cones, spheres, tori, rational B-spline surfaces, surfaces of revolution and tabulated cylinders; transformation matrices; units; colours (314 and the predefined numbers); body names (name properties, else labels). Not read yet: ruled and offset surfaces, curves on surfaces given only in parameter space. Export (file.export to .igs) writes each body as a manifold solid B-rep on the same surfaces a STEP export uses, with its name and colour.

FreeCAD and Rhino

FreeCAD .FCStd and Rhino .3dm files open, insert and drop the same way, in the desktop app, the browser app and the CLI. They are read with cadmpeg (Apache-2.0, crates/io/src/native_cad.rs): cadmpeg detects the format from the bytes, decodes it into its neutral model under resource caps, checks that model and writes it as STEP AP214, which the STEP reader then reads. The feature holds that STEP text, so the design reopens without the original file. A FreeCAD body’s intermediate shapes (each pad’s, pocket’s and tool’s, and its tip’s, which FreeCAD shows through the body) and shape binders are not imported: only the bodies come in. Losses cadmpeg reports become warnings on the feature, and a file without an importable solid is refused with a message. cadmpeg runs inside the panic guard. How much of a file is read follows cadmpeg’s support for that format (format support).

FreeCAD feature history

A FreeCAD file’s design history is rebuilt as features by default (history: features on doc.open and file.insert_step; Preferences › General › FreeCAD files). cadmpeg decodes the file at full depth and crates/io/src/native_cad/design.rs writes one feature per FreeCAD feature, in history order, into the file’s component:

FreeCADSolidCraft
Sketcher sketch: lines, circles, arcs, pointsSketch on the same plane, with FreeCAD’s solved geometry and each constraint that keeps it (coincident, horizontal, vertical, parallel, perpendicular, tangent, equal, point on object, symmetric, midpoint, fixed, distance, horizontal and vertical distance, radius, diameter, angle); dimensions become parameters
Pad, Pocket, Part Extrusion: blind, through all, symmetric, two-sided, along the sketch normal or an edgeExtrude (new body, join, cut); a loop inside another is a hole, as FreeCAD makes faces
Revolution, Groove, Part Revolution: angle, symmetric, two-sidedRevolve
Fillet (constant radius), Chamfer (distance, two distances, distance and angle)Fillet, Chamfer on the same edges
Part and PartDesign box, cylinder, cone, sphere, torus (whole)Box, Cylinder, Cone, Sphere, Torus
Mirrored, LinearPattern (one direction), PolarPattern of featuresMirror, Pattern of the same features
Body placement, datum planes, axes and points, shape bindersapplied to the features / not rebuilt (sketches on them keep their place)

The rebuilt design is evaluated and compared with the file’s own solids: each body must have the volume, extent and centre of one of them. When a feature cannot be rebuilt (another operation, an up-to-face extent, a tapered pad, an ellipse or B-spline in a sketch, a MultiTransform, a feature after a body’s tip), SolidCraft cannot build one (some fillets) or the comparison fails, the file’s solids come in as an Import feature as before, with a warning that says why. A constraint that would move FreeCAD’s geometry is left out, and a warning counts those. Expressions and spreadsheets are not carried over: the parameters hold the values FreeCAD computed. Rhino files have no such history; their solids come in as before.

Only codecs for open formats are compiled in: the workspace turns off cadmpeg’s default features and enables fcstd, rhino and step (the writer). cadmpeg’s codecs for commercial CAD formats are not built, and neither is its sat codec, which decodes ShapeManager streams with ACIS as one dialect, so ACIS .sat/.sab files are not read yet. crates/io/src/native_cad.rs is the one place cadmpeg is called; a cadmpeg-based STEP reader could be added there later behind a setting, to compare with the STEP reader above without changing it.