Files
OneCAD/docs/iges-import.md
T
bherbruckandClaude Opus 5.5 a7fe0429f0 IGES reader checked against Fusion's IGES exports: 75 of 76 reference parts read back exactly; cone tips read whole
`cargo xtask step-corpus --iges` (and `solvecraft-cli step-corpus --iges`) opens every oracle part.igs as File → Open does and compares body count, volume, area and face count with Fusion's measurements, writing docs/iges-import.md. The run found faces closing at an apex (a drill point's cone, a sphere's pole: the seam runs out to the apex and straight back) kept whole and meshed wrongly; they are now split along the iso-line opposite the seam like bands are (18-hole-features and 40-box-sphere-torus pass). The one failure left, 50-sweep-tight-bend, is written by Fusion as five loose, partly degenerate surfaces that Fusion cannot read back as a solid either; documented in the report. Test: a drilled blind hole round-trips through IGES.

Fixes #14

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT
2026-10-10 05:56:53 +00:00

9.6 KiB
Raw Permalink Blame History

IGES import (Fusion corpus)

Generated by cargo xtask step-corpus --iges. Each case is a reference part exported from Fusion as IGES 5.3 (kept locally in plan/fusion/oracle/, never committed). SolveCraft opens part.igs exactly as File → Open does and compares with Fusion's measurements of the part it exported: body count, volume and area (relative tolerance 1e-3) and the number of faces read from the file. How IGES is read: see STEP import. 50-sweep-tight-bend is written by Fusion as five loose, partly degenerate surfaces (seams running into slits, a ring given twice); Fusion cannot read it back as a solid either.

75 / 76 files pass.

