main
Drew Owens 0.11.4 source 8889116 1d ago

Live results: the modelling ops on real SOLIDWORKS

Measured 2026-10-14 with bridge 0.10.3 on SOLIDWORKS 2026 (major version 34, 3DEXPERIENCE edition, Windows 11). These are the features requested in wiki issue #1 and the bugs reported in #2.

Summary

  • tools/dsl-live-check.py: 30 of 30 checks pass. Each builds a part on SOLIDWORKS through swx_run_script, reads it back with swx_inspect_bodies / swx_mass_properties, and compares it with geometry computed independently in the script (closed-form volumes, bounding boxes from the documented conventions). Tolerances: volume 0.2 %, bounding box 0.01 mm.
  • swx_selftest {"level":"write"}: 43 passed, 0 failed, 1 skipped (the active-document reads, skipped because the test leaves no document open). 538 s.
  • Selections after a geometric pick used the first rung of the ladder, MultiSelect2 with a typed object array, every time (11 of 11).
  • Every scratch part was closed afterwards: SOLIDWORKS was left with no open documents.

The LEGO 2x4 brick (examples/lego-2x4.json)

Built in 4 features, measured live:

Measured Value Issue #1/#2 reference (SOLIDWORKS 2021, 22-feature build)
Volume 2073.362 mm^3 2073.362 mm^3
Bounding box [-15.9, 0.0, -7.9] to [15.9, 11.3, 7.9] mm 31.8 x 11.3 x 15.8 mm
Faces 39 39
Colour [200, 0, 0] (set before the material, kept after it) red requested
Density / mass 1020.0 kg/m^3 / 0.0021148 kg ABS 1020 / 0.0021148

CSWA benchmark, measured 2026-10-15 (bridge 0.11.2, SW 2026)

The first live run of the CSWA benchmark: tools/cswa-check.py on Drew's laptop (target adom_drew2), 2026-10-15 23:04:22Z, bridge 0.11.2, SOLIDWORKS 2026 (34.3.0, 3DEXPERIENCE "Connected"). The eight runnable parts were built in ONE bridge-made part (reuseDocument, clear_part between them), weighed with swx_mass_properties, and compared with their published keys. 8 of 8 within tolerance, every one within 0.0015 % of its key; Step 4 was skipped (it needed offsetEntities, added in 0.11.4). Each part took 7-23 s. SOLIDWORKS held 2.2 GB afterwards and quit cleanly. The full evidence (every reply) is tools/cswa/reports/cswa-2026-10-15-sw2026-0.11.2.json.

Spec Key (published) Measured live Off Time
cswa-00-lego-2x4 (spec 0, ABS) 2073.3615208 mm³ 2073.3615208 mm³ (2.1148288 g) 1e-9 % 14.7 s
cswa-01-3dengr-q5-block (6061) 324.00 g, CoM (50, 10, 30) 324.000 g, CoM (50.000, 10.000, 30.000) 0.000 % 9.4 s
cswa-02-3dengr-q6-hole (6061) 307.04 g, CoM (51.38, 10.00, 30.00) 307.035 g, CoM (51.381, 10.000, 30.000) 0.0015 % 12.0 s
cswa-03-3dengr-q8-hole30 (6061) 285.83 g 285.830 g 0.0001 % 11.8 s
cswa-04-3dengr-q9-l-bracket (AISI 1020) 410.80 g, CoM (26.54, 16.54, 20.00) 410.800 g, CoM (26.538, 16.538, 20.000) 0.000 % 7.3 s
cswa-05-tool-block-step1 (official Q3) 939.54 g 939.540 g 0.00005 % 7.7 s
cswa-06-tool-block-step2 (official Q4) 1032.32 g 1032.321 g 0.00007 % 7.5 s
cswa-07-tool-block-step3 (official Q5) 628.18 g 628.183 g 0.0005 % 23.0 s
cswa-08-tool-block-step4 (official Q6) 432.58 g SKIPPED: needed offsetEntities

