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

SolveCraft 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; solvecraft part.step; solvecraft-cli eval part.step, solvecraft-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.

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, B-spline curves, polylines, trimmed/surface/seam curves; length and angle units (SI prefixes, conversion-based units such as inches); product names (body names come from the solid’s name, else the product’s); surface colours; assemblies (next-assembly-usage occurrences placed by item-defined transformations, and mapped items) — the product tree is kept in the feature for the components milestone. 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.

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 into a solid by their shared edges (an open body when they do not close); 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.

Fusion corpus

Generated by cargo xtask step-corpus. Each case is a part exported from Fusion as STEP (AP214; kept locally in plan/fusion/oracle/, never committed). SolveCraft opens part.step exactly as File → Open does (an Import base feature) and compares with Fusion’s own measurements: body count, volume and area (relative tolerance 1e-3) and the number of faces read from the file.

76 / 76 files pass.

CaseResultBodiesVolume mm³ (got / Fusion)Area mm² (got / Fusion)Faces (got / Fusion)msNotes
01-boxpassBox24000.000 / 24000.0005200.000 / 5200.0006 / 63
02-cylinderpassCylinder35339.429 / 35342.9176125.845 / 6126.1063 / 387
03-box-through-holepassBox45738.283 / 45738.0539327.809 / 9327.7887 / 762
04-revolve-vasepassVase112488.847 / 112499.47913156.093 / 13156.6155 / 5511
05-taper-extrudepassFrustum61814.826 / 61814.8269676.915 / 9676.9156 / 62
06-symmetric-extrudepassBlock30000.000 / 30000.0006200.000 / 6200.0006 / 61
07-fillet-all-edgespassBox23340.621 / 23340.8494726.220 / 4726.26526 / 26532
08-chamferpassBox23730.667 / 23730.6675029.352 / 5029.35210 / 103
09-shellpassBox13632.000 / 13632.00013992.000 / 13992.00011 / 112
10-rect-pattern-holespassPlate29803.713 / 29803.54014652.481 / 14652.38918 / 18252
11-circular-pattern-flangepassFlange66758.144 / 66758.84419320.617 / 19320.79510 / 10168
12-mirror-featurepassBase21392.575 / 21392.9206530.944 / 6530.97310 / 1080
13-combine-joinpassA45570.295 / 45571.6808634.196 / 8634.3369 / 943
14-combine-cutpassA42933.034 / 42931.4179706.783 / 9706.8587 / 7402
15-combine-intersectpassA54452.172 / 54454.2737382.532 / 7382.7437 / 71022
16-sweeppassTube2584.428 / 2584.7241779.638 / 1779.6985 / 5612
17-loftpassLoft35121.595 / 35125.4986495.373 / 6495.0006 / 6191
18-hole-featurespassPlate33890.908 / 33890.7108568.695 / 8568.69613 / 13184
19-l-bracket-constrainedpassLBracket14720.000 / 14720.0005472.000 / 5472.0008 / 82
20-slot-constrainedpassSlot2965.428 / 2965.4871774.644 / 1774.6906 / 615
21-draftpassBox54574.737 / 54574.7378781.998 / 8781.9986 / 61
22-split-bodypassCyl, Cyl (1)75390.813 / 75398.22412954.440 / 12955.1756 / 6109
23-bracket-multifeaturepassBracket59331.477 / 59331.12918290.767 / 18290.73719 / 19117
24-user-parameterspassBlock34822.022 / 34821.9038114.175 / 8114.1597 / 758
25-sketch-trianglepassTriangle4032.155 / 4032.1552274.099 / 2274.0995 / 51
26-sketch-beltpassBelt11326.042 / 11326.1705637.347 / 5637.4047 / 742
27-sketch-trapezoidpassTrapezoid5342.286 / 5342.2573066.961 / 3066.9468 / 853
28-blind-pocket-filletspassBlock84299.345 / 84299.24916279.560 / 16279.57223 / 23320
29-two-sided-and-partial-revolvepassBlock25731.356 / 25731.3076312.589 / 6312.60212 / 1226
30-fillet-after-shellpassBox21745.915 / 21745.87614968.284 / 14968.33227 / 27464
31-fillet-l-all-edgespassL14321.483 / 14321.6265024.004 / 5024.04538 / 38747
32-boss-plate-filletspassPart33590.273 / 33590.3509929.854 / 9929.86410 / 101214
33-fillet-tangent-chainpassSlot8237.037 / 8237.1222793.541 / 2793.56914 / 14555
34-chamfer-then-filletpassBox22892.383 / 22892.4214753.677 / 4753.68818 / 1854
35-fillet-curved-curvedpassTee63169.685 / 63171.44310269.168 / 10269.3486 / 6904
36-corner-blend-two-radiipassBox57799.504 / 57800.2408585.437 / 8585.52418 / 18519
37-pyramid-apex-blendpassPyramid15465.376 / 15465.5753914.529 / 3914.58118 / 18312
38-coincident-cylinderspassA15706.406 / 15707.9633769.760 / 3769.9113 / 367
39-tee-pipepassTee24095.763 / 24096.23716709.772 / 16710.0487 / 7182
40-box-sphere-toruspassA36287.558 / 36287.43310696.143 / 10696.16510 / 102393
41-tube-radial-holespassTube20243.046 / 20243.98114873.689 / 14873.77322 / 221409
42-overlapping-patternspassPlate38488.411 / 38487.06421687.215 / 21686.60343 / 43533solid ‘Plate’: imported as an open body (the shell is not closed)
43-cut-splits-bodypassBar, Bar (1)28000.000 / 28000.0007200.000 / 7200.00012 / 125
44-shell-l-bracketpassL8384.000 / 8384.0008784.000 / 8784.00015 / 153
45-shell-boss-platepassPart13676.354 / 13676.60214156.531 / 14156.60215 / 1569
46-shell-two-open-facespassBox16044.000 / 16044.00011398.000 / 11398.00010 / 103
47-draft-curved-pocketpassBlock111387.998 / 111387.71217700.336 / 17700.36111 / 1127
48-pulleypassPulley168508.160 / 168510.84123718.215 / 23718.64412 / 12321
49-helical-sweeppassSpring4733.931 / 4738.0994765.903 / 4767.6523 / 310552solid ‘Spring’: face wrapping around a closed surface kept whole: split line does not reach the rings
50-sweep-tight-bendpassBend3758.025 / 3758.443– / –5 / 5405
51-loft-rect-circle-offsetpassLoft61129.957 / 61133.1169412.473 / 9411.6556 / 6251
52-circular-pattern-filletpassHub47206.182 / 47206.85014141.988 / 14142.17121 / 21820
53-path-patternpassPlate35010.499 / 35010.39816463.947 / 16463.89413 / 13130
54-mirror-body-filletspassBracket22780.113 / 22780.0896972.831 / 6972.83212 / 1298
55-tapped-hole-cosmeticpassPlate17542.360 / 17542.3144761.590 / 4761.5968 / 884
56-holes-on-curved-facepassCyl77941.171 / 77942.38810592.951 / 10593.1397 / 7378
57-hole-pattern-sketch-pointspassPlate36767.029 / 36766.71211818.165 / 11818.15324 / 24197
58-phone-standpassStand74559.442 / 74559.17729148.741 / 29148.78519 / 1924
59-enclosure-basepassEnclosure34309.038 / 34309.48633795.405 / 33795.61039 / 39286
60-pipe-flangepassFlange323661.027 / 323660.97956984.270 / 56984.56416 / 16993
61-shaft-keywaypassShaft47521.504 / 47525.9469676.781 / 9677.09614 / 14182
62-heat-sinkpassHeatSink43125.000 / 43125.00045725.000 / 45725.00066 / 668
63-hinge-knucklepassHinge4783.029 / 4783.1174110.255 / 4110.28714 / 14118
64-sketch-tangent-arc-chainpassWave4800.000 / 4800.0003843.701 / 3843.7129 / 910
65-sketch-gear-toothpassTooth3987.831 / 3988.0841945.416 / 1945.4859 / 98
66-sketch-linkagepassLink8045.410 / 8045.3864308.172 / 4308.17510 / 10129
67-sm-base-flangepassBody115000.000 / 15000.00012800.000 / 12800.0006 / 62
68-sm-edge-flangepassBody118972.476 / 18972.62216057.518 / 16057.55014 / 1426
69-sm-traypassBody129665.828 / 29666.23424979.993 / 24980.08646 / 4666
70-sm-flange-45passBody118450.704 / 18450.77715629.621 / 15629.63714 / 1414
71-sm-custom-rulepassBody110053.579 / 10053.71713896.249 / 13896.29922 / 2238
72-sm-contour-flangepassBody112097.478 / 12097.62210411.968 / 10412.00222 / 2236
73-sm-hempassBody121334.478 / 21334.72317994.397 / 17994.47322 / 2260
74-sm-unfold-refoldpassBody115800.086 / 15800.30413610.275 / 13610.32632 / 3284
75-sm-bracket-holespassBody113915.866 / 13916.01212035.934 / 12035.96225 / 25100
76-sm-thickness-variantpassBody122520.368 / 22520.57516064.089 / 16064.12814 / 1431