Case Result Bodies Volume mm³ (got / Fusion) Area mm² (got / Fusion) Faces (got / Fusion) ms Notes
01-box pass Body1 24000.000 / 24000.000 5200.000 / 5200.000 6 / 6 35
02-cylinder pass Body1 35339.346 / 35342.917 6125.844 / 6126.106 3 / 3 399
03-box-through-hole pass Body1 45738.459 / 45738.053 9327.794 / 9327.788 7 / 7 292
04-revolve-vase pass Body1 112488.577 / 112499.479 13156.092 / 13156.615 5 / 5 1515
05-taper-extrude pass Body1 61814.826 / 61814.826 9676.915 / 9676.915 6 / 6 28
06-symmetric-extrude pass Body1 30000.000 / 30000.000 6200.000 / 6200.000 6 / 6 33
07-fillet-all-edges pass Body1 23340.463 / 23340.849 4726.195 / 4726.265 26 / 26 1285
08-chamfer pass Body1 23730.667 / 23730.667 5029.352 / 5029.352 10 / 10 64
09-shell pass Body1 13632.000 / 13632.000 13992.000 / 13992.000 11 / 11 76
10-rect-pattern-holes pass Body1 29803.844 / 29803.540 14652.460 / 14652.389 18 / 18 1988
11-circular-pattern-flange pass Body1 66758.418 / 66758.844 19320.582 / 19320.795 10 / 10 2360
12-mirror-feature pass Body1 21392.312 / 21392.920 6530.923 / 6530.973 10 / 10 753
13-combine-join pass Body1 45569.249 / 45571.680 8634.154 / 8634.336 9 / 9 383
14-combine-cut pass Body1 42932.838 / 42931.417 9706.788 / 9706.858 7 / 7 1401
15-combine-intersect pass Body1 54451.677 / 54454.273 7382.501 / 7382.743 7 / 7 2559 solid 'Body1': face wrapping around a closed surface kept whole: unsupported seam loop layout (8 runs)
16-sweep pass Body1 2584.300 / 2584.724 1779.617 / 1779.698 5 / 5 1957
17-loft pass Body1 35120.291 / 35125.498 6495.290 / 6495.000 6 / 6 601
18-hole-features pass Body1 33890.962 / 33890.710 8568.687 / 8568.696 13 / 13 1552
19-l-bracket-constrained pass Body1 14720.000 / 14720.000 5472.000 / 5472.000 8 / 8 39
20-slot-constrained pass Body1 2965.385 / 2965.487 1774.641 / 1774.690 6 / 6 88
21-draft pass Body1 54574.737 / 54574.737 8781.998 / 8781.998 6 / 6 38
22-split-body pass Body1, Body2 75390.604 / 75398.224 12954.438 / 12955.175 6 / 6 802
23-bracket-multifeature pass Body1 59331.547 / 59331.129 18290.759 / 18290.737 19 / 19 1441
24-user-parameters pass Body1 34822.114 / 34821.903 8114.166 / 8114.159 7 / 7 437
25-sketch-triangle pass Body1 4032.155 / 4032.155 2274.099 / 2274.099 5 / 5 51
26-sketch-belt pass Body1 11326.049 / 11326.170 5637.345 / 5637.404 7 / 7 599
27-sketch-trapezoid pass Body1 5342.307 / 5342.257 3066.958 / 3066.946 8 / 8 832
28-blind-pocket-fillets pass Body1 84299.377 / 84299.249 16279.553 / 16279.572 23 / 23 2087
29-two-sided-and-partial-revolve pass Body1 25731.359 / 25731.307 6312.589 / 6312.602 12 / 12 229
30-fillet-after-shell pass Body1 21745.916 / 21745.876 14968.283 / 14968.332 27 / 27 1298
31-fillet-l-all-edges pass Body1 14321.380 / 14321.626 5023.977 / 5024.045 38 / 38 2673
32-boss-plate-fillets pass Body1 33590.273 / 33590.350 9929.855 / 9929.864 10 / 10 3878
33-fillet-tangent-chain pass Body1 8236.989 / 8237.122 2793.535 / 2793.569 14 / 14 1687
34-chamfer-then-fillet pass Body1 22892.359 / 22892.421 4753.672 / 4753.688 18 / 18 577
35-fillet-curved-curved pass Body1 63169.296 / 63171.443 10269.098 / 10269.348 6 / 6 9098 solid 'Body1': face wrapping around a closed surface kept whole: split line does not reach the rings (×2); solid 'Body1': face wrapping around a closed surface kept whole: unsupported seam loop layout (8 runs)
36-corner-blend-two-radii pass Body1 57799.380 / 57800.240 8585.423 / 8585.524 18 / 18 3015
37-pyramid-apex-blend pass Body1 15465.384 / 15465.575 3914.545 / 3914.581 18 / 18 5090
38-coincident-cylinders pass Body1 15706.154 / 15707.963 3769.748 / 3769.911 3 / 3 354
39-tee-pipe pass Body1 24095.711 / 24096.237 16709.770 / 16710.048 7 / 7 2800 solid 'Body1': face wrapping around a closed surface kept whole: unsupported seam loop layout (8 runs) (×2)
40-box-sphere-torus pass Body1 36287.765 / 36287.433 10696.188 / 10696.165 10 / 10 6187
41-tube-radial-holes pass Body1 20243.087 / 20243.981 14873.680 / 14873.773 22 / 22 9763
42-overlapping-patterns pass Body1 38488.942 / 38487.064 21687.167 / 21686.603 43 / 43 5322 a solid's shell does not close; solid 'Body1': imported as an open body (the shell is not closed)
43-cut-splits-body pass Body1, Body2 28000.000 / 28000.000 7200.000 / 7200.000 12 / 12 128
44-shell-l-bracket pass Body1 8384.000 / 8384.000 8784.000 / 8784.000 15 / 15 132
45-shell-boss-plate pass Body1 13676.813 / 13676.602 14156.507 / 14156.602 15 / 15 785
46-shell-two-open-faces pass Body1 16044.000 / 16044.000 11398.000 / 11398.000 10 / 10 141
47-draft-curved-pocket pass Body1 111388.066 / 111387.712 17700.333 / 17700.361 11 / 11 290
48-pulley pass Body1 168508.132 / 168510.841 23718.191 / 23718.644 12 / 12 4041
49-helical-sweep pass Body1 4740.421 / 4738.099 4768.066 / 4767.652 3 / 3 33507
50-sweep-tight-bend FAIL Body1 1621.826 / 3758.443 – / – 4 / 5 813 the surfaces do not close into a solid: imported as an open body; solid 'Body1': face #231: face boundary is not a closed loop; solid 'Body1': imported as an open body (the shell is not closed)
51-loft-rect-circle-offset pass Body1 61129.309 / 61133.116 9412.484 / 9411.655 6 / 6 532
52-circular-pattern-fillet pass Body1 47206.121 / 47206.850 14141.995 / 14142.171 21 / 21 5990
53-path-pattern pass Body1 35010.576 / 35010.398 16463.935 / 16463.894 13 / 13 1431
54-mirror-body-fillets pass Body1 22780.189 / 22780.089 6972.821 / 6972.832 12 / 12 861
55-tapped-hole-cosmetic pass Body1 17542.374 / 17542.314 4761.564 / 4761.596 8 / 8 543
56-holes-on-curved-face pass Body1 77940.974 / 77942.388 10592.891 / 10593.139 7 / 7 3231 solid 'Body1': face wrapping around a closed surface kept whole: a hole crosses the split line
57-hole-pattern-sketch-points pass Body1 36767.089 / 36766.712 11818.157 / 11818.153 24 / 24 2099
58-phone-stand pass Body1 74559.445 / 74559.177 29148.741 / 29148.785 19 / 19 181
59-enclosure-base pass Body1 34309.026 / 34309.486 33795.404 / 33795.610 39 / 39 2120 solid 'Body1': 2 face(s) could not be meshed and are not shown; solid 'Body1': face wrapping around a closed surface kept whole: cannot cut a ring edge at the split line (×4)
60-pipe-flange pass Body1 323660.822 / 323660.979 56984.283 / 56984.564 16 / 16 4410
61-shaft-keyway pass Body1 47521.369 / 47525.946 9676.777 / 9677.096 14 / 14 3019 solid 'Body1': face wrapping around a closed surface kept whole: a hole crosses the split line
62-heat-sink pass Body1 43125.000 / 43125.000 45725.000 / 45725.000 66 / 66 278
63-hinge-knuckle pass Body1 4783.060 / 4783.117 4110.247 / 4110.287 14 / 14 974 solid 'Body1': face wrapping around a closed surface kept whole: a hole crosses the split line
64-sketch-tangent-arc-chain pass Body1 4800.000 / 4800.000 3843.701 / 3843.712 9 / 9 113
65-sketch-gear-tooth pass Body1 3987.829 / 3988.084 1945.416 / 1945.485 9 / 9 119
66-sketch-linkage pass Body1 8045.432 / 8045.386 4308.169 / 4308.175 10 / 10 1662
67-sm-base-flange pass Body1 15000.000 / 15000.000 12800.000 / 12800.000 6 / 6 31
68-sm-edge-flange pass Body1 18972.511 / 18972.622 16057.510 / 16057.550 14 / 14 182
69-sm-tray pass Body1 29665.924 / 29666.234 24979.972 / 24980.086 46 / 46 568
70-sm-flange-45 pass Body1 18450.720 / 18450.777 15629.618 / 15629.637 14 / 14 112
71-sm-custom-rule pass Body1 10053.662 / 10053.717 13896.235 / 13896.299 22 / 22 277
72-sm-contour-flange pass Body1 12097.511 / 12097.622 10411.960 / 10412.002 22 / 22 264
73-sm-hem pass Body1 21334.436 / 21334.723 17994.374 / 17994.473 22 / 22 317
74-sm-unfold-refold pass Body1 15800.138 / 15800.304 13610.263 / 13610.326 32 / 32 286
75-sm-bracket-holes pass Body1 13915.905 / 13916.012 12035.926 / 12035.962 25 / 25 558
76-sm-thickness-variant pass Body1 22520.416 / 22520.575 16064.080 / 16064.128 14 / 14 139