The densities read back were the ones asked for (1020, 2700 and 7900 kg/m³), and each part carried its library material (ABS, 6061 Alloy, AISI 1020).

What this measured. Every variant those eight scripts used is now measured live on SOLIDWORKS 2026 (compat::OP_FACTS, measurement LIVE_2026_10_15_CSWA). That includes six variants no earlier run had built:

  • sketch.line and sketch.arc: the Tool Block profile's lines, its tangent R19 and its three-point R29 and R5;
  • sketch.faceOffset: the R41 slot's plane, 12 mm inside the back face;
  • hole.simple: Ø20 and Ø30 through all, and the Tool Block's Ø11;
  • set_material.density;
  • sketch.face.front.positive: sketches on a +Z face.

It also re-measured clear_part, cut.one, cut.one.reversed, extrude.one, select.multiSelectTyped, set_material, sketch.circle, sketch.multiProfile, sketch.offset.top.positive, sketch.plane.front, sketch.plane.top and sketch.rect on a newer bridge.

Still unmeasured (no spec in this run used them): revolve and revolve_cut, mirror, slot, polygon, the counterbored and countersunk hole, the upToNext / upToSurface / offsetFromSurface end conditions, draft, and construction geometry. 0.11.4 adds community specs that build each of them (cswa-09 to cswa-12), and the Step 4 pocket (offsetEntities, sketch regions), so the next live run measures them.

HideFileExt, measured 2026-10-15 (bridge 0.11.2, SOLIDWORKS 2026)

On Drew's laptop, with Windows' "Hide extensions for known file types" turned ON (HideFileExt=1, SOLIDWORKS restarted). This is Michael's 2021 condition, reproduced on our machine to prove the 0.10.10 fix:

Check Result
swx_new_document title read back Part1-1792103965000, with no extension. swx_docs lists it the same way
swx_run_script by path ok, bridgeCreatedDocument:true
swx_design_info, swx_get_parameters PASS by the reported title, by the stem, and by the stem + .SLDPRT
swx_set_parameter, swx_export_step (15,944 B), swx_save, swx_close_doc PASS by the stem
Left open nothing

compat::OP_FACTS carries it as titles.hiddenExtensions.

The restart that followed (the 0.11.3 finding)

The second phase restarted SOLIDWORKS with extensions shown. From the ledger:

Time (Z) Event
22:40:01 quit (processGone)
22:40:02 launch
22:40:07 sldworksUp
22:40:39 attached
22:40:43 solidworks.ready TRUE, 4 s after attach (the first phase's start took 22 s to ready)
22:40:50 swx_new_document OK, title Part1-1792104049001.SLDPRT, ledger document_created
22:40:51 swx_docs: []; SOLIDWORKS pid 26316 had DIED
22:40:58 swx_stop: host_app_not_running

This was the 2026-10-01 crash again: a document command sent while an add-in was still initialising.

0.11.3 makes these changes:

  • A performance-log marker counts only if it lies beyond the state the file was in when no SOLIDWORKS was writing it (launch, quit, or a first sight of a stale log), unless the file has been rewritten since.
  • A fresh attach is ready only with StartupProcessCompleted TRUE, this session's own marker, and 20 s after attach.
  • swx_new_document, swx_open and swx_import verify the effect on the live session: same process, still running, the document in the list. If the effect is missing they return host_app_died / document_not_created, never ok.
  • A start within 60 s of a quit waits for that session's process tree to be gone.

SOLIDWORKS 2021 (community)

Run 2026-10-15 by Michael (issue #1) with bridge 0.10.9 on SOLIDWORKS 2021 (COM RevisionNumber 29.5.1, classic desktop, Windows 11, ab 2.1.168). His reply, not our machine: it counts as a measurement by:"community" in compat::OP_FACTS.

  • swx_selftest {"level":"write"}: 44 passed, 6 failed (380 s). Every modelling check passed: T01-T22 and T24-T32 (T23, the ownership check, was an unnumbered row until 0.10.10).
  • The 6 failures were ONE bug: swx_design_info, swx_get_parameters, swx_set_parameter, swx_export_step, swx_save and swx_close_doc aimed at the scratch part as Part14-1792088642002.SLDPRT while SOLIDWORKS titled it Part14-1792088642002 — Windows' "Hide extensions for known file types" (HideFileExt=1, the Windows default) is on there and off on our laptop. The close missed too, so the part was left open; closing it by path worked. Fixed in 0.10.10: title matching ignores .sldprt/.sldasm/.slddrw, the self-test addresses its own documents by path, and swx_new_document reports the title SOLIDWORKS shows.
  • Issue #2's fixes confirmed: densitySource:"bodyMassProperty", bridgeCreatedDocument:true.

The LEGO 2x4 brick on 2021, identical to 2026:

Measured SOLIDWORKS 2021 (0.10.9) SOLIDWORKS 2026 (0.10.3)
Features 4 4
Volume 2073.362 mm^3 2073.362 mm^3
Bounding box [-15.9, 0.0, -7.9] to [15.9, 11.3, 7.9] mm the same
Faces 39 39
Colour [200, 0, 0] [200, 0, 0]
Density / mass 1020 kg/m^3 / 0.0021148 kg 1020 kg/m^3 / 0.0021148 kg

Every check

Id Check Issue Expected volume (mm^3) Measured (mm^3) Result
T01 rectangle anchor: xMm/yMm is the CORNER by default #1.5 1000.0 1000.0 PASS
T02 Top Plane: sketch +Y is model -Z #1.5 1000.0 1000.0 PASS
T03 anchor center #1.5 1000.0 1000.0 PASS
T04 sketch on a plane offset +10 mm from Top Plane #1.1 4392.699 4392.699 PASS
T05 sketch on a NEGATIVE offset plane (-5 mm) #1.1 6000.0 6000.0 PASS
T06 sketch on a FACE picked by a point (the block's top face) #1.1 4113.097 4113.097 PASS
T07 Michael's case: a default cut from Top Plane with the body on +Y must FAIL LOUDLY, never succeed silently #1.2 PASS
T08 cut reverse:true removes material on +Y #1.2 3500.0 3500.0 PASS
T09 cut throughAll + reverse #1.2 3000.0 3000.0 PASS
T10 extrude direction both (5 mm one way, 3 mm the other) #1.2 800.0 800.0 PASS
T11 extrude midPlane #1.2 1000.0 1000.0 PASS
T12 cut midPlane through the block #1.2 3904.0 3904.0 PASS
T13 two concentric circles in ONE sketch extrude as a RING #1.3 502.655 502.655 PASS
T14 two disjoint rectangles in ONE sketch: one feature, two bodies #1.3 250.0 250.0 PASS
T15 set_appearance on the part #1.4 4000.0 4000.0 PASS
T16 set_appearance on one face picked by a point #1.4 4000.0 4000.0 PASS
T17 fillet every edge of the block, r = 1 #1.6 3958.419 3958.419 PASS
T18 chamfer ONE edge picked by a point, 1 mm #1.6 3990.0 3990.0 PASS
T19 shell 1 mm, top face removed #1.6 1084 1084.0 PASS
T20 linear pattern: one boss -> 3 along X, 6 mm apart #1.6 4188.496 4188.496 PASS
T21 circular pattern: one boss -> 6 around Y #1.6 4169.646 4169.646 PASS
T22 issue #2: body mass uses the material's density (ABS 1020 kg/m^3) #2.a 4000.0 4000.0 PASS
T25 audit #1/#5: sketch on the BOTTOM face (hidden in an iso view, normal -Y) extrudes OUTWARD #1.1 4084.823 4084.823 PASS
T26 audit unverified #1: a NEGATIVE offset plane keeps the base plane's axes (asymmetric sketch, separate body) #1.1 4048.0 4048.0 PASS
T27 audit #6: an ASYMMETRIC two-way cut: depthMm goes along the cut's own direction (-normal), depth2Mm the other way #1.2 968 968.0 PASS
T28 audit unverified #2: linear pattern with NEGATIVE spacing goes -X (instances stay on the block) #1.6 4188.496 4188.496 PASS
T29 audit #1: shell removing the BOTTOM face (hidden in an iso view) removes that face, not a side #1.6 1084 1084.0 PASS
T30 audit #3: fillet ONE feature's edges by allOfFeature on a cylinder (2 circular edges) #1.6 772.517 772.517 PASS
T24 the LEGO 2x4 acceptance brick (examples/lego-2x4.json) #1 acceptance 2073.362 2073.362 PASS
T23 issue #2: run_script on the bridge's own new part (addressed by path) says bridgeCreatedDocument:true #2.b PASS

Added 2026-10-14 (bridge 0.10.4)

Eight more checks were added to tools/dsl-live-check.py and run on the same install (SOLIDWORKS 2026, major 34, 3DEXPERIENCE "Connected") with bridge 0.10.4. All eight pass. T36 and T37 first failed on the checks' own expectations, not on the bridge. A face sketch keeps the default plane's axes and projects the origin onto the face, so their circles were moved to sketch (0, 5) and both checks re-run. Since 0.10.5 these variants report proven.live: true with this measurement in measuredOn.

Id Check Issue Expected volume (mm^3) Measured (mm^3) Measured bounding box (mm) Result
T33 a REVERSED boss: reverse:true from Top Plane goes -Y #1.2 4000.0 4000.0 [-10, -10, -10] to [10, 0, 10] PASS
T34 a boss through all (one way) from a plane below the block #1.2 4062.832 4062.832 [-10, -5, -10] to [10, 10, 10] PASS
T35 Right Plane axes: sketch +X is model -Z, +Y is model +Y, a boss goes +X #1.5 1000.0 1000.0 [0, 0, -10] to [5, 20, 0] PASS
T36 a sketch on the +X side face extrudes outward along +X (Right Plane's axes, origin projected) #1.1 4037.699 4037.699 [-10, 0, -10] to [13, 10, 10] PASS
T37 a sketch on the -Z face extrudes outward along -Z (Front Plane's axes, origin projected) #1.1 4037.699 4037.699 [-10, 0, -13] to [10, 10, 10] PASS
T38 a plane offset +12 mm from Front Plane (a separate body at z 12..14) #1.1 4032.0 4032.0 two bodies, the second [-2, -2, 12] to [2, 2, 14] PASS
T39 a linear pattern in two directions (X +12, Z -12): 4 bosses on the block #1.6 4084.823 4084.823 [-10, 0, -10] to [10, 13, 10] PASS
T42 a shell outward 1 mm with the top face removed: the block becomes the cavity #1.6 1324.0 1324.0 [-11, -1, -11] to [11, 10, 11] PASS

Memory, measured 2026-10-14 (bridges 0.10.5 and 0.10.6)

What Measured
A new part per build (12 builds, each closed) SOLIDWORKS private bytes +83 to +85 MB per part (520 to 2035 MB; again 538 to 1697 MB over 8); handles +~125 per part; GetDocumentCount 0 after every close
ONE reused part (reuseDocument, 12 builds) 3260 to 3246 MB, handles 4373 to 4398: flat
A part created hidden (visible:false), then modelled refused by SOLIDWORKS: a hidden document cannot be activated, and modelling selects
swx_com_respawn about 210 MB freed (1697 to 1487 MB), handles unchanged (4022 to 4056): the bridge does not pin documents
Creating the reuse part (once) +1.95 GB while open (1487 to 3437 MB), +285 MB after its close — observed, unexplained
swx_selftest {"level":"write"}, bridge 0.10.7 (one reused part) complete, 475 s: 40 passed, 3 failed, 1 skipped; 15 documents created (more than 32 before); SOLIDWORKS 507 to 2361 MB (peak 3922 MB with parts open), handles 2809 to 5122; commit stayed "ok" (61.7 % to 70.0 %); no throttling, nothing recycled; launch attributed by ancestry
The self-test's closing swx_com_respawn freed 0 MB (2361 to 2361 MB) — with the 210 MB above: not a saving to rely on
The 3 failures of that run one bug: a single DeleteSelection2 in clear_part returned true and left a top-level sketch (Sketch13, Sketch4, Sketch9) that an earlier check left unconsumed. 0.10.8 repeats the delete until the part is empty, and falls back to a fresh part for that check if it still cannot

clear_part (the reuse step) is marked measured on 2026 in the variants table.

CSWA canary 0.11.4-rc1, measured 2026-10-16 (SW 2026): 12 of 14, two bugs caught

The first run of the live gate on a release candidate: tools/release.sh --canary published 0.11.4-rc1 (exe sha256 35f04d75…), bridge_install put it on Drew's laptop from manifests/canary.json, and tools/cswa-check.py built all 14 parts in one reused document, 22:36 to 22:55Z (tools/cswa/reports/cswa-2026-10-16-sw2026-0.11.4-rc1-FAILED.json). Three earlier attempts that day were refused by the bridge's presence rule when Drew returned to the laptop; each quit SOLIDWORKS cleanly.

Part Result Key (g) Measured (g) Off % Time
cswa-00-lego-2x4 PASS 2.114829 2.115 +0.000 44 s
cswa-01-3dengr-q5-block PASS 324.0 324.0 +0.000 28 s
cswa-02-3dengr-q6-hole PASS 307.04 307.035 +0.001 154 s
cswa-03-3dengr-q8-hole30 PASS 285.83 285.83 +0.000 35 s
cswa-04-3dengr-q9-l-bracket PASS 410.8 410.8 +0.000 22 s
cswa-05-tool-block-step1 PASS 939.54 939.54 +0.000 21 s
cswa-06-tool-block-step2 PASS 1032.32 1032.321 +0.000 23 s
cswa-07-tool-block-step3 PASS 628.18 628.183 +0.001 65 s
cswa-08-tool-block-step4 PASS 432.58 434.715 +0.494 200 s
cswa-08b-tool-block-step4-explicit PASS 432.58 434.715 +0.494 87 s
cswa-09-community-stepped-shaft PASS 103.568885 103.569 +0.000 47 s
cswa-10-community-mirrored-block PASS 722.912919 722.913 +0.000 57 s
cswa-11-community-slotted-plate FAIL 276.35927 274.188 +0.786 87 s
cswa-12-community-up-to-plates FAIL 369.687533 364.35 +1.444 220 s

What the two failures measured. The deficits locate the error, because every mass and centre of mass is exact:

  • cswa-11: 804.248 mm3 too little material, centred at x 45, z 25, y 9.33 - the countersunk hole. That is exactly the outward frustum of the 45 deg cone (r 8 to 12 over 4 mm, 1273.4 mm3) minus the inward one (r 8 to 4, 469.1 mm3): the countersink's drafted cut opened downward. The counterbore beside it, the slots and the hexagon were right.
  • cswa-12: 1976.9 mm3 short, which no single feature explains; the four-moment fit (volume and three first moments) picks one combination to 1 %: the up-to-surface pillar stopped at the next face (3392.9 mm3 missing), the up-to-surface hole cut only the first plate (1005.3 mm3 present), the 5 deg boss widened (+792 mm3) and the 10 deg pocket widened (-380.9 mm3). The up-to-next pillar and the offset-from-surface pillar were right.

So two API facts, both now in the code: Ddir1 TRUE drafts OUTWARD on SOLIDWORKS 2026 (the help says inward), and "up to surface" is swEndCondUpToSurface 4, not swEndCondUpToSelection 10, which left the direction box empty and behaved as up-to-next for a boss and a cut alike. 0.11.4-rc2 carries the fixes and a read-back of the stored end condition, depth and draft side on every extrude and cut.

The ten variants the passing parts exercised are measured on this run (LIVE_2026_10_16_RC1 in src/compat.rs): revolve.360, revolve_cut.360, revolve_cut.midPlane, mirror.features.plane, mirror.features.offset, mirror.bodies.plane, sketch.construction, sketch.offsetEntities.outer, cut.regions, cut.offsetFromSurface. The five the failing parts exercised (extrude.draft, cut.draft, hole.countersink, extrude.upToSurface, cut.upToSurface) stay unmeasured and say so.

CSWA canary 0.11.4-rc2, measured 2026-10-20 (SW 2026): 14 of 14

The fixes from the rc1 run, proven on the bytes that ship: 0.11.4-rc2 (exe sha256 1f812642…) on Drew's laptop, 13:13 to 13:20Z, every part in one reused document (tools/cswa/reports/cswa-2026-10-20-sw2026-0.11.4.json). cswa-11 and cswa-12, the two that located the draft flag and the up-to-surface id four days earlier, now land on their keys; nothing else moved.

Part Result Key (g) Measured (g) Off % Time
cswa-00-lego-2x4 PASS 2.114829 2.115 +0.0000 20 s
cswa-01-3dengr-q5-block PASS 324.0 324.0 +0.0000 12 s
cswa-02-3dengr-q6-hole PASS 307.04 307.035 +0.0015 23 s
cswa-03-3dengr-q8-hole30 PASS 285.83 285.83 +0.0001 21 s
cswa-04-3dengr-q9-l-bracket PASS 410.8 410.8 +0.0000 11 s
cswa-05-tool-block-step1 PASS 939.54 939.54 +0.0000 18 s
cswa-06-tool-block-step2 PASS 1032.32 1032.321 +0.0001 15 s
cswa-07-tool-block-step3 PASS 628.18 628.183 +0.0005 35 s
cswa-08-tool-block-step4 PASS 432.58 434.715 +0.4936 49 s
cswa-08b-tool-block-step4-explicit PASS 432.58 434.715 +0.4936 37 s
cswa-09-community-stepped-shaft PASS 103.568885 103.569 +0.0000 16 s
cswa-10-community-mirrored-block PASS 722.912919 722.913 +0.0000 23 s
cswa-11-community-slotted-plate PASS 276.35927 276.359 +0.0000 36 s
cswa-12-community-up-to-plates PASS 369.687533 369.688 +0.0000 54 s

With this run the five variants rc1 caught are measured as well (extrude.draft, cut.draft, hole.countersink, extrude.upToSurface, cut.upToSurface), together with extrude.upToNext, extrude.offsetFromSurface, hole.counterbore and cut.one.throughAll, which only the failing parts had exercised on rc1. The table in src/compat.rs records them on the release after 0.11.4 (the gate forbids a code change between the canary and its publish), so swx_describe on 0.11.4 still lists them as not measured.

Not yet measured

  • SOLIDWORKS versions other than 2026 and 2021 (2021: a community run, 2026-10-15): supported by the API audit in docs/COMPATIBILITY.md, not yet run. swx_selftest {"level":"write"} on that install answers it.
  • throughAll with direction:"both" on a boss, the IEntity::Select4, SelectByRay and SelectByID2 selection rungs (never needed live: the first rung worked), and the CreateDefinition fillet fallback (never needed: FeatureFillet3 worked).
  • Sketches on a plane offset from Right Plane, a negative offset from Front Plane, or an offset from a named plane; sketches on a named plane; sketches on faces facing -X. (+Z faces: measured by the CSWA run, 2026-10-15.)
  • A chamfer on all of a feature's edges, a colour on one body of a multi-body part, and new_assembly, save_as, rebuild and zoom_fit as script steps.
  • Of the 0.11.0 exam ops, after the canary of 2026-10-16, still unmeasured: the counterbored and countersunk hole, upToNext, upToSurface and draft (the last two fixed in 0.11.4-rc2), offsetFromSurface on a boss, revolve by angle, mirror about faces and face-offset planes, and a plain through-all cut; of 0.11.4's, offsetEntities of a whole face and a boss of sketch regions (regionsAtMm). The specs cswa-08, cswa-08b, cswa-11 and cswa-12 build every one of them; the next live CSWA run (0.11.4-rc2) measures them.
  • swx_describe lists every variant and its measurement as liveMeasured (one table, compat::OP_FACTS).