app
SOLIDWORKS Bridge
Public Made by Adomby adom
Launch, model and quit SOLIDWORKS from any Adom container. Nothing is ever lost.
← Commit history
0.11.4 source
37 files changed
+22547−182
diff truncated
BRIDGE_VERSION+1−1Cargo.lock+1−1Cargo.toml+1−1README.md+118−5SKILL.md+4−1bridge.json+1−1docs/COMPATIBILITY.md+39−10docs/LIVE-RESULTS.md+125−2install.shpackage.json+1−1references/modelling-and-export.md+22−2resources/cswa/cswa-08-tool-block-step4.json+124−6resources/cswa/cswa-08b-tool-block-step4-explicit.json+419resources/cswa/cswa-09-community-stepped-shaft.json+163resources/cswa/cswa-10-community-mirrored-block.json+157resources/cswa/cswa-11-community-slotted-plate.json+214resources/cswa/cswa-12-community-up-to-plates.json+305src/comhost/com.rs+336−14src/comhost/mock_csg.rs+56src/comhost/mock_model.rs+122−7src/compat.rs+157−49src/cswa.rs+158−4src/modeling.rs+38−2src/script.rs+213−19src/selftest.rs+11−3src/verbs3.rs+2−1tests/cswa.rs+147−4tests/issue1.rs+9−2tests/regions.rs+132tests/wiring.rs+357−2tools/check-docs-only.py+80tools/check-live-report.py+53−10tools/cswa-check.py+183−7tools/cswa/README.md+60−16tools/cswa/SOURCES.md+6−11tools/cswa/reports/cswa-2026-10-16-sw2026-0.11.4-rc1-FAILED.json+11993tools/cswa/reports/cswa-2026-10-20-sw2026-0.11.4.json+6739BRIDGE_VERSION+1−1@@ -1 +1 @@-0.11.3+0.11.4
Cargo.lock+1−1@@ -122,7 +122,7 @@ dependencies = [ [[package]] name = "swx-bridge"-version = "0.11.3"+version = "0.11.4" dependencies = [ "miniz_oxide", "serde",
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "swx-bridge"-version = "0.11.3"+version = "0.11.4" edition = "2021" rust-version = "1.80" description = "Adom SOLIDWORKS bridge — swx_* verbs over the SOLIDWORKS COM API, as a single native binary"
README.md+118−5@@ -318,11 +318,58 @@ python3 tools/live-smoke.py # the full live suite **Every release is also checked against CSWA exam parts** (0.11.0): `resources/cswa/` holds exam-style parts with their PUBLISHED answers (the official Dassault sample exam's Tool Block,-steps 1-4; the 3dengr practice set; the LEGO brick as spec 0). `python3 tools/cswa-check.py`+steps 1-4; the 3dengr practice set; the LEGO brick as spec 0) and community parts whose keys are+derived analytically (each spec's `derivation` reproduces its key in Python). `python3 tools/cswa-check.py` builds each one live, weighs it with `swx_mass_properties`, and compares it with the key within-the exam's 1 %; `swx_selftest {"level":"cswa"}` does the same on any install. Then-`tools/release.sh --require-live cswa-report.json --publish` refuses to publish without a passing-report from THIS version, newer than the last code commit. See [`tools/cswa/README.md`](tools/cswa/README.md).+the exam's 1 %; `swx_selftest {"level":"cswa"}` does the same on any install. See+[`tools/cswa/README.md`](tools/cswa/README.md).++**The release ritual: every publish is proven live (0.11.4), on the very bytes that ship.**++Only a PUBLISHED build reaches the test machine: ab installs what a manifest names, after checking the+zip's sha256, and reaps anything side-loaded. So the build is first published as a release CANDIDATE+that no one else gets (the canary). The live check runs on that candidate, and the publish then ships+those same bytes.++1. Commit the release (version bump, tests, docs).+2. `tools/release.sh --canary` builds the zip and publishes it as the release `<version>-rc<N>`. It+ also writes the page file `manifests/canary.json`, a manifest naming that candidate, and commits+ it: the record holds the code commit and the sha256 of the exe inside the zip. It reads the page's+ copy back, then prints the next three commands. The main manifest, which every other machine+ follows, is not touched.+3. On the test machine only, install the candidate:+ `adom-bridge --target adom_drew2 --ai-thread "SolidWorks Bridge" bridge_install '{"manifestUrl":"https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/manifests/canary.json"}'`.+ This does not pin the machine to the canary. ab polls a bridge's own declared `updateManifestUrl`+ first (`adom-bridge help bridge_check_updates`). Every zip's `bridge.json` declares the MAIN+ manifest there, and the canary file says the same.+4. Run `python3 tools/cswa-check.py --target adom_drew2 --report auto` there. The report lands in+ `tools/cswa/reports/`, and it records which build ran in `bridge`:+ - the installed exe's sha256, read back through ab's `read_file`;+ - the manifest it was installed from, and that zip's sha256.+5. Commit the report, then run `tools/release.sh --require-live tools/cswa/reports/<that report> --publish`.+ This PROMOTES the canary without rebuilding. It refuses unless:+ - the canary is of this version;+ - no code was committed since it was built;+ - the zip in `dist/` (or the candidate's asset, downloaded) has the canary's sha256;+ - the report ran the exe inside that zip.++ It then prints how to put the test machine back on the main manifest, should it still name the+ canary.++`--publish` on its own is REFUSED before anything is built. `tools/check-live-report.py` accepts a+report only when it comes from `cswa-check` and was made by THIS bridge version. It must also have+run EVERY part shipped in `resources/cswa/` (a run narrowed with `--only` proves nothing about the+rest; a part may be skipped only for an op the bridge lacks), passed every part it ran, and not+stopped. It must be newer than the last commit that touched `src/`, `resources/` or `Cargo.toml`:+a report made before the last code change proves nothing about this build. Finally, it must say,+in `bridge.exeSha256`, that it ran the exe being published.++The one exception is `tools/release.sh --docs-only --publish`, for a release that changes no+code. `tools/check-docs-only.py` checks the changes since the last publish (the last commit to the+release manifest). It refuses anything in `src/` or `resources/`, untracked files included, since+`resources/` ships as it is on disk. It refuses any change to `Cargo.toml` or `Cargo.lock` beyond+the package's own version line. A docs-only release's changelog starts with "Docs-only release: no+code changed since <version> … the live CSWA gate was skipped". `live-smoke.py` creates its own scratch part, builds a real 50×30×20 mm solid, reads the geometry back, drives a dimension, exports eight formats, checks the@@ -506,7 +553,73 @@ not. ## Roadmap -- v0.11.3 (this): **a quick restart is not ready; a reply is not an effect.**+- v0.11.4 (this): **every publish is proven live; Offset Entities; a spec for every op nothing had built.**++ Recorded first: the first live CSWA run (2026-10-15, bridge 0.11.2, SOLIDWORKS 2026). It passed 8 of 8,+ every part within 0.0015 % of its key (`docs/LIVE-RESULTS.md`). Every variant those scripts used is now+ measured live (`LIVE_2026_10_15_CSWA`). Six were built for the first time: lines and arcs, the+ face-offset plane, the plain hole, the density, and a sketch on a +Z face.++ Now:+ - **The live gate is the rule.** `tools/release.sh --publish` refuses without `--require-live <report>`,+ before anything is built. `--docs-only` skips the gate, and its changelog says so. It is allowed only+ when `tools/check-docs-only.py` finds nothing changed in `src/` or `resources/` (untracked files+ included) and nothing in Cargo.toml or Cargo.lock beyond the version. `tools/check-live-report.py`+ now also needs EVERY shipped part to have run: a run narrowed with `--only` is refused. The ritual+ is under "Live validation" above.+ - **The canary is what ships.** Only a published build reaches the test machine. So+ `tools/release.sh --canary` publishes the build as the release candidate `<version>-rc<N>`, with+ `manifests/canary.json` naming it; it is installed by hand, on the test machine only.+ `--require-live <report> --publish` then promotes those exact bytes, with no rebuild. It does so+ only when the report says it ran that exe (`bridge.exeSha256`, which `cswa-check` reads back+ from the installed copy) and no code changed since the canary. `cswa-check --report auto` names+ the report itself.+ - **`offsetEntities`**: a model face's outline offset into the sketch by SOLIDWORKS+ (`IModelDoc2::SketchOffsetEntities2`, available since 2001Plus, so on 2021 too). It takes the outer+ loop's edges or the whole face. Its sign does not fix the side, so the bridge reads where the new+ segments landed, and redoes the offset the other way once.+ - **`regionsAtMm`** on `extrude` / `cut`: SOLIDWORKS' Selected Contours, done as its own example does it+ (`EnableContourSelection`, then `SelectByID2 "SKETCHREGION"` at mark 4).+ - **Tool Block Step 4 runs, two ways.** `cswa-08` uses Offset Entities, regions and two+ `offsetFromSurface` cuts; it runs live only. `cswa-08b` draws the same pocket from the explicit inset+ profile, using only ops already measured. Both predict 434.72 g, +0.49 % of the key.+ - **Community specs `cswa-09` to `cswa-12`** build every op no spec built:+ - revolve and revolve-cut (360°, and 180° mid-plane);+ - mirror (features, bodies, an offset plane);+ - slots, a hexagon, and counterbored and countersunk holes;+ - `upToNext`, `upToSurface` and `offsetFromSurface`;+ - draft on a boss and on a cut.++ Each key is derived analytically. Each spec's `derivation` re-derives its key in Python+ (`tools/cswa-check.py --derivations`), and the spec holds SOLIDWORKS to 0.1 %.+ - **The first canary caught two bugs, which is what it is for.** 0.11.4-rc1 ran all 14 parts live on+ 2026-10-16 (`tools/cswa/reports/cswa-2026-10-16-sw2026-0.11.4-rc1-FAILED.json`): cswa-00 to cswa-10+ passed within 0.1 %, cswa-11 and cswa-12 did not, and the mass and centre of mass they measured+ say exactly why (`docs/LIVE-RESULTS.md`):+ - **The draft flag was inverted.** `FeatureExtrusion3` / `FeatureCut4` take `Ddir1`; the 2024 help+ says true = inward, and SOLIDWORKS 2026 did the opposite: the 45 deg countersink cut widened into the+ outward frustum (804.25 mm3 more than the inward one, to the decimal) and the 5 deg boss widened. The+ bridge now passes true for outward (`modeling::draft_outward_flag`).+ - **"Up to surface" is end condition 4, not 10.** With `swEndCondUpToSelection` 10 and the face at mark+ 1, a boss and a cut both built with an empty direction box and stopped at the next face (3392.9 and+ 1005.3 mm3 short). `swEndCondUpToSurface` 4, the id the macro recorder writes, is what the bridge+ sends now; `offsetFromSurface` 5 with the same selection had gone to the face.+ - Every extrude and cut now reads back what SOLIDWORKS stored (`readBack`: the end condition, depth and+ draft side from `IExtrudeFeatureData2`), so a request the feature did not honour shows in the reply.+ - **0.11.4-rc2 then passed 14 of 14** on 2026-10-20 (`tools/cswa/reports/cswa-2026-10-20-sw2026-0.11.4.json`),+ and those are the bytes this release ships.+ - The ten variants the passing parts exercised are measured (`LIVE_2026_10_16_RC1`: revolve and+ revolve-cut, mirror about planes, construction geometry, Offset Entities, sketch regions, the offset+ cut); the five the failing parts exercised stay unmeasured and say CAUGHT until 0.11.4-rc2 passes.+ - A `derivedAppend` may no longer shadow a name its base derives. In the simulator, Step 4's `tpx`+ had redrawn Step 1's R5 fillet.+ - The simulator offsets a plain block's face. It models the regions of profiles that nest or stand+ apart, and refuses crossing ones, saying so.+ - 2007 Q1, 2007 Q6 and Planchard 3-3 are one-line placeholders (URL and key) in `tools/cswa/README.md`.++ 703 tests, 0 failures; 44 of 44 mutants killed (26 on the ops and the gate, 18 on the canary flow).++- v0.11.3: **a quick restart is not ready; a reply is not an effect.** Two live findings. The good one: the HideFileExt fix is PROVEN on Drew's laptop with extensions
SKILL.md+4−1@@ -138,7 +138,10 @@ BEFORE you do it: −normal. A worked LEGO brick in 4 features is in `examples/lego-2x4.json`. 0.11.0 adds exam-grade ops — lines, arcs, polylines, slots, polygons, sketch fillets/chamfers, revolve, mirror, hole, up-to end conditions, draft, a- density — NOT YET MEASURED LIVE (`proven.live:false`); read+ density; 0.11.4 adds `offsetEntities` (a face's outline offset into the+ sketch) and `regionsAtMm` (extrude or cut only some regions). Lines, arcs,+ the plain hole and the density were measured live on 2026; the rest is+ NOT YET MEASURED (`proven.live:false`). Read `references/modelling-and-export.md` before using them, and check the result with `swx_mass_properties`. `swx_selftest {"level":"cswa"}` runs the CSWA exam parts against their published answers.
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "solidworks", "displayName": "SOLIDWORKS",- "version": "0.11.3",+ "version": "0.11.4", "description": "Bridge for SOLIDWORKS desktop CAD — create and open documents, a modeling DSL, file management (find/open/save/export/Pack and Go), custom properties, BOM generation, design analysis (mass properties, bodies, parameters, interference, rebuild health) and background window/dialog etiquette, over the SOLIDWORKS COM API. Single native binary: no interpreter, no PowerShell, ~10ms cold start.", "author": "Adom Inc.", "license": "MIT",
docs/COMPATIBILITY.md+39−10@@ -114,7 +114,9 @@ available in SOLIDWORKS 2021. | `IModelView::DisplayMode` | 2004 SP1, Revision Number 12.1 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodelview~displaymode.html) | | `ISldWorks::DocumentVisible` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~documentvisible.html) | | `IInterferenceDetectionMgr::Done` | 2007 FCS, Revision Number 15.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iinterferencedetectionmgr~done.html) |+| `IModelDoc2::EditDelete` | 2001Plus FCS, Revision Number 10.0; the offset segments on the wrong side, deleted (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~editdelete.html) | | `IModelDoc2::EditRebuild3` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~editrebuild3.html) |+| `ISelectionMgr::EnableContourSelection` | 2003 FCS, Revision Number 11.0; on for a sketch-region pick, put back as it was (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iselectionmgr~enablecontourselection.html) | | `IEquationMgr::Equation` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iequationmgr~equation.html) | | `ICurve::Evaluate2` | 2007 SP5, Revision Number 15.5 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.icurve~evaluate2.html) | | `ISurface::EvaluateAtPoint` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isurface~evaluateatpoint.html) |@@ -149,6 +151,9 @@ available in SOLIDWORKS 2021. | `IPackAndGo::GetDocumentSaveToNames` | 2011 FCS, Revision Number 19.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ipackandgo~getdocumentsavetonames.html) | | `ISldWorks::GetDocumentTemplate` | 2001Plus SP4, Revision Number 10.4 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~getdocumenttemplate.html) | | `IFace2::GetEdges` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iface2~getedges.html) |+| `ILoop2::GetEdges` | 2001Plus FCS, Revision Number 10.0; the outer loop's edges, for Offset Entities (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iloop2~getedges.html) |+| `ISketchArc::GetEndPoint2` | 2000 FCS, Revision Number 8.0; an offset segment's end, for the side check (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketcharc~getendpoint2.html) |+| `ISketchLine::GetEndPoint2` | 2000 FCS, Revision Number 8.0; as above | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketchline~getendpoint2.html) | | `IModelDoc2::GetEquationMgr` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~getequationmgr.html) | | `IFeature::GetErrorCode` | 2001Plus FCS, Revision Number 10 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeature~geterrorcode.html) | | `ISldWorks::GetExecutablePath` | 2003 SP3, Revision Number 11.3 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~getexecutablepath.html) |@@ -159,6 +164,7 @@ available in SOLIDWORKS 2021. | `ISldWorks::GetImportFileData` | 2005 SP3, Revision Number 13.3 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~getimportfiledata.html) | | `IInterferenceDetectionMgr::GetInterferenceCount` | 2007 FCS, Revision Number 15.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iinterferencedetectionmgr~getinterferencecount.html) | | `IInterferenceDetectionMgr::GetInterferences` | 2007 FCS, Revision Number 15.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iinterferencedetectionmgr~getinterferences.html) |+| `IFace2::GetLoops` | 2009 FCS, Revision Number 17.0; the face's loops, for Offset Entities (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iface2~getloops.html) | | `IBody2::GetMassProperties` | 2001Plus FCS Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ibody2~getmassproperties.html) | | `IPartDoc::GetMaterialPropertyName2` | 2005 FCS, Revision Number 13.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ipartdoc~getmaterialpropertyname2.html) | | `ISldWorks::GetMathUtility` | 2001 FCS, Revision Number 9.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~getmathutility.html) |@@ -170,12 +176,15 @@ available in SOLIDWORKS 2021. | `ISldWorks::GetOpenDocumentByName` | 2000 FCS, Revision Number 8.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~getopendocumentbyname.html) | | `IModelDocExtension::GetPackAndGo` | 2011 FCS, Revision Number 19.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldocextension~getpackandgo.html) | | `IPartDoc::GetPartBox` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ipartdoc~getpartbox.html) |-| `IModelDoc2::GetPathName` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~getpathname.html) | | `IComponent2::GetPathName` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.icomponent2~getpathname.html) |+| `IModelDoc2::GetPathName` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~getpathname.html) | | `ISldWorks::GetProcessID` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~getprocessid.html) | | `IModelDoc2::GetSaveFlag` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~getsaveflag.html) | | `ISelectionMgr::GetSelectedObject6` | 2006 FCS, Revision Number 14 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iselectionmgr~getselectedobject6.html) | | `ISelectionMgr::GetSelectedObjectCount2` | 2006 FCS, Revision Number 14.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iselectionmgr~getselectedobjectcount2.html) |+| `ISketch::GetSketchSegments` | SOLIDWORKS 99, datecode 1999207; what Offset Entities added to the sketch (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketch~getsketchsegments.html) |+| `ISketchArc::GetStartPoint2` | 2000 FCS, Revision Number 8.0; as GetEndPoint2 | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketcharc~getstartpoint2.html) |+| `ISketchLine::GetStartPoint2` | 2000 FCS, Revision Number 8.0; as GetEndPoint2 | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketchline~getstartpoint2.html) | | `IComponent2::GetSuppression` | 2001Plus FCS, Revision Number 10.0 | yes | obsolete → IComponent2::GetSuppression2 | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.icomponent2~getsuppression.html) | | `IFace2::GetSurface` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iface2~getsurface.html) | | `IModelDoc2::GetTitle` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~gettitle.html) |@@ -197,18 +206,19 @@ available in SOLIDWORKS 2021. | `IFeatureManager::InsertMirrorFeature` | — (obsolete; used only when swFeatureScope_e cannot be read from the interop) | yes | obsolete → InsertMirrorFeature2 | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeaturemanager~insertmirrorfeature.html) | | `IFeatureManager::InsertMirrorFeature2` | 2008 FCS, Revision Number 16.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeaturemanager~insertmirrorfeature2.html) | | `IFeatureManager::InsertRefPlane` | 2010 FCS, Revision Number 18.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeaturemanager~insertrefplane.html) |-| `ISketchManager::InsertSketch` | 2007 FCS, Revision Number 15.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketchmanager~insertsketch.html) | | `IModelDoc2::InsertSketch` | — (no Availability line: an original-API member) | yes | obsolete → ISketchManager::InsertSketch | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~insertsketch.html) |+| `ISketchManager::InsertSketch` | 2007 FCS, Revision Number 15.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketchmanager~insertsketch.html) | | `IAssemblyDoc::InterferenceDetectionManager` | 2007 FCS, Revision Number 15 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iassemblydoc~interferencedetectionmanager.html) |+| `ILoop2::IsOuter` | 2001Plus FCS, Revision Number 10.0; which loop is the outer one (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iloop2~isouter.html) | | `ISldWorks::LoadFile2` | — (no Availability line: an original-API member) | yes | obsolete → ISldWorks::LoadFile4 | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~loadfile2.html) | | `ISldWorks::LoadFile4` | 2006 SP1, Revision Number 14.1 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~loadfile4.html) | | `IInterferenceDetectionMgr::MakeInterferingPartsTransparent` | 2007 FCS, Revision Number 15.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iinterferencedetectionmgr~makeinterferingpartstransparent.html) | | `ISelectData::Mark` | 2004 FCS, Revision Number 12 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iselectdata~mark.html) | | `IMassProperty::Mass` | 2003 SP2, Revision Number 11.2 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imassproperty~mass.html) | | `IModelDocExtension::MultiSelect2` | 2012 SP04, Revision Number 20.4 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldocextension~multiselect2.html) |-| `IFeature::Name` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeature~name.html) | | `IBody2::Name` | 2005 FCS, Revision Number 13 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ibody2~name.html) | | `IConfiguration::Name` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iconfiguration~name.html) |+| `IFeature::Name` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeature~name.html) | | `IComponent2::Name2` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.icomponent2~name2.html) | | `IModelDocExtension::NeedsRebuild2` | 2012 FCS, Revision Number 20.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldocextension~needsrebuild2.html) | | `ISldWorks::NewDocument` | 2000 FCS, Revision Number 8.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~newdocument.html) |@@ -225,8 +235,8 @@ available in SOLIDWORKS 2021. | `IModelDoc2::SaveBMP` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~savebmp.html) | | `IModelDocExtension::SavePackAndGo` | 2011 FCS, Revision Number 19.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldocextension~savepackandgo.html) | | `IModelView::Scale2` | 99, datecode 1999207 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodelview~scale2.html) |-| `IFeature::Select2` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeature~select2.html) | | `IBody2::Select2` | not verified (0.11.0): a body selected for a mirror (mark 256) | not verified | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ibody2~select2.html) |+| `IFeature::Select2` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ifeature~select2.html) | | `IEntity::Select4` | 2004 FCS, Revision Number 12.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ientity~select4.html) | | `ISketchSegment::Select4` | not verified (0.11.0): the revolve axis's fallback selection | not verified | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketchsegment~select4.html) | | `IModelDoc2::SelectByID` | — (no Availability line: an original-API member) | yes | obsolete → IModelDocExtension::SelectByID2 | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~selectbyid.html) |@@ -241,6 +251,7 @@ available in SOLIDWORKS 2021. | `ISldWorks::SetUserPreferenceToggle` | — (no Availability line: an original-API member) | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~setuserpreferencetoggle.html) | | `IModelDoc2::ShowNamedView2` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~shownamedview2.html) | | `IModelDoc2::SketchManager` | 2005 FCS, Revision Number 13.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~sketchmanager.html) |+| `IModelDoc2::SketchOffsetEntities2` | 2001Plus FCS, Revision Number 10.0; Offset Entities of a face or its outer loop (0.11.4); its sign does not decide the side, so the bridge checks it | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~sketchoffsetentities2.html) | | `ISldWorks::StartupProcessCompleted` | 2015 FCS, Revision Number 23.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isldworks~startupprocesscompleted.html) | | `IMassProperty::SurfaceArea` | 2003 SP2, Revision Number 11.2 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imassproperty~surfacearea.html) | | `IDimension::SystemValue` | — (no Availability line: an original-API member) | yes | obsolete → IDimension::GetSystemValue3 | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.idimension~systemvalue.html) |@@ -257,13 +268,16 @@ available in SOLIDWORKS 2021. | `IBody2::Visible` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ibody2~visible.html) | | `IModelDoc2::Visible` | 2001Plus FCS, Revision Number 10.0 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldoc2~visible.html) | | `IMassProperty::Volume` | 2003 SP2, Revision Number 11.2 | yes | | [help](https://help.solidworks.com/2024/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imassproperty~volume.html) |+| `ISketchPoint::X` | SOLIDWORKS 99, datecode 1999207; with Y and Z: a sketch point, in sketch space (0.11.4) | yes | | [help](https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.isketchpoint~x.html) | Enum values the DSL passes are read from the published swconst pages (cited in `com.rs`): -- `swEndConditions_e`: Blind 0, ThroughAll 1, OffsetFromSurface 5, MidPlane 6, ThroughAllBoth 9, UpToSelection 10, UpToNext 11 (0.11.0; UpToSurface 4 is the obsolete id that UpToSelection replaces — the face goes at mark 1). Revolves use Blind 0 and MidPlane 6 as Dir1Type.+- `swEndConditions_e`: Blind 0, ThroughAll 1, UpToSurface 4, OffsetFromSurface 5, MidPlane 6, ThroughAllBoth 9, UpToNext 11 (0.11.4; measured 2026-10-16: the help's UpToSelection 10 with the face at mark 1 built with an EMPTY direction box and stopped at the next face on 2026, for a boss and for a cut; 4, the id the macro recorder writes, is what the bridge sends). `Ddir1` TRUE drafts OUTWARD on 2026 (the help says inward); the bridge passes `outward` as is. - `ISketchManager::CreateArc` Direction: +1 counter-clockwise, −1 clockwise (a `short`). - `InsertMirrorFeature2` marks: features 1, plane or planar face 2, bodies 256. `FeatureRevolve2` marks: sketch 0, axis 4 (the bridge tries 16 when 4 builds nothing).+- A sketch REGION (0.11.4) is selected the way SOLIDWORKS' own "Enable Contour Selection Example" does it: `ISelectionMgr::EnableContourSelection = true`, then `SelectByID2(<sketch name>, "SKETCHREGION", x, y, z, Append true, MARK 4, null, 0)` at a model point inside the region, then the feature, then contour selection put back.+- `IModelDoc2::SketchOffsetEntities2(Offset metres, BothDirections, Chain)` (0.11.4) takes "an edge, loop, face, external sketch curve, external sketch contour, set of edges, or set of external sketch curves"; its sign does not fix the side (a forum report: −0.01 landed inside on one face, outside on another), so the bridge reads where the new segments landed and redoes it with the other sign once. - `swFeatureScope_e` and `swUserPreferenceDoubleValue_e.swMaterialPropertyDensity` are NOT on the help pages with numbers: they are read from the installed `SolidWorks.Interop.swconst.dll` by reflection, never guessed. - `swRefPlaneReferenceConstraints_e`: Distance 8, OptionFlip 256. - `swFeatureFilletOptions_e`: Propagate 1, UniformRadius 2.@@ -347,12 +361,27 @@ schema and rules are in [`tools/cswa/README.md`](../tools/cswa/README.md). `"N of M CSWA parts within tolerance"`. On a release we have not run, this is the most direct evidence that a modelled part weighs what SOLIDWORKS says it should. - `tools/cswa-check.py` from a dev container writes `cswa-report.json`.-- `tools/release.sh --require-live <report.json>` refuses to publish without a report from THIS- version that passed every part and is newer than the last code commit.+- `tools/release.sh --require-live <report.json> --publish` refuses to publish without a report from+ THIS version that passed every part and is newer than the last code commit; since 0.11.4 a bare+ `--publish` is refused too (only `--docs-only`, for a release that changes no code, skips the gate).+- **The live run tests the very bytes that ship (the canary).** `tools/release.sh --canary` publishes+ the build as the release candidate `<version>-rc<N>`, with `manifests/canary.json` naming it. Only+ the test machine installs it, by hand: `bridge_install {manifestUrl: .../manifests/canary.json}`.+ `cswa-check` records the installed exe's sha256 (read back through ab's `read_file`), and+ `--require-live` publishes that zip unchanged, only when the report ran its exe.+ The canary never pins the machine. ab resolves a bridge's update URL from the bridge's own+ `bridge.json` `updateManifestUrl` first, before the URL it was installed from+ (`adom-bridge help bridge_check_updates`). Every zip declares the MAIN manifest there, and the+ canary file does too. Since the release has the canary's version, the machine runs the published+ bytes as they are; the next release reaches it like any other. -The 0.11.0 ops the specs use (lines and arcs, revolve, mirror, hole, the up-to end conditions,-draft, a density) are NOT YET MEASURED on any release: every step that uses them reports-`proven.live:false` until a live run passes.+The first live run (2026-10-15, bridge 0.11.2, SOLIDWORKS 2026: 8 of 8 within 0.0015 % of their keys)+measured the lines and arcs of a contour, the face-offset plane, the plain hole and the density+(docs/LIVE-RESULTS.md). Still NOT MEASURED on any release, each step using them reporting+`proven.live:false`: revolve and revolve-cut, mirror, the counterbored and countersunk hole, the+up-to end conditions, draft, construction geometry, and 0.11.4's Offset Entities and sketch regions.+The community specs `cswa-09` to `cswa-12` and the Step 4 pair `cswa-08` / `cswa-08b` build every one+of them, so the next live run measures them. ## What is still unmeasured on 2021
docs/LIVE-RESULTS.md+125−2@@ -22,6 +22,49 @@ Built in 4 features, measured live: | 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`](../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@@ -170,10 +213,90 @@ and projects the origin onto the face, so their circles were moved to sketch `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 **2021** (and any version other than 2026): supported by the API audit in `docs/COMPATIBILITY.md`, not yet run. `swx_selftest {"level":"write"}` on that install answers it.+- 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 or +Z.+- 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`).
install.shpackage.json+1−1@@ -1,6 +1,6 @@ { "slug": "solidworks-bridge",- "version": "0.11.3",+ "version": "0.11.4", "type": "app", "description": "Skills for your container so your AI knows how to drive the SOLIDWORKS bridge (swx_* verbs). The bridge runtime itself is the release zip — a single native swx-bridge.exe; Adom Bridge loads that.", "tags": [
references/modelling-and-export.md+22−2@@ -157,10 +157,30 @@ adom-bridge --ai-thread "<thread>" swx_save_as '{"outputPath":"C:\\parts\\bracke a library material is applied). The step reports the density READ BACK. - `swx_mass_properties` now also reports `massG`, `volumeMm3`, `surfaceAreaMm2`, `centerOfMassMm` (the document's frame), `densityKgM3` and `materialName`.+- **Offset Entities and sketch regions (0.11.4, NOT YET MEASURED LIVE):**+ - **`offsetEntities`** is a sketch entity:+ `{offsetEntities: {fromFace: {atPointMm: [x,y,z]}, offsetMm: -1, loops: "outer"|"all", chain: true}}`.+ SOLIDWORKS offsets a model face's outline into the sketch+ (`IModelDoc2::SketchOffsetEntities2`). That is the outline you could not draw,+ because it is the model's own.+ - A NEGATIVE `offsetMm` goes INTO the face. `loops:"outer"` (the default) takes+ the outer loop's edges; `"all"` selects the face, holes included.+ - SOLIDWORKS' sign does not decide the side, so the bridge reads where the new+ segments landed. It redoes the offset the other way once, and reports+ `side` / `sideVerified`.+ - A sketch with an offset cannot be revolved.+ - **`regionsAtMm: [[u, v], ...]`** on `extrude` / `cut` (`regionAtMm` for one)+ extrudes only the sketch regions holding those points, in the sketch's own+ coordinates. This is SOLIDWORKS' Selected Contours, for contours that CROSS+ (an offset outline and a circle).+ - The simulator offsets only a plain block's face. It models regions only of+ profiles that nest or stand apart, and refuses the rest, saying so.+ - The CSWA Tool Block Step 4 (`cswa-08`) uses both. - **The CSWA benchmark:** `swx_selftest {"level":"cswa"}` builds the exam parts shipped in `resources/cswa/` (the official sample exam's Tool Block, the 3dengr- practice set, the LEGO brick), weighs each, and compares it with the PUBLISHED key- within the exam's 1 %: `"N of M CSWA parts within tolerance"`. Call it with+ practice set, the LEGO brick, and community parts with keys derived+ analytically), weighs each, and compares it with its key within the spec's+ tolerance: `"N of M CSWA parts within tolerance"`. Call it with `responseMode:"stream"` or `"job"`. - **Verify with `swx_inspect_bodies`, not with the step list.** It reports each solid's bounding box, size, volume, area and mass in millimetres — that is
resources/cswa/cswa-08-tool-block-step4.json+124−6@@ -1,14 +1,132 @@ { "id": "cswa-08-tool-block-step4", "extends": "cswa-07-tool-block-step3",- "title": "Official Tool Block, Step 4 (Q6): a pocket 1 mm inside the front face's outline",+ "title": "Official Tool Block, Step 4 (Q6): a pocket 1 mm inside the front face's outline (Offset Entities, sketch regions)", "expected": { "massG": 432.58, "tolerancePct": 1.0 },- "keyBasis": "the official key (432.58 g); every plausible reading of the drawing lands within \u00b11 % (SOURCES.md, Part 4)",- "needsOps": [- "offsetEntities"+ "keyBasis": "the official key (432.58 g). tools/cswa/SOURCES.md Part 4 read literally: the front face's OUTER loop offset 1 mm in; a 1-mm wall left outside the slot's R41 silhouette (R42); the pocket outside it cut to 12 from the back face (depth 32); the ear inside R41 recessed to 1 mm short of the slot's front wall (depth 7, a 1-mm skin), the \u00d811 left as it is. Predicted 434.72 g, +0.49 % (tools/cswa/tb4c.py's row wall 1 / R41 / no ring / skin 1: areas 581.28 and 936.27 mm\u00b2). tb4c's best case, 432.86 g, cuts the ear through to the slot with a 1-mm ring kept round the \u00d811 instead: the drawing cannot tell the two apart (SOURCES.md ambiguity 4) and both are within the exam's 1 %",+ "prediction": {+ "massG": 434.715,+ "how": "tools/cswa/tb4c.py (wall_out 1, wall_in 0, ring False, skin 1); the regions' areas 581.282 (outside R42) and 936.267 (inside R41) mm\u00b2, the \u00d811 excluded (95.033 mm\u00b2)"+ },+ "exercises": [+ "sketch.offsetEntities.outer",+ "cut.regions",+ "cut.offsetFromSurface",+ "sketch.multiProfile" ],- "plan": "sketch on the front face of the right section: the face's outer loop offset 1 mm inward (Offset Entities) with the R41 silhouette offset 1 mm; cut to offsetFromSurface 12 from the back face; a second cut over the ear inside R41 to offsetFromSurface 1 mm from the slot's front wall"-}+ "simulatorSkips": "Offset Entities of the Tool Block's front face needs SOLIDWORKS' own outline of that face (the simulator knows a face's outline only on a plain block); cswa-08b cuts the same pocket from the explicit inset profile",+ "needsOps": [],+ "scriptAppend": [+ {+ "op": "sketch",+ "face": {+ "atPointMm": [+ 70,+ 10,+ "=C"+ ]+ },+ "entities": [+ {+ "offsetEntities": {+ "fromFace": {+ "atPointMm": [+ 70,+ 10,+ "=C"+ ]+ },+ "offsetMm": -1,+ "loops": "outer",+ "chain": true+ }+ },+ {+ "circle": {+ "centerMm": [+ "=xR",+ "=scy"+ ],+ "radiusMm": 42+ }+ }+ ]+ },+ {+ "op": "cut",+ "regionsAtMm": [+ [+ 25,+ 0+ ]+ ],+ "offsetFromSurface": {+ "face": {+ "atPointMm": [+ 30,+ 0,+ 0+ ]+ },+ "distanceMm": 12+ }+ },+ {+ "op": "sketch",+ "face": {+ "atPointMm": [+ 70,+ 10,+ "=C"+ ]+ },+ "entities": [+ {+ "offsetEntities": {+ "fromFace": {+ "atPointMm": [+ 70,+ 10,+ "=C"+ ]+ },+ "offsetMm": -1,+ "loops": "outer",+ "chain": true+ }+ },+ {+ "circle": {+ "centerMm": [+ "=xR",+ "=scy"+ ],+ "radiusMm": 41+ }+ }+ ]+ },+ {+ "op": "cut",+ "regionsAtMm": [+ [+ 65,+ 15+ ]+ ],+ "offsetFromSurface": {+ "face": {+ "atPointMm": [+ 65,+ 15,+ 36+ ]+ },+ "distanceMm": 1+ }+ }+ ]+}
resources/cswa/cswa-08b-tool-block-step4-explicit.jsonadded+419@@ -0,0 +1,419 @@+{+ "id": "cswa-08b-tool-block-step4-explicit",+ "extends": "cswa-07-tool-block-step3",+ "title": "Official Tool Block, Step 4 (Q6), the explicit inset profile: the same pocket drawn line by line (the Offset Entities fallback)",+ "expected": {+ "massG": 432.58,+ "tolerancePct": 1.0+ },+ "keyBasis": "the official key (432.58 g). tools/cswa/SOURCES.md Part 4 read literally: the front face's OUTER loop offset 1 mm in; a 1-mm wall left outside the slot's R41 silhouette (R42); the pocket outside it cut to 12 from the back face (depth 32); the ear inside R41 recessed to 1 mm short of the slot's front wall (depth 7, a 1-mm skin), the \u00d811 left as it is. Predicted 434.72 g, +0.49 % (tools/cswa/tb4c.py's row wall 1 / R41 / no ring / skin 1: areas 581.28 and 936.27 mm\u00b2). tb4c's best case, 432.86 g, cuts the ear through to the slot with a 1-mm ring kept round the \u00d811 instead: the drawing cannot tell the two apart (SOURCES.md ambiguity 4) and both are within the exam's 1 %. This variant DRAWS the two regions (the inset outline's lines, its R20 arc, and the R42 / R41 arcs, every intersection derived below) and cuts them blind (32 and 7), so it needs no op beyond the ones measured live on 2026-10-15",+ "prediction": {+ "massG": 434.715,+ "how": "tools/cswa/tb4c.py (wall_out 1, wall_in 0, ring False, skin 1); the regions' areas 581.282 (outside R42) and 936.267 (inside R41) mm\u00b2, the \u00d811 excluded (95.033 mm\u00b2)"+ },+ "exercises": [+ "sketch.line",+ "sketch.arc",+ "cut.one",+ "sketch.face.front.positive"+ ],+ "needsOps": [],+ "derivedAppend": [+ [+ "s4c19x",+ "Tx + 19*nx"+ ],+ [+ "s4c19y",+ "Ty + 19*ny"+ ],+ [+ "s4fL",+ "sqrt((xR - xRL)^2 + (yRE + 33)^2)"+ ],+ [+ "s4fnx",+ "-(yRE + 33)/s4fL"+ ],+ [+ "s4fny",+ "(xR - xRL)/s4fL"+ ],+ [+ "s4fc",+ "s4fnx*xRL - 33*s4fny + 1"+ ],+ [+ "s4ccs",+ "xR - 5 + yRT - sqrt(2)"+ ],+ [+ "s4qblx",+ "xstep + 1"+ ],+ [+ "s4qbfx",+ "(s4fc + 13*s4fny)/s4fnx"+ ],+ [+ "s4qfry",+ "(s4fc - s4fnx*(xR - 1))/s4fny"+ ],+ [+ "s4qrcy",+ "s4ccs - (xR - 1)"+ ],+ [+ "s4qctx",+ "s4ccs - (yRT - 1)"+ ],+ [+ "s4qtax",+ "s4c19x + sqrt(400 - (yRT - 1 - s4c19y)^2)"+ ],+ [+ "s4tpx",+ "Tx - nx"+ ],+ [+ "s4tpy",+ "Ty - ny"+ ],+ [+ "s4qlly",+ "(ny*18 - 1 - nx*(xstep + 1))/ny"+ ],+ [+ "s4fdx",+ "s4fny"+ ],+ [+ "s4fdy",+ "-s4fnx"+ ],+ [+ "s4wx",+ "s4qbfx - xR"+ ],+ [+ "s4wy",+ "-13 - scy"+ ],+ [+ "s4fb",+ "s4wx*s4fdx + s4wy*s4fdy"+ ],+ [+ "s4fq",+ "s4wx^2 + s4wy^2"+ ],+ [+ "s4s42",+ "-s4fb - sqrt(s4fb^2 - s4fq + 42^2)"+ ],+ [+ "s4x1x",+ "s4qbfx + s4s42*s4fdx"+ ],+ [+ "s4x1y",+ "-13 + s4s42*s4fdy"+ ],+ [+ "s4s41",+ "-s4fb - sqrt(s4fb^2 - s4fq + 41^2)"+ ],+ [+ "s4x3x",+ "s4qbfx + s4s41*s4fdx"+ ],+ [+ "s4x3y",+ "-13 + s4s41*s4fdy"+ ],+ [+ "s4ex",+ "s4c19x - xR"+ ],+ [+ "s4ey",+ "s4c19y - scy"+ ],+ [+ "s4ed",+ "sqrt(s4ex^2 + s4ey^2)"+ ],+ [+ "s4a42",+ "(42^2 - 400 + s4ed^2)/(2*s4ed)"+ ],+ [+ "s4h42",+ "sqrt(42^2 - s4a42^2)"+ ],+ [+ "s4x2x",+ "xR + s4a42*s4ex/s4ed - s4h42*s4ey/s4ed"+ ],+ [+ "s4x2y",+ "scy + s4a42*s4ey/s4ed + s4h42*s4ex/s4ed"+ ],+ [+ "s4a41",+ "(41^2 - 400 + s4ed^2)/(2*s4ed)"+ ],+ [+ "s4h41",+ "sqrt(41^2 - s4a41^2)"+ ],+ [+ "s4x4x",+ "xR + s4a41*s4ex/s4ed - s4h41*s4ey/s4ed"+ ],+ [+ "s4x4y",+ "scy + s4a41*s4ey/s4ed + s4h41*s4ex/s4ed"+ ],+ [+ "s4m1ux",+ "(s4x1x - xR)/42 + (s4x2x - xR)/42"+ ],+ [+ "s4m1uy",+ "(s4x1y - scy)/42 + (s4x2y - scy)/42"+ ],+ [+ "s4m1n",+ "sqrt(s4m1ux^2 + s4m1uy^2)"+ ],+ [+ "s4m1x",+ "xR + 42*s4m1ux/s4m1n"+ ],+ [+ "s4m1y",+ "scy + 42*s4m1uy/s4m1n"+ ],+ [+ "s4m2ux",+ "(s4x2x - s4c19x)/20 + (s4tpx - s4c19x)/20"+ ],+ [+ "s4m2uy",+ "(s4x2y - s4c19y)/20 + (s4tpy - s4c19y)/20"+ ],+ [+ "s4m2n",+ "sqrt(s4m2ux^2 + s4m2uy^2)"+ ],+ [+ "s4m2x",+ "s4c19x + 20*s4m2ux/s4m2n"+ ],+ [+ "s4m2y",+ "s4c19y + 20*s4m2uy/s4m2n"+ ],+ [+ "s4m3ux",+ "(s4qtax - s4c19x)/20 + (s4x4x - s4c19x)/20"+ ],+ [+ "s4m3uy",+ "(yRT - 1 - s4c19y)/20 + (s4x4y - s4c19y)/20"+ ],+ [+ "s4m3n",+ "sqrt(s4m3ux^2 + s4m3uy^2)"+ ],+ [+ "s4m3x",+ "s4c19x + 20*s4m3ux/s4m3n"+ ],+ [+ "s4m3y",+ "s4c19y + 20*s4m3uy/s4m3n"+ ],+ [+ "s4m4ux",+ "(s4x4x - xR)/41 + (s4x3x - xR)/41"+ ],+ [+ "s4m4uy",+ "(s4x4y - scy)/41 + (s4x3y - scy)/41"+ ],+ [+ "s4m4n",+ "sqrt(s4m4ux^2 + s4m4uy^2)"+ ],+ [+ "s4m4x",+ "xR + 41*s4m4ux/s4m4n"+ ],+ [+ "s4m4y",+ "scy + 41*s4m4uy/s4m4n"+ ]+ ],+ "scriptAppend": [+ {+ "op": "sketch",+ "face": {+ "atPointMm": [+ 70,+ 10,+ "=C"+ ]+ },+ "entities": [+ {+ "polyline": {+ "points": [+ [+ "=s4qblx",+ -13+ ],+ [+ "=s4qbfx",+ -13+ ],+ [+ "=s4x1x",+ "=s4x1y"+ ]+ ]+ }+ },+ {+ "arc3": {+ "start": [+ "=s4x1x",+ "=s4x1y"+ ],+ "mid": [+ "=s4m1x",+ "=s4m1y"+ ],+ "end": [+ "=s4x2x",+ "=s4x2y"+ ]+ }+ },+ {+ "arc3": {+ "start": [+ "=s4x2x",+ "=s4x2y"+ ],+ "mid": [+ "=s4m2x",+ "=s4m2y"+ ],+ "end": [+ "=s4tpx",+ "=s4tpy"+ ]+ }+ },+ {+ "polyline": {+ "points": [+ [+ "=s4tpx",+ "=s4tpy"+ ],+ [+ "=s4qblx",+ "=s4qlly"+ ],+ [+ "=s4qblx",+ -13+ ]+ ]+ }+ }+ ]+ },+ {+ "op": "cut",+ "depthMm": 32+ },+ {+ "op": "sketch",+ "face": {+ "atPointMm": [+ 70,+ 10,+ "=C"+ ]+ },+ "entities": [+ {+ "polyline": {+ "points": [+ [+ "=s4x3x",+ "=s4x3y"+ ],+ [+ "=xR - 1",+ "=s4qfry"+ ],+ [+ "=xR - 1",+ "=s4qrcy"+ ],+ [+ "=s4qctx",+ "=yRT - 1"+ ],+ [+ "=s4qtax",+ "=yRT - 1"+ ]+ ]+ }+ },+ {+ "arc3": {+ "start": [+ "=s4qtax",+ "=yRT - 1"+ ],+ "mid": [+ "=s4m3x",+ "=s4m3y"+ ],+ "end": [+ "=s4x4x",+ "=s4x4y"+ ]+ }+ },+ {+ "arc3": {+ "start": [+ "=s4x4x",+ "=s4x4y"+ ],+ "mid": [+ "=s4m4x",+ "=s4m4y"+ ],+ "end": [+ "=s4x3x",+ "=s4x3y"+ ]+ }+ }+ ]+ },+ {+ "op": "cut",+ "depthMm": 7+ }+ ]+}
resources/cswa/cswa-09-community-stepped-shaft.jsonadded+163@@ -0,0 +1,163 @@+{+ "id": "cswa-09-community-stepped-shaft",+ "title": "Community: a stepped hollow shaft - revolved, a groove revolve-cut, a half-depth flat revolve-cut mid-plane",+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "official": false,+ "units": "MMGS",+ "origin": "the shaft's axis is model X (the Front Plane sketch's x axis), its left end at x = 0; a \u00d86 bore through",+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "expected": {+ "massG": 103.568885,+ "volumeMm3": 38358.8463,+ "centerOfMassMm": [+ 46.831491,+ -0.114185,+ 0.0+ ],+ "tolerancePct": 0.1+ },+ "keyBasis": "derived analytically (derivation): three coaxial tubes (\u00d820 x 30, \u00d830 x 40, \u00d816 x 25, \u00d86 bore) less a 2-deep x 5-wide groove at x 45..50 and the y > 0 half of a ring r 7..10 over x 0..10 (a 180\u00b0 mid-plane revolve-cut from a profile on +Y sweeps -90\u00b0..+90\u00b0 about +Y); the half ring's centroid is 4(R^3-r^3)/(3\u03c0(R^2-r^2)) off the axis. Exact: held to 0.1 %",+ "exercises": [+ "revolve.360",+ "revolve_cut.360",+ "revolve_cut.midPlane",+ "sketch.construction",+ "sketch.line",+ "sketch.rect"+ ],+ "derivation": [+ [+ "V_body",+ "pi*((10**2 - 3**2)*30 + (15**2 - 3**2)*40 + (8**2 - 3**2)*25)"+ ],+ [+ "Mx_body",+ "pi*((10**2 - 3**2)*30*15 + (15**2 - 3**2)*40*50 + (8**2 - 3**2)*25*82.5)"+ ],+ [+ "V_groove",+ "pi*(15**2 - 13**2)*5"+ ],+ [+ "V_notch",+ "pi*(10**2 - 7**2)*10/2"+ ],+ [+ "yc_notch",+ "4*(10**3 - 7**3)/(3*pi*(10**2 - 7**2))"+ ],+ [+ "volumeMm3",+ "V_body - V_groove - V_notch"+ ],+ [+ "massG",+ "volumeMm3*2.7e-3"+ ],+ [+ "centerOfMassMm",+ "[(Mx_body - V_groove*47.5 - V_notch*5)/volumeMm3, -V_notch*yc_notch/volumeMm3, 0.0]"+ ]+ ],+ "needsOps": [],+ "script": [+ {+ "op": "new_part"+ },+ {+ "op": "sketch",+ "plane": "Front Plane",+ "entities": [+ {+ "polyline": {+ "points": [+ [+ 0,+ 3+ ],+ [+ 0,+ 10+ ],+ [+ 30,+ 10+ ],+ [+ 30,+ 15+ ],+ [+ 70,+ 15+ ],+ [+ 70,+ 8+ ],+ [+ 95,+ 8+ ],+ [+ 95,+ 3+ ]+ ],+ "close": true+ }+ }+ ]+ },+ {+ "op": "revolve",+ "axis": "x"+ },+ {+ "op": "sketch",+ "plane": "Front Plane",+ "entities": [+ {+ "rect": {+ "xMm": 45,+ "yMm": 13,+ "widthMm": 5,+ "heightMm": 2+ }+ }+ ]+ },+ {+ "op": "revolve_cut",+ "axis": "x"+ },+ {+ "op": "sketch",+ "plane": "Front Plane",+ "entities": [+ {+ "rect": {+ "xMm": 0,+ "yMm": 7,+ "widthMm": 10,+ "heightMm": 3+ }+ }+ ]+ },+ {+ "op": "revolve_cut",+ "axis": "x",+ "angleDeg": 180,+ "midPlane": true+ },+ {+ "op": "set_material",+ "name": "6061 Alloy",+ "densityKgM3": 2700+ }+ ]+}
resources/cswa/cswa-10-community-mirrored-block.jsonadded+157@@ -0,0 +1,157 @@+{+ "id": "cswa-10-community-mirrored-block",+ "title": "Community: a stepped block - one quarter, mirrored about Front Plane (features) and Right Plane (bodies); a boss mirrored about an offset plane",+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "official": false,+ "units": "MMGS",+ "origin": "symmetric about Front Plane (z = 0) and Right Plane (x = 0), standing on Top Plane (y = 0)",+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "expected": {+ "massG": 722.912919,+ "volumeMm3": 91507.964474,+ "centerOfMassMm": [+ -0.082395,+ 16.02733,+ 0.0+ ],+ "tolerancePct": 0.1+ },+ "keyBasis": "derived analytically (derivation): four copies of the quarter profile (steps 60 x 10, 40 x 15, 20 x 15; area 1500 mm\u00b2, centroid y 15.5) 15 deep, and two \u00d88 x 15 bosses on the top face at x = -15 and (mirrored about x = -5) x = +5. Exact: held to 0.1 %",+ "exercises": [+ "mirror.features.plane",+ "mirror.bodies.plane",+ "mirror.features.offset",+ "sketch.line",+ "sketch.face.top.positive"+ ],+ "derivation": [+ [+ "A_q",+ "60*10 + 40*15 + 20*15"+ ],+ [+ "Ybar_q",+ "(60*10*5 + 40*15*17.5 + 20*15*32.5)/A_q"+ ],+ [+ "V_block",+ "4*A_q*15"+ ],+ [+ "V_boss",+ "pi*4**2*15"+ ],+ [+ "volumeMm3",+ "V_block + 2*V_boss"+ ],+ [+ "massG",+ "volumeMm3*7.9e-3"+ ],+ [+ "centerOfMassMm",+ "[V_boss*(-15 + 5)/volumeMm3, (V_block*Ybar_q + 2*V_boss*(40 + 15/2))/volumeMm3, 0.0]"+ ]+ ],+ "needsOps": [],+ "script": [+ {+ "op": "new_part"+ },+ {+ "op": "sketch",+ "plane": "Front Plane",+ "entities": [+ {+ "polyline": {+ "points": [+ [+ 0,+ 0+ ],+ [+ 60,+ 0+ ],+ [+ 60,+ 10+ ],+ [+ 40,+ 10+ ],+ [+ 40,+ 25+ ],+ [+ 20,+ 25+ ],+ [+ 20,+ 40+ ],+ [+ 0,+ 40+ ]+ ],+ "close": true+ }+ }+ ]+ },+ {+ "op": "extrude",+ "depthMm": 15+ },+ {+ "op": "mirror",+ "features": "last",+ "plane": "Front Plane"+ },+ {+ "op": "mirror",+ "features": "all",+ "plane": "Right Plane"+ },+ {+ "op": "sketch_circle",+ "face": {+ "atPointMm": [+ 0,+ 40,+ 0+ ]+ },+ "centerMm": [+ -15,+ 0+ ],+ "radiusMm": 4+ },+ {+ "op": "extrude",+ "depthMm": 15+ },+ {+ "op": "mirror",+ "features": "last",+ "plane": {+ "offsetFrom": "Right Plane",+ "offsetMm": -5+ }+ },+ {+ "op": "set_material",+ "name": "AISI 1020",+ "densityKgM3": 7900+ }+ ]+}
resources/cswa/cswa-11-community-slotted-plate.jsonadded+214@@ -0,0 +1,214 @@+{+ "id": "cswa-11-community-slotted-plate",+ "title": "Community: a plate with two straight slots, a hexagon pocket, a counterbored and a countersunk hole",+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "official": false,+ "units": "MMGS",+ "origin": "the plate centred on the origin on Top Plane, 120 (X) x 80 (Z) x 12 (Y, up)",+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "expected": {+ "massG": 276.35927,+ "volumeMm3": 102355.285153,+ "centerOfMassMm": [+ 1.375325,+ 5.907388,+ 0.035809+ ],+ "tolerancePct": 0.1+ },+ "keyBasis": "derived analytically (derivation): the plate less two 30 c-c x 10 slots through (centred x -30, z \u00b120), a hexagon pocket (circumradius 12, area 3\u221a3/2\u00b712\u00b2, 5 deep, at x 25), a \u00d88 hole through with a \u00d814 x 4 counterbore at (45, z -25) and a \u00d88 hole through with a \u00d816 x 90\u00b0 countersink (a 4-deep cone frustum, centroid h(R\u00b2+2Rr+3r\u00b2)/(4(R\u00b2+Rr+r\u00b2)) below the top) at (45, z +25). Exact: held to 0.1 %",+ "exercises": [+ "sketch.line",+ "sketch.arc",+ "cut.one.throughAll",+ "cut.one",+ "hole.counterbore",+ "hole.countersink",+ "sketch.face.top.positive"+ ],+ "derivation": [+ [+ "V_plate",+ "120*80*12"+ ],+ [+ "A_slot",+ "30*10 + pi*5**2"+ ],+ [+ "A_hex",+ "3*sqrt(3)/2*12**2"+ ],+ [+ "V_cb_big",+ "pi*7**2*4"+ ],+ [+ "V_cb_small",+ "pi*4**2*(12 - 4)"+ ],+ [+ "h_cs",+ "(16 - 8)/2/tan(radians(90)/2)"+ ],+ [+ "V_cs_cone",+ "pi*h_cs/3*(8**2 + 8*4 + 4**2)"+ ],+ [+ "d_cs_cone",+ "h_cs*(8**2 + 2*8*4 + 3*4**2)/(4*(8**2 + 8*4 + 4**2))"+ ],+ [+ "V_cs_small",+ "pi*4**2*(12 - h_cs)"+ ],+ [+ "V_cb",+ "V_cb_big + V_cb_small"+ ],+ [+ "V_cs",+ "V_cs_cone + V_cs_small"+ ],+ [+ "volumeMm3",+ "V_plate - 2*A_slot*12 - A_hex*5 - V_cb - V_cs"+ ],+ [+ "massG",+ "volumeMm3*2.7e-3"+ ],+ [+ "Mx",+ "-2*A_slot*12*(-30) - A_hex*5*25 - (V_cb + V_cs)*45"+ ],+ [+ "My",+ "V_plate*6 - 2*A_slot*12*6 - A_hex*5*(12 - 5/2) - V_cb_big*(12 - 2) - V_cb_small*(12 - 4)/2 - V_cs_cone*(12 - d_cs_cone) - V_cs_small*(12 - h_cs)/2"+ ],+ [+ "Mz",+ "-V_cb*(-25) - V_cs*25"+ ],+ [+ "centerOfMassMm",+ "[Mx/volumeMm3, My/volumeMm3, Mz/volumeMm3]"+ ]+ ],+ "needsOps": [],+ "script": [+ {+ "op": "new_part"+ },+ {+ "op": "sketch_rect",+ "plane": "Top Plane",+ "widthMm": 120,+ "heightMm": 80,+ "anchor": "center"+ },+ {+ "op": "extrude",+ "depthMm": 12+ },+ {+ "op": "sketch",+ "face": {+ "atPointMm": [+ 0,+ 12,+ 0+ ]+ },+ "entities": [+ {+ "slot": {+ "center": [+ -30,+ 20+ ],+ "lengthMm": 30,+ "widthMm": 10+ }+ },+ {+ "slot": {+ "center": [+ -30,+ -20+ ],+ "lengthMm": 30,+ "widthMm": 10+ }+ }+ ]+ },+ {+ "op": "cut",+ "throughAll": true+ },+ {+ "op": "sketch",+ "face": {+ "atPointMm": [+ 0,+ 12,+ 0+ ]+ },+ "entities": [+ {+ "polygon": {+ "center": [+ 25,+ 0+ ],+ "sides": 6,+ "circumradiusMm": 12+ }+ }+ ]+ },+ {+ "op": "cut",+ "depthMm": 5+ },+ {+ "op": "hole",+ "atMm": [+ 45,+ 12,+ -25+ ],+ "diameterMm": 8,+ "throughAll": true,+ "counterbore": {+ "diameterMm": 14,+ "depthMm": 4+ }+ },+ {+ "op": "hole",+ "atMm": [+ 45,+ 12,+ 25+ ],+ "diameterMm": 8,+ "throughAll": true,+ "countersink": {+ "diameterMm": 16,+ "angleDeg": 90+ }+ },+ {+ "op": "set_material",+ "name": "6061 Alloy",+ "densityKgM3": 2700+ }+ ]+}
resources/cswa/cswa-12-community-up-to-plates.jsonadded+305@@ -0,0 +1,305 @@+{+ "id": "cswa-12-community-up-to-plates",+ "title": "Community: three plates joined by pillars ending up to next, up to a face and 8 short of a face; a drafted boss, a cut up to a face, a drafted pocket",+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "official": false,+ "units": "MMGS",+ "origin": "three 80 x 50 x 10 plates on Front Plane at z 0, 40 and 80 (+Z), corner at the origin",+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "expected": {+ "massG": 369.687533,+ "volumeMm3": 136921.308673,+ "centerOfMassMm": [+ 40.525243,+ 24.723219,+ 45.869733+ ],+ "tolerancePct": 0.1+ },+ "keyBasis": "derived analytically (derivation): three plates; \u00d812 pillars from z = 10 to the NEXT face (z 40), to 8 short of the top plate's back face (z 72, through the middle plate) and UP TO that face (z 80); a \u00d820 boss 12 high drafted 5\u00b0 inward (a frustum); a \u00d88 hole cut from the top face up to the bottom face (10 of each plate); a 20 x 10 pocket 6 deep drafted 10\u00b0 (area (20-2kt)(10-2kt), k = tan 10\u00b0). Every reading is told apart at 0.1 %: up to next instead of up to the face weighs 2.5 % less, the offset beyond the face instead of short of it 0.66 % more, the boss without its draft 0.28 % more (drafted outward 0.58 %), the pocket without its draft 0.13 % less (outward 0.28 %). Exact: held to 0.1 %",+ "exercises": [+ "extrude.upToNext",+ "extrude.offsetFromSurface",+ "extrude.upToSurface",+ "extrude.draft",+ "cut.upToSurface",+ "cut.draft",+ "sketch.offset.front.positive",+ "sketch.face.front.positive",+ "sketch.face.front.negative"+ ],+ "derivation": [+ [+ "V_plate",+ "80*50*10"+ ],+ [+ "a_p",+ "pi*6**2"+ ],+ [+ "V_A",+ "a_p*(40 - 10)"+ ],+ [+ "V_C1",+ "a_p*(40 - 10)"+ ],+ [+ "V_C2",+ "a_p*((80 - 8) - 50)"+ ],+ [+ "V_B1",+ "a_p*(40 - 10)"+ ],+ [+ "V_B2",+ "a_p*(80 - 50)"+ ],+ [+ "k5",+ "tan(radians(5))"+ ],+ [+ "r_top",+ "10 - 12*k5"+ ],+ [+ "V_boss",+ "pi*12/3*(10**2 + 10*r_top + r_top**2)"+ ],+ [+ "z_boss",+ "90 + 12*(10**2 + 2*10*r_top + 3*r_top**2)/(4*(10**2 + 10*r_top + r_top**2))"+ ],+ [+ "V_hole",+ "pi*4**2*10"+ ],+ [+ "k10",+ "tan(radians(10))"+ ],+ [+ "V_pocket",+ "200*6 - 30*k10*6**2 + 4/3*k10**2*6**3"+ ],+ [+ "z_pocket",+ "(200*6**2/2 - 60*k10*6**3/3 + 4*k10**2*6**4/4)/V_pocket"+ ],+ [+ "volumeMm3",+ "3*V_plate + V_A + V_C1 + V_C2 + V_B1 + V_B2 + V_boss - 3*V_hole - V_pocket"+ ],+ [+ "massG",+ "volumeMm3*2.7e-3"+ ],+ [+ "Mx",+ "3*V_plate*40 + V_A*12 + (V_C1 + V_C2)*68 + (V_B1 + V_B2)*40 + V_boss*40 - 3*V_hole*25 - V_pocket*60"+ ],+ [+ "My",+ "3*V_plate*25 + (V_A + V_C1 + V_C2 + V_B1 + V_B2 + V_boss)*25 - 3*V_hole*40 - V_pocket*40"+ ],+ [+ "Mz",+ "V_plate*(5 + 45 + 85) + V_A*25 + V_C1*25 + V_C2*(50 + 72)/2 + V_B1*25 + V_B2*65 + V_boss*z_boss - V_hole*(5 + 45 + 85) - V_pocket*z_pocket"+ ],+ [+ "centerOfMassMm",+ "[Mx/volumeMm3, My/volumeMm3, Mz/volumeMm3]"+ ]+ ],+ "needsOps": [],+ "script": [+ {+ "op": "new_part"+ },+ {+ "op": "sketch_rect",+ "plane": "Front Plane",+ "xMm": 0,+ "yMm": 0,+ "widthMm": 80,+ "heightMm": 50+ },+ {+ "op": "extrude",+ "depthMm": 10+ },+ {+ "op": "sketch_rect",+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 40+ },+ "xMm": 0,+ "yMm": 0,+ "widthMm": 80,+ "heightMm": 50+ },+ {+ "op": "extrude",+ "depthMm": 10+ },+ {+ "op": "sketch_rect",+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 80+ },+ "xMm": 0,+ "yMm": 0,+ "widthMm": 80,+ "heightMm": 50+ },+ {+ "op": "extrude",+ "depthMm": 10+ },+ {+ "op": "sketch_circle",+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10+ },+ "centerMm": [+ 12,+ 25+ ],+ "radiusMm": 6+ },+ {+ "op": "extrude",+ "upToNext": true+ },+ {+ "op": "sketch_circle",+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10+ },+ "centerMm": [+ 68,+ 25+ ],+ "radiusMm": 6+ },+ {+ "op": "extrude",+ "offsetFromSurface": {+ "face": {+ "atPointMm": [+ 68,+ 25,+ 80+ ]+ },+ "distanceMm": 8+ }+ },+ {+ "op": "sketch_circle",+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10+ },+ "centerMm": [+ 40,+ 25+ ],+ "radiusMm": 6+ },+ {+ "op": "extrude",+ "upToSurface": {+ "face": {+ "atPointMm": [+ 40,+ 25,+ 80+ ]+ }+ }+ },+ {+ "op": "sketch_circle",+ "face": {+ "atPointMm": [+ 25,+ 40,+ 90+ ]+ },+ "centerMm": [+ 25,+ 40+ ],+ "radiusMm": 4+ },+ {+ "op": "cut",+ "upToSurface": {+ "face": {+ "atPointMm": [+ 25,+ 40,+ 0+ ]+ }+ }+ },+ {+ "op": "sketch_rect",+ "face": {+ "atPointMm": [+ 60,+ 40,+ 0+ ]+ },+ "xMm": 60,+ "yMm": 40,+ "widthMm": 20,+ "heightMm": 10,+ "anchor": "center"+ },+ {+ "op": "cut",+ "depthMm": 6,+ "draftDeg": 10+ },+ {+ "op": "sketch_circle",+ "face": {+ "atPointMm": [+ 40,+ 25,+ 90+ ]+ },+ "centerMm": [+ 40,+ 25+ ],+ "radiusMm": 10+ },+ {+ "op": "extrude",+ "depthMm": 12,+ "draftDeg": 5+ },+ {+ "op": "set_material",+ "name": "6061 Alloy",+ "densityKgM3": 2700+ }+ ]+}
src/comhost/com.rs+336−14@@ -5679,7 +5679,7 @@ impl ComBackend { "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"})) } - Op::Sketch { plane, entities, .. } => {+ Op::Sketch { plane, entities, offsets, .. } => { let doc = self.resolve(&target)?; self.ensure_active(&doc, st)?; let defaults = self.default_planes(&doc, st)?;@@ -5792,6 +5792,22 @@ impl ComBackend { }, (Some(_), None) => failure = Some("the sketch's model-to-sketch transform could not be read, so the documented axes cannot be honoured — nothing was drawn".into()), }+ // OFFSET ENTITIES (0.11.4) FIRST, into the still-empty sketch: the+ // model's own edges offset by SOLIDWORKS, the side checked — so+ // every segment the sketch holds afterwards is the offset's, and+ // nothing the bridge draws next can be mistaken for it.+ let mut offsets_report: Vec<Value> = Vec::new();+ if failure.is_none() {+ for (k, o) in offsets.iter().enumerate() {+ match self.offset_face(&doc, o, m2s.as_ref()) {+ Ok(r) => offsets_report.push(r),+ Err(e) => {+ failure = Some(format!("offsetEntities {} — {}", k + 1, e.message));+ break;+ }+ }+ }+ } // AddToDB: entities go straight into the sketch, without the // snapping/inference that would merge nearby points of several // profiles (ISketchManager::AddToDB, 2008 FCS). UNMEASURED for@@ -5883,7 +5899,14 @@ impl ComBackend { // #7: an op in between clears the selection). let sketch_name = Self::last_feature_name(&doc); segments.resize(to_draw.len(), None);- st.pending = Some(PendingSketch { name: sketch_name.clone().unwrap_or_default(), normal, reference, segments });+ st.pending = Some(PendingSketch {+ name: sketch_name.clone().unwrap_or_default(),+ normal,+ reference,+ segments,+ mapping,+ sketch_to_model: m2s.as_ref().map(|t| t.inverse()),+ }); let mut out = json!({ "plane": plane.describe(), "sketchedOn": on,@@ -5896,6 +5919,9 @@ impl ComBackend { "transformInverted": transform_inverted, "planeFrames": st.frames_source, });+ if !offsets_report.is_empty() {+ out["offsets"] = json!(offsets_report);+ } crate::script::single_entity_fields(entities, &mut out); Ok(out) }@@ -5930,11 +5956,18 @@ impl ComBackend { let _ = Self::clear_selection(&doc); return Err(HostError::msg(format!("could not re-select the sketch '{}' to {}", pending.name, if cut { "cut" } else { "extrude" }))); }+ // SKETCH REGIONS (0.11.4) — SOLIDWORKS' "Selected Contours", as+ // its own example does it (help: "Enable Contour Selection+ // Example"): ISelectionMgr::EnableContourSelection on, each region+ // by SelectByID2(sketch, "SKETCHREGION", a model point inside it,+ // Append, MARK 4), the feature, contour selection back as it was.+ let (contour_sel, regions_report) = self.select_regions(&doc, &pending, &ext.regions)?; // swEndConditions_e (help.solidworks.com/2024/english/api/swconst/ // SOLIDWORKS.Interop.swconst~SOLIDWORKS.Interop.swconst.- // swEndConditions_e.html): Blind 0, ThroughAll 1, OffsetFromSurface- // 5, MidPlane 6, ThroughAllBoth 9, UpToSelection 10, UpToNext 11- // (UpToSurface 4 is the obsolete id; UpToSelection replaces it).+ // swEndConditions_e.html): Blind 0, ThroughAll 1, UpToSurface 4,+ // OffsetFromSurface 5, MidPlane 6, ThroughAllBoth 9, UpToSelection+ // 10, UpToNext 11. MEASURED 2026-10-16: "up to surface" is 4 here,+ // not the help's 10 - see modeling::end_condition_id. const BLIND: i32 = 0; const THROUGH_ALL: i32 = 1; const MID_PLANE: i32 = 6;@@ -5949,12 +5982,19 @@ impl ComBackend { // UNMEASURED: Through All - Both as Sd=true, T1=9. (None, Direction::Both, true) => (true, THROUGH_ALL_BOTH, BLIND, 0.01, 0.01), };- // OffsetReverse1: the offset goes BEYOND the face instead of short of it.+ // OffsetReverse1: the offset goes BEYOND the face instead of short of it+ // — the help's own words (FeatureCut4 / FeatureExtrusion3, read+ // 2026-10-16): "true specifies offset in direction away from the+ // sketch, false specifies offset from the face or plane in a+ // direction toward the sketch". let offset_reverse = matches!(ext.up_to, Some(crate::script::UpTo::OffsetFrom { reverse_offset: true, .. }));- // DRAFT (0.11.0): Dchk1 on, Ddir1 TRUE = INWARD, Dang1 radians — and- // the same on side 2 when the extent goes two ways.+ // DRAFT (0.11.0): Dchk1 on, Dang1 radians - and the same on side 2+ // when the extent goes two ways. Ddir1 TRUE = OUTWARD, as SOLIDWORKS+ // measured it on 2026-10-16 (the help says inward; the help is wrong+ // for this build; see modeling::draft_outward_flag). The canary+ // 0.11.4-rc1 had passed !outward and widened every drafted feature. let (dchk, ddir, dang) = match ext.draft {- Some(d) => (true, !d.outward, d.angle),+ Some(d) => (true, crate::modeling::draft_outward_flag(&d), d.angle), None => (false, false, 0.0174533), }; let dchk2 = dchk && !sd;@@ -5962,8 +6002,15 @@ impl ComBackend { // against it for a cut, whatever way the sketch's own normal // points; the caller's reverse flips it. let (dir, flipped) = crate::modeling::dir_flag(pending.normal, pending.reference, ext.reverse);- let fm = doc.obj("FeatureManager", &[])?.ok_or_else(|| HostError::msg("no FeatureManager"))?;- let f = if !cut {+ let fm = match doc.obj("FeatureManager", &[]) {+ Ok(Some(fm)) => fm,+ other => {+ Self::end_contour_selection(&doc, contour_sel);+ other?;+ return Err(HostError::msg("no FeatureManager"));+ }+ };+ let made: Result<Var, HostError> = if !cut { // FeatureExtrusion3 (2014 FCS): Sd, Flip, Dir, T1, T2, D1, D2, // Dchk1, Dchk2, Ddir1, Ddir2, Dang1, Dang2, OffsetReverse1, // OffsetReverse2, TranslateSurface1, TranslateSurface2, Merge,@@ -5996,9 +6043,10 @@ impl ComBackend { &Var::r8(0.0), &Var::boolean(false), ],- )?+ )+ } else if let Err(e) = self.requires(25, "IFeatureManager::FeatureCut4 (SOLIDWORKS 2017)") {+ Err(e) } else {- self.requires(25, "IFeatureManager::FeatureCut4 (SOLIDWORKS 2017)")?; // FeatureCut4 (2017 FCS): Sd, Flip (the side to cut), Dir // (reverse the direction), T1, T2, D1, D2, Dchk1, Dchk2, // Ddir1, Ddir2, Dang1, Dang2, OffsetReverse1, OffsetReverse2,@@ -6037,12 +6085,24 @@ impl ComBackend { &Var::r8(0.0), &Var::boolean(false), ],- )?+ ) };+ // Contour selection is put back as it was on EVERY road out.+ Self::end_contour_selection(&doc, contour_sel);+ let f = made?; let feature = f.as_dispatch().map(Disp); let _ = Self::clear_selection(&doc); // A FEATURE THAT COMES BACK NULL IS AN ERROR (issue #1). let Some(feature) = feature else {+ if !ext.regions.is_empty() {+ return Err(HostError::msg(format!(+ "SOLIDWORKS made no {} from the selected sketch regions (the feature came back null) — {} region(s) were \+ selected by SelectByID2 SKETCHREGION at mark 4 (UNMEASURED live, 0.11.4); check that each point lies \+ inside the region meant, on the sketch's plane",+ if cut { "cut" } else { "extrusion" },+ ext.regions.len()+ )));+ } return Err(HostError::msg(if cut { "SOLIDWORKS made no cut (the feature came back null) — nothing was removed. A cut goes along its \ plane's −NORMAL (measured: a cut from Top Plane removes −Y) and INTO a face it is sketched on; \@@ -6069,6 +6129,18 @@ impl ComBackend { "upToFace": up_to_face, "draftDeg": ext.draft.map(|d| d.angle.to_degrees()), "draftInward": ext.draft.map(|d| !d.outward),+ "regions": regions_report,+ // WHAT SOLIDWORKS STORED (0.11.4, best-effort, read-only):+ // IFeature::GetDefinition -> IExtrudeFeatureData2, the end+ // condition, depth and draft side of direction 1 as the+ // feature holds them. A reply that disagrees with the request+ // is the finding (UNMEASURED: the read-back itself).+ "readBack": feature.obj("GetDefinition", &[]).ok().flatten().map(|def| json!({+ "endCondition": def.int("GetEndCondition", &[&Var::boolean(true)]),+ "depthMm": def.float("GetDepth", &[&Var::boolean(true)]).map(|m| m * 1000.0),+ "draftOutward": def.call("GetDraftOutward", &[&Var::boolean(true)]).ok().and_then(|v| v.as_bool()),+ "draftAngleDeg": def.float("GetDraftAngle", &[&Var::boolean(true)]).map(|a| a.to_degrees()),+ })), })) } @@ -7017,6 +7089,239 @@ impl ComBackend { } } + /// SELECT SKETCH REGIONS (0.11.4) for the feature about to be made, the+ /// way SOLIDWORKS' own example does: ISelectionMgr::EnableContourSelection+ /// on, then per region IModelDocExtension::SelectByID2(<sketch>,+ /// "SKETCHREGION", <a model point inside it>, Append, MARK 4). Each pick is+ /// believed only when the selection count grew. Returns the selection+ /// manager and what contour selection was before (to put back), and the+ /// report. Nothing to do for no regions.+ fn select_regions(&mut self, doc: &Disp, pending: &PendingSketch, regions: &[[f64; 2]]) -> Result<(Option<(Disp, bool)>, Value), HostError> {+ if regions.is_empty() {+ return Ok((None, Value::Null));+ }+ let sel = doc.obj("SelectionManager", &[])?.ok_or_else(|| HostError::msg("no SelectionManager"))?;+ let ext = doc.obj("Extension", &[])?.ok_or_else(|| HostError::msg("no ModelDocExtension"))?;+ let was = sel.call("EnableContourSelection", &[]).ok().and_then(|v| v.as_bool()).unwrap_or(false);+ sel.try_put("EnableContourSelection", &Var::boolean(true));+ let state = Some((sel.clone(), was));+ let mut picked = Vec::new();+ for (k, r) in regions.iter().enumerate() {+ let fail = |why: String| {+ Self::end_contour_selection(doc, state.clone());+ let _ = Self::clear_selection(doc);+ Err(HostError::msg(format!("region {} at [{:.3}, {:.3}] mm: {why}", k + 1, r[0] * 1000.0, r[1] * 1000.0)))+ };+ let Some(p) = pending.model_point(r[0], r[1]) else {+ return fail("the sketch's place in the model could not be read, so the point cannot be put on it".into());+ };+ let before = sel.int("GetSelectedObjectCount2", &[&Var::i4(-1)]).unwrap_or(0);+ let ok = ext+ .call(+ "SelectByID2",+ &[+ &Var::bstr(&pending.name),+ &Var::bstr("SKETCHREGION"),+ &Var::r8(p[0]),+ &Var::r8(p[1]),+ &Var::r8(p[2]),+ &Var::boolean(true),+ &Var::i4(4),+ &Var::null_dispatch(),+ &Var::i4(0),+ ],+ )+ .map(|v| v.as_bool().unwrap_or(false));+ let after = sel.int("GetSelectedObjectCount2", &[&Var::i4(-1)]).unwrap_or(0);+ match ok {+ Ok(true) if after > before => picked.push(json!({"atMm": [r[0] * 1000.0, r[1] * 1000.0], "modelMm": [p[0] * 1000.0, p[1] * 1000.0, p[2] * 1000.0]})),+ Ok(_) => return fail(format!("no region of the sketch '{}' holds that point (SelectByID2 SKETCHREGION selected nothing)", pending.name)),+ Err(e) => return fail(e.message),+ }+ }+ Ok((state, json!({"selected": picked, "via": "SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on"})))+ }++ /// Put ISelectionMgr::EnableContourSelection back as it was.+ fn end_contour_selection(_doc: &Disp, state: Option<(Disp, bool)>) {+ if let Some((sel, was)) = state {+ sel.try_put("EnableContourSelection", &Var::boolean(was));+ }+ }++ /// The edges of a face's OUTER loop (IFace2::GetLoops, ILoop2::IsOuter,+ /// ILoop2::GetEdges — 2001Plus).+ fn outer_loop_edges(face: &Disp) -> Result<Vec<Disp>, HostError> {+ let loops: Vec<Disp> = face.call("GetLoops", &[])?.as_array().iter().filter_map(|l| l.as_dispatch().map(Disp)).collect();+ for lp in &loops {+ if lp.call("IsOuter", &[]).ok().and_then(|v| v.as_bool()) == Some(true) {+ let edges: Vec<Disp> = lp.call("GetEdges", &[])?.as_array().iter().filter_map(|e| e.as_dispatch().map(Disp)).collect();+ if edges.is_empty() {+ return Err(HostError::msg("the face's outer loop has no edges"));+ }+ return Ok(edges);+ }+ }+ Err(HostError::msg(format!("none of the face's {} loops says it is the outer one (ILoop2::IsOuter)", loops.len())))+ }++ /// The open sketch's segments (ISketch::GetSketchSegments), in order.+ fn sketch_segments(sketch: &Disp) -> Vec<Disp> {+ sketch.call("GetSketchSegments", &[]).map(|v| v.as_array().iter().filter_map(|x| x.as_dispatch().map(Disp)).collect()).unwrap_or_default()+ }++ /// A sketch segment's two ends, in SKETCH space: ISketchLine / ISketchArc+ /// GetStartPoint2 / GetEndPoint2 → ISketchPoint X, Y, Z — through the+ /// segment's own dispatch, or its ISketchLine / ISketchArc interface (QI+ /// with the IID read from the installed interop). None for anything else+ /// (a spline, an ellipse): the side check then says it could not tell.+ fn segment_ends(&mut self, seg: &Disp) -> Option<[crate::modeling::V3; 2]> {+ let exe = self.app(false, true).ok().and_then(|sw| sw.string("GetExecutablePath", &[])).unwrap_or_default();+ let mut via: Vec<Disp> = vec![seg.clone()];+ for iface in ["ISketchLine", "ISketchArc"] {+ if let Ok(iid) = interop_dual_iid(&exe, iface) {+ if let Some(d) = seg.query_dual(&iid) {+ via.push(d);+ }+ }+ }+ let point = |p: Option<Disp>| -> Option<crate::modeling::V3> {+ let p = p?;+ Some([p.call("X", &[]).ok()?.as_f64()?, p.call("Y", &[]).ok()?.as_f64()?, p.call("Z", &[]).ok()?.as_f64()?])+ };+ for d in via {+ if d.dispid("GetStartPoint2").is_err() {+ continue;+ }+ let a = point(d.obj("GetStartPoint2", &[]).ok().flatten());+ let b = point(d.obj("GetEndPoint2", &[]).ok().flatten());+ if let (Some(a), Some(b)) = (a, b) {+ return Some([a, b]);+ }+ }+ None+ }++ /// Delete sketch segments: each selected (ISketchSegment::Select4,+ /// appended), then IModelDoc2::EditDelete.+ fn delete_segments(doc: &Disp, segs: &[Disp]) -> Result<(), HostError> {+ let _ = Self::clear_selection(doc);+ for sg in segs {+ if !Self::select_with_mark(doc, sg, "Select4", 0) {+ let _ = Self::clear_selection(doc);+ return Err(HostError::msg("a segment the offset made could not be selected to be deleted"));+ }+ }+ doc.call("EditDelete", &[])?;+ let _ = Self::clear_selection(doc);+ Ok(())+ }++ /// OFFSET ENTITIES (0.11.4) into the open sketch: the face picked by its+ /// point; its outer loop's edges (or the face itself) selected; then+ /// IModelDoc2::SketchOffsetEntities2(Offset metres, BothDirections false,+ /// Chain) — "the geometry selected for offset can be an edge, loop, face+ /// …" (help.solidworks.com/2018/english/api/sldworksapi/SolidWorks.Interop.+ /// sldworks~SolidWorks.Interop.sldworks.IModelDoc2~SketchOffsetEntities2.+ /// html; the same in 2026, available since 2001Plus, so on 2021 too).+ /// SOLIDWORKS' sign does NOT say which side the offset lands on (a forum+ /// report: SketchOffsetEntities2(-0.01, …) went inside on one face and+ /// outside on another), so the bridge LOOKS: every new segment's ends,+ /// put in the model, are within half the offset of the face (inward) or+ /// all farther (outward). Landed on the wrong side, the new segments are+ /// deleted and the offset made with the other sign — once.+ fn offset_face(&mut self, doc: &Disp, o: &crate::script::OffsetFace, m2s: Option<&crate::modeling::Xform>) -> Result<Value, HostError> {+ use crate::modeling::{dot, norm, scale, sub};+ let picked = Self::pick_face(doc, o.point)?;+ let face = picked.face.clone();+ let normal = picked.normal;+ let (items, what): (Vec<SelItem>, String) = match o.loops {+ crate::script::OffsetLoops::All => (vec![SelItem::face(picked)], "the face".into()),+ crate::script::OffsetLoops::Outer => {+ let edges = Self::outer_loop_edges(&face)?;+ let n = edges.len();+ (edges.into_iter().map(|e| SelItem::edge(e, None)).collect(), format!("the face's outer loop ({n} edges)"))+ }+ };+ let n_sel = items.len();+ let sketch = doc.obj("GetActiveSketch2", &[])?.ok_or_else(|| HostError::msg("no open sketch to offset into"))?;+ let s2m = m2s.map(|t| t.inverse());+ let want_inward = o.offset < 0.0;+ let half = o.offset.abs() / 2.0;+ let mut tries: Vec<Value> = Vec::new();+ let mut sign = 1.0;+ for attempt in 0..2 {+ let before = Self::sketch_segments(&sketch).len();+ let r = self.select_items(doc, items.clone(), 0)?;+ if !r.all(n_sel) {+ let _ = Self::clear_selection(doc);+ return Err(HostError::msg(format!("{what} could not be selected to offset ({})", r.notes.join("; "))));+ }+ let value = o.offset * sign;+ let ok = doc.call("SketchOffsetEntities2", &[&Var::r8(value), &Var::boolean(false), &Var::boolean(o.chain)])?.as_bool().unwrap_or(false);+ let _ = Self::clear_selection(doc);+ let new: Vec<Disp> = Self::sketch_segments(&sketch).into_iter().skip(before).collect();+ if !ok || new.is_empty() {+ return Err(HostError::msg(format!(+ "SketchOffsetEntities2({} mm) on {what} made nothing (returned {ok}, {} new segments)",+ value * 1000.0,+ new.len()+ )));+ }+ // WHERE DID IT LAND? Each end, in the model, against the face.+ let mut dists: Vec<f64> = Vec::new();+ let mut unread = 0usize;+ for sg in &new {+ match (self.segment_ends(sg), &s2m) {+ (Some(ends), Some(t)) => {+ for e in ends {+ let p = t.apply(e);+ let c = Self::floats(&face.call("GetClosestPointOn", &[&Var::r8(p[0]), &Var::r8(p[1]), &Var::r8(p[2])]).unwrap_or(Var::empty()));+ if c.len() >= 3 {+ let v = sub([c[0], c[1], c[2]], p);+ dists.push(norm(sub(v, scale(normal, dot(v, normal)))));+ } else {+ unread += 1;+ }+ }+ }+ _ => unread += 1,+ }+ }+ let inside = !dists.is_empty() && dists.iter().all(|d| *d < half);+ let outside = !dists.is_empty() && dists.iter().all(|d| *d > half);+ let landed = if unread > 0 || dists.is_empty() { "unknown" } else if inside { "inward" } else if outside { "outward" } else { "both" };+ tries.push(json!({"offsetMm": value * 1000.0, "segments": new.len(), "landed": landed,+ "farthestFromTheFaceMm": dists.iter().cloned().fold(0.0, f64::max) * 1000.0}));+ let right = (want_inward && inside) || (!want_inward && outside);+ if right || landed == "unknown" {+ return Ok(json!({+ "offsetEntities": o.describe()["offsetEntities"].clone(),+ "selected": what,+ "segments": new.len(),+ "side": if right { landed } else { "not verified" },+ "sideVerified": right,+ "why": (!right).then_some("the new segments' ends could not all be read back, so the side was not checked — verify the result's mass or area"),+ "tries": tries,+ "route": "IModelDoc2::SketchOffsetEntities2",+ }));+ }+ if attempt == 1 {+ return Err(HostError::msg(format!(+ "SketchOffsetEntities2 put the offset of {what} on the wrong side ({}) with both signs — nothing usable was drawn: {}",+ if want_inward { "wanted inside the face" } else { "wanted outside it" },+ serde_json::to_string(&tries).unwrap_or_default()+ )));+ }+ Self::delete_segments(doc, &new)?;+ if Self::sketch_segments(&sketch).len() != before {+ return Err(HostError::msg("the offset on the wrong side could not be deleted — the sketch keeps it; nothing more was drawn"));+ }+ sign = -sign;+ }+ unreachable!("two attempts return")+ }+ /// THE GEOMETRIC EDGE PICK: IEdge::GetClosestPointOn over every edge. fn pick_edge(doc: &Disp, p: crate::modeling::V3) -> Result<(Disp, crate::modeling::V3), HostError> { use crate::modeling::{norm, sub};@@ -7361,6 +7666,7 @@ enum SelKind { /// One entity to select, with what the ray rung needs: a point ON it and its /// outward direction (a face's normal; filled lazily for an edge).+#[derive(Clone)] struct SelItem { ent: Disp, kind: SelKind,@@ -7584,6 +7890,22 @@ struct PendingSketch { /// Each drawn entity's line segment (None for anything else), in the /// order drawn — a revolve's axis is selected from here. segments: Vec<Option<SketchSeg>>,+ /// Where the caller's (u, v) are in the model (0.11.4, a region pick): the+ /// base plane's frame at a height for a mapped sketch (an offset plane, a+ /// face), else the sketch's own axes (sketch-to-model transform).+ mapping: Option<(crate::modeling::PlaneFrame, f64)>,+ sketch_to_model: Option<crate::modeling::Xform>,+}++impl PendingSketch {+ /// The model point of the caller's sketch point (u, v).+ fn model_point(&self, u: f64, v: f64) -> Option<crate::modeling::V3> {+ match (&self.mapping, &self.sketch_to_model) {+ (Some((frame, h)), _) => Some(frame.point(u, v, *h)),+ (None, Some(t)) => Some(t.apply([u, v, 0.0])),+ (None, None) => None,+ }+ } } /// A drawn sketch line: its ISketchSegment and its name within the sketch.
src/comhost/mock_csg.rs+56@@ -121,6 +121,62 @@ pub fn crossings(entities: &[Entity], p: (f64, f64), e: (f64, f64), shrink: f64) out } +/// Is `p` inside the closed profile that `members` (indices into `entities`)+/// make? Even-odd along a ray in a direction no drawn vertex lines up with+/// (0.11.4, the simulator's sketch regions).+pub fn point_in(entities: &[Entity], members: &[usize], p: (f64, f64)) -> bool {+ let sub: Vec<Entity> = members.iter().filter_map(|i| entities.get(*i).cloned()).collect();+ let a: f64 = 0.618_033_988_75;+ crossings(&sub, p, (a.cos(), a.sin()), 0.0).iter().filter(|s| **s > 0.0).count() % 2 == 1+}++/// Points along a profile's boundary, `n` per entity.+fn boundary_samples(entities: &[Entity], members: &[usize], n: usize) -> Vec<(f64, f64)> {+ let mut out = Vec::new();+ let seg = |a: (f64, f64), b: (f64, f64), out: &mut Vec<(f64, f64)>| {+ for k in 0..n {+ let t = (k as f64 + 0.5) / n as f64;+ out.push((a.0 + (b.0 - a.0) * t, a.1 + (b.1 - a.1) * t));+ }+ };+ for i in members {+ match entities.get(*i).cloned() {+ Some(Entity::Rect { x0, y0, x1, y1 }) => {+ for (a, b) in [((x0, y0), (x1, y0)), ((x1, y0), (x1, y1)), ((x1, y1), (x0, y1)), ((x0, y1), (x0, y0))] {+ seg(a, b, &mut out);+ }+ }+ Some(Entity::Circle { cx, cy, r }) => {+ for k in 0..4 * n {+ let t = std::f64::consts::TAU * (k as f64 + 0.5) / (4 * n) as f64;+ out.push((cx + r * t.cos(), cy + r * t.sin()));+ }+ }+ Some(Entity::Line { x0, y0, x1, y1, .. }) => seg((x0, y0), (x1, y1), &mut out),+ Some(e @ Entity::Arc { .. }) => {+ if let Some((cx, cy, r, t0, sw)) = crate::script::arc_geom(&e) {+ for k in 0..n {+ let t = t0 + sw * (k as f64 + 0.5) / n as f64;+ out.push((cx + r * t.cos(), cy + r * t.sin()));+ }+ }+ }+ None => {}+ }+ }+ out+}++/// Do two closed profiles' boundaries CROSS — one partly inside the other+/// (sampled: 64 points per entity, either way round)?+pub fn profiles_cross(entities: &[Entity], a: &[usize], b: &[usize]) -> bool {+ let mixed = |samples: &[(f64, f64)], other: &[usize]| {+ let ins = samples.iter().filter(|p| point_in(entities, other, **p)).count();+ ins > 0 && ins < samples.len()+ };+ mixed(&boundary_samples(entities, a, 64), b) || mixed(&boundary_samples(entities, b, 64), a)+}+ /// Pairs of crossings as intervals (an odd count drops the last: a tangency). fn pairs(c: &[f64]) -> Vec<(f64, f64)> { c.chunks_exact(2).map(|w| (w[0], w[1])).filter(|(a, b)| b > a).collect()
src/comhost/mock_model.rs+122−7@@ -224,6 +224,29 @@ fn profiles(entities: &[Entity]) -> Vec<Prof> { out } +/// Every profile with the entities that make it (0.11.4): a rectangle or a+/// circle is its own entity; a contour, its lines and arcs.+fn profile_members(entities: &[Entity]) -> Vec<(Prof, Vec<usize>)> {+ let ps = profiles(entities);+ let mut members: Vec<Vec<usize>> = Vec::new();+ for (i, e) in entities.iter().enumerate() {+ if matches!(e, Entity::Rect { .. } | Entity::Circle { .. }) {+ members.push(vec![i]);+ }+ }+ for c in crate::script::contours(entities).unwrap_or_default() {+ let (a, _, _) = modeling::contour_moments(entities, &c);+ if a.abs() > 1e-30 {+ members.push(c.iter().map(|(i, _)| *i).collect());+ }+ }+ ps.into_iter().zip(members).collect()+}++fn members_of(members: &[(Prof, Vec<usize>)], id: usize) -> Vec<usize> {+ members.iter().find(|(p, _)| p.id == id).map(|(_, m)| m.clone()).unwrap_or_default()+}+ fn inside(a: &Prof, b: &Prof) -> bool { let (ax0, ay0, ax1, ay1) = a.bounds; let (bx0, by0, bx1, by1) = b.bounds;@@ -488,7 +511,7 @@ impl Model { /// A sketch: where it is, resolved. Returns the pending sketch and the /// step's report.- pub fn sketch(&mut self, plane: &PlaneRef, entities: &[Entity]) -> Result<(Pending, Value), String> {+ pub fn sketch(&mut self, plane: &PlaneRef, entities: &[Entity], offsets: &[crate::script::OffsetFace]) -> Result<(Pending, Value), String> { let defaults = PlaneFrame::defaults(); let (frame, h, sign, resolved, made) = match plane { PlaneRef::Named(n) => {@@ -535,6 +558,47 @@ impl Model { ) } };+ // OFFSET ENTITIES (0.11.4): the simulator knows a face's outline only+ // where the body IS its box — a plain block, whose faces are+ // rectangles. Anything else is SOLIDWORKS' to draw: refused, saying so.+ let mut all = entities.to_vec();+ let mut offset_report = Vec::new();+ for o in offsets {+ let f = self.pick_face(o.point)?;+ if self.bodies[f.body].shape != Shape::Box {+ return Err("the simulator can offset only the face of a plain block (a body that is its own bounding box); \+ this face's outline is SOLIDWORKS' own — run it live (offsetEntities)".into());+ }+ if f.axis != normal_axis(&frame) {+ return Err("the simulator offsets a face PARALLEL to the sketch plane only (SOLIDWORKS projects any face)".into());+ }+ let b = &self.bodies[f.body];+ let (mut u0, mut v0, mut u1, mut v1) = (f64::MAX, f64::MAX, f64::MIN, f64::MIN);+ let others: Vec<usize> = (0..3).filter(|i| *i != f.axis).collect();+ for ca in [b.lo[others[0]], b.hi[others[0]]] {+ for cb in [b.lo[others[1]], b.hi[others[1]]] {+ let mut p = [0.0; 3];+ p[others[0]] = ca;+ p[others[1]] = cb;+ let rel = modeling::sub(p, frame.origin);+ let (u, v) = (modeling::dot(rel, frame.x), modeling::dot(rel, frame.y));+ u0 = u0.min(u);+ u1 = u1.max(u);+ v0 = v0.min(v);+ v1 = v1.max(v);+ }+ }+ // offset < 0: INTO the face.+ let d = o.offset;+ let (x0, y0, x1, y1) = (u0 - d, v0 - d, u1 + d, v1 + d);+ if x1 - x0 <= 1e-9 || y1 - y0 <= 1e-9 {+ return Err(format!("an offset of {} mm inward leaves nothing of a {:.3} x {:.3} mm face", -d * 1000.0, (u1 - u0) * 1000.0, (v1 - v0) * 1000.0));+ }+ all.push(Entity::Rect { x0, y0, x1, y1 });+ offset_report.push(json!({"rectMm": [[x0 * 1000.0, y0 * 1000.0], [x1 * 1000.0, y1 * 1000.0]], "side": if d < 0.0 { "inward" } else { "outward" },+ "simulated": "the face of a plain block: its rectangle, offset"}));+ }+ let entities = &all[..]; let name = self.next_name("Sketch"); let mut report = json!({ "plane": plane.describe(),@@ -544,10 +608,54 @@ impl Model { "entities": entities.iter().map(|e| e.describe()).collect::<Vec<_>>(), "profileAreaMm2": profile_area(entities) * 1.0e6, });+ if !offsets.is_empty() {+ report["offsets"] = json!(offsets.iter().zip(offset_report).map(|(o, r)| {+ let mut d = o.describe();+ d["drawn"] = r;+ d+ }).collect::<Vec<_>>());+ } crate::script::single_entity_fields(entities, &mut report); Ok((Pending { name, frame, h, sign, entities: entities.to_vec() }, report)) } + /// THE SKETCH REGIONS a pick selects (0.11.4), as the entities that bound+ /// them: for each point, the innermost profile holding it and the+ /// profiles directly inside that one (its holes). The simulator models+ /// regions of profiles that NEST or stand apart; crossing contours (an+ /// offset outline and a circle) are SOLIDWORKS' to resolve — refused.+ pub fn region_entities(entities: &[Entity], picks: &[[f64; 2]]) -> Result<Vec<Entity>, String> {+ let members = profile_members(entities);+ for (i, (a, _)) in members.iter().enumerate() {+ for (b, _) in members.iter().skip(i + 1) {+ let (ax0, ay0, ax1, ay1) = a.bounds;+ let (bx0, by0, bx1, by1) = b.bounds;+ let apart = ax1 < bx0 - 1e-12 || bx1 < ax0 - 1e-12 || ay1 < by0 - 1e-12 || by1 < ay0 - 1e-12;+ let crossing = crate::comhost::mock_csg::profiles_cross(entities, &members_of(&members, a.id), &members_of(&members, b.id));+ if !apart && crossing {+ return Err("the simulator models regions of profiles that nest or stand apart; these contours CROSS — \+ only SOLIDWORKS resolves their regions (run it live)".into());+ }+ }+ }+ let mut keep: Vec<usize> = Vec::new();+ for (k, p) in picks.iter().enumerate() {+ let holding: Vec<&(Prof, Vec<usize>)> = members.iter().filter(|(_, m)| crate::comhost::mock_csg::point_in(entities, m, (p[0], p[1]))).collect();+ let inner = holding.iter().min_by(|a, b| a.0.area.partial_cmp(&b.0.area).unwrap_or(std::cmp::Ordering::Equal))+ .ok_or_else(|| format!("region {}: [{}, {}] mm is in no closed profile of the sketch", k + 1, p[0] * 1000.0, p[1] * 1000.0))?;+ keep.extend(inner.1.iter().copied());+ // Its holes: the profiles inside it with nothing between.+ for (q, m) in &members {+ if q.id != inner.0.id && inside(q, &inner.0) && !members.iter().any(|(r, _)| r.id != q.id && r.id != inner.0.id && inside(q, r) && inside(r, &inner.0)) {+ keep.extend(m.iter().copied());+ }+ }+ }+ keep.sort_unstable();+ keep.dedup();+ Ok(keep.into_iter().map(|i| entities[i].clone()).collect())+ }+ /// Where an UP-TO end condition stops, as a coordinate along the sketch's /// normal axis (0.11.0). The simulator models faces parallel to the sketch /// plane only.@@ -1393,14 +1501,14 @@ pub fn apply(model: &mut Model, run: &mut Run, op: &Op, active: bool) -> Result< return Err("selection works only in the ACTIVE document, and this one is not active — nothing could be selected".into()); } let out = match op {- Op::Sketch { plane, entities, .. } => {+ Op::Sketch { plane, entities, offsets, .. } => { let via = if let PlaneRef::Face { point } = plane { model.pick_face(*point)?; Some(select_n(run, 1, "faces", "nothing to sketch on").map_err(|e| format!("the picked face could not be selected ({e})"))?) } else { None };- let (p, mut report) = model.sketch(plane, entities)?;+ let (p, mut report) = model.sketch(plane, entities, offsets)?; if let Some(v) = via { report["resolvedPlane"]["selectedVia"] = v["selectedVia"].clone(); report["resolvedPlane"]["viewDependent"] = v["viewDependent"].clone();@@ -1417,6 +1525,13 @@ pub fn apply(model: &mut Model, run: &mut Run, op: &Op, active: bool) -> Result< return Err(format!("the sketch '{}' was no longer selected — SOLIDWORKS returned no feature", p.name)); } run.sketch_selected = false;+ // SELECTED REGIONS (0.11.4): only those profiles are extruded.+ let p = if ext.regions.is_empty() {+ p+ } else {+ let kept = Model::region_entities(&p.entities, &ext.regions).inspect_err(|_| model.loose_sketches.push(p.name.clone()))?;+ Pending { entities: kept, ..p }+ }; let made = model.extrude(&p, ext, matches!(op, Op::Cut(_))); if made.is_err() { // A feature that came back null leaves its sketch in the tree.@@ -1586,14 +1701,14 @@ mod tests { use crate::script::{Direction, Extent}; fn ext(depth: f64) -> Extent {- Extent { depth, depth2: depth, through_all: false, reverse: false, direction: Direction::One , up_to: None, draft: None }+ Extent { depth, depth2: depth, through_all: false, reverse: false, direction: Direction::One , up_to: None, draft: None, regions: Vec::new() } } fn block() -> (Model, Run) { let mut m = Model::default(); let mut run = Run::default(); apply(&mut m, &mut run, &Op::Sketch { shorthand: "sketch_rect", plane: PlaneRef::Named("Top Plane".into()),- entities: vec![Entity::Rect { x0: -0.01, y0: -0.01, x1: 0.01, y1: 0.01 }] }, true).unwrap();+ entities: vec![Entity::Rect { x0: -0.01, y0: -0.01, x1: 0.01, y1: 0.01 }], offsets: vec![] }, true).unwrap(); apply(&mut m, &mut run, &Op::Extrude(ext(0.01)), true).unwrap(); (m, run) }@@ -1618,7 +1733,7 @@ mod tests { let (mut m, mut run) = block(); // Michael's case: a default cut from Top Plane goes −Y, where there is no material. apply(&mut m, &mut run, &Op::Sketch { shorthand: "sketch_rect", plane: PlaneRef::Named("Top Plane".into()),- entities: vec![Entity::Rect { x0: -0.005, y0: -0.005, x1: 0.005, y1: 0.005 }] }, true).unwrap();+ entities: vec![Entity::Rect { x0: -0.005, y0: -0.005, x1: 0.005, y1: 0.005 }], offsets: vec![] }, true).unwrap(); assert!(apply(&mut m, &mut run, &Op::Cut(ext(0.005)), true).unwrap_err().contains("null")); } @@ -1646,7 +1761,7 @@ mod tests { fn a_boss_from_the_bottom_face_goes_outward() { let (mut m, mut run) = block(); apply(&mut m, &mut run, &Op::Sketch { shorthand: "sketch_circle", plane: PlaneRef::Face { point: [0.0, 0.0, 0.0] },- entities: vec![Entity::Circle { cx: 0.0, cy: 0.0, r: 0.003 }] }, true).unwrap();+ entities: vec![Entity::Circle { cx: 0.0, cy: 0.0, r: 0.003 }], offsets: vec![] }, true).unwrap(); apply(&mut m, &mut run, &Op::Extrude(ext(0.003)), true).unwrap(); assert!((m.bodies[0].lo[1] + 0.003).abs() < 1e-12, "y down to -3 mm: {:?}", m.bodies[0].lo); }
src/compat.rs+157−49@@ -128,9 +128,25 @@ pub const LIVE_2021_10_15: Measurement = Measurement { year: 2021, major: 29, ed /// title fix, proven. pub const LIVE_2026_10_15_HIDEEXT: Measurement = Measurement { year: 2026, major: 34, edition: "connected", date: "2026-10-15", bridge: "0.11.2", by: "adom" }; +/// 2026-10-15 23:04Z, bridge 0.11.2, SOLIDWORKS 2026 (34.3.0, "Connected"),+/// Drew's laptop: THE FIRST LIVE CSWA RUN — tools/cswa-check.py, 8 of 8 parts+/// within tolerance, every one within 0.0015 % of its published key+/// (tools/cswa/reports/cswa-2026-10-15-sw2026-0.11.2.json; docs/LIVE-RESULTS.md).+/// Every variant those eight scripts used is measured by it — the lines and+/// arcs of the Tool Block's profile, the face-offset plane, the plain hole,+/// the density, the sketch on a +Z face among them. The same install, bridge+/// and day as the HideFileExt run (equal as values; `checks` says which run).+pub const LIVE_2026_10_15_CSWA: Measurement = Measurement { year: 2026, major: 34, edition: "connected", date: "2026-10-15", bridge: "0.11.2", by: "adom" };+/// The first canary (0.11.4-rc1): 14 CSWA parts, 12 within 0.1 % (cswa-00..10), two caught the draft flag+/// and the up-to-surface id (cswa-11, cswa-12). The variants listed on it were exercised by PASSING parts.+pub const LIVE_2026_10_16_RC1: Measurement = Measurement { year: 2026, major: 34, edition: "connected", date: "2026-10-16", bridge: "0.11.4-rc1", by: "adom" };+ const M2026_2021: &[Measurement] = &[LIVE_2026_10_14, LIVE_2021_10_15];+const M2026_2021_CSWA: &[Measurement] = &[LIVE_2026_10_14, LIVE_2021_10_15, LIVE_2026_10_15_CSWA]; const M2026_HIDEEXT: &[Measurement] = &[LIVE_2026_10_15_HIDEEXT];-const M2026C_2021: &[Measurement] = &[LIVE_2026_10_14_C, LIVE_2021_10_15];+const M2026C_2021_CSWA: &[Measurement] = &[LIVE_2026_10_14_C, LIVE_2021_10_15, LIVE_2026_10_15_CSWA];+const M2026_CSWA: &[Measurement] = &[LIVE_2026_10_15_CSWA];+const M2026_RC1: &[Measurement] = &[LIVE_2026_10_16_RC1]; const M2026B: &[Measurement] = &[LIVE_2026_10_14_B]; const UNMEASURED: &[Measurement] = &[]; @@ -149,12 +165,12 @@ pub const OP_FACTS: &[OpFact] = &[ OpFact { id: "new_assembly", what: "a new assembly document", checks: "not in the live battery", measured: UNMEASURED }, OpFact { id: "new_part.invisible", what: "a new part created HIDDEN (DocumentVisible false around NewDocument) — it CANNOT be modelled: a hidden document cannot be activated, and every modelling op selects (measured 2026-10-14)", checks: "creation worked live (0.10.6); its modelling failed, so scripts now refuse it (document_hidden)", measured: UNMEASURED }, OpFact { id: "new_assembly.invisible", what: "a new assembly created HIDDEN (cannot be modelled, as new_part.invisible)", checks: "not run live", measured: UNMEASURED },- OpFact { id: "clear_part", what: "every feature after the origin deleted from the bridge's own part (DeleteSelection2), so one document serves a whole battery", checks: "12 reused builds (reuseDocument), 2026-10-14", measured: M2026C_2021 },- OpFact { id: "sketch.plane.front", what: "a sketch on Front Plane", checks: "T01 T03 T10 T14 T27", measured: M2026_2021 },- OpFact { id: "sketch.plane.top", what: "a sketch on Top Plane", checks: "T02 T13 T24 T30", measured: M2026_2021 },+ OpFact { id: "clear_part", what: "every feature after the origin deleted from the bridge's own part (DeleteSelection2), so one document serves a whole battery", checks: "12 reused builds (reuseDocument), 2026-10-14; the 8 CSWA parts in one part, tools/cswa-check.py 2026-10-15", measured: M2026C_2021_CSWA },+ OpFact { id: "sketch.plane.front", what: "a sketch on Front Plane", checks: "T01 T03 T10 T14 T27; 7 CSWA parts, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA },+ OpFact { id: "sketch.plane.top", what: "a sketch on Top Plane", checks: "T02 T13 T24 T30; the LEGO brick, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA }, OpFact { id: "sketch.plane.right", what: "a sketch on Right Plane (sketch +x = model −Z, +y = model +Y; a boss goes +X)", checks: "T35", measured: M2026B }, OpFact { id: "sketch.plane.named", what: "a sketch on a named plane other than Front/Top/Right", checks: "not in the live battery", measured: UNMEASURED },- OpFact { id: "sketch.offset.top.positive", what: "a sketch on a plane offset + from Top Plane", checks: "T04 T24", measured: M2026_2021 },+ OpFact { id: "sketch.offset.top.positive", what: "a sketch on a plane offset + from Top Plane", checks: "T04 T24; the LEGO brick, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA }, OpFact { id: "sketch.offset.top.negative", what: "a sketch on a plane offset − from Top Plane (keeps Top Plane's axes)", checks: "T05 T26", measured: M2026_2021 }, OpFact { id: "sketch.offset.front.positive", what: "a sketch on a plane offset + from Front Plane", checks: "T38", measured: M2026B }, OpFact { id: "sketch.offset.front.negative", what: "a sketch on a plane offset − from Front Plane", checks: "not in the live battery", measured: UNMEASURED },@@ -166,22 +182,22 @@ pub const OP_FACTS: &[OpFact] = &[ OpFact { id: "sketch.face.right.positive", what: "a sketch on a face facing +X (keeps Right Plane's axes, the origin projected)", checks: "T36", measured: M2026B }, OpFact { id: "sketch.face.right.negative", what: "a sketch on a face facing −X", checks: "not in the live battery", measured: UNMEASURED }, OpFact { id: "sketch.face.front.negative", what: "a sketch on a face facing −Z (keeps Front Plane's axes, the origin projected)", checks: "T37", measured: M2026B },- OpFact { id: "sketch.face.front.positive", what: "a sketch on a face facing +Z", checks: "not in the live battery", measured: UNMEASURED },- OpFact { id: "sketch.rect", what: "a rectangle (corner or center anchor)", checks: "T01 T02 T03", measured: M2026_2021 },- OpFact { id: "sketch.circle", what: "a circle", checks: "T04 T06 T30", measured: M2026_2021 },- OpFact { id: "sketch.multiProfile", what: "several profiles in one sketch (a ring, disjoint rectangles, the LEGO tubes)", checks: "T13 T14 T24", measured: M2026_2021 },- OpFact { id: "extrude.one", what: "a boss one way (the plane's normal, or outward from a face)", checks: "T01 T06 T25 and every base block", measured: M2026_2021 },+ OpFact { id: "sketch.face.front.positive", what: "a sketch on a face facing +Z", checks: "the Tool Block step 3's two cuts from the front face, tools/cswa-check.py 2026-10-15", measured: M2026_CSWA },+ OpFact { id: "sketch.rect", what: "a rectangle (corner or center anchor)", checks: "T01 T02 T03; 7 CSWA parts, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA },+ OpFact { id: "sketch.circle", what: "a circle", checks: "T04 T06 T30; the CSWA holes and slot, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA },+ OpFact { id: "sketch.multiProfile", what: "several profiles in one sketch (a ring, disjoint rectangles, the LEGO tubes)", checks: "T13 T14 T24; the LEGO brick and the Tool Block (its Ø14 in the profile), tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA },+ OpFact { id: "extrude.one", what: "a boss one way (the plane's normal, or outward from a face)", checks: "T01 T06 T25 and every base block; every CSWA part, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA }, OpFact { id: "extrude.one.reversed", what: "a boss whose direction flag is reversed (reverse:true: from Top Plane it goes −Y)", checks: "T33", measured: M2026B }, OpFact { id: "extrude.both", what: "a boss both ways (depthMm and depth2Mm)", checks: "T10", measured: M2026_2021 }, OpFact { id: "extrude.midPlane", what: "a boss symmetric about the sketch plane", checks: "T11", measured: M2026_2021 }, OpFact { id: "extrude.one.throughAll", what: "a boss through all, one way", checks: "T34", measured: M2026B }, OpFact { id: "extrude.both.throughAll", what: "a boss through all, both ways", checks: "not in the live battery", measured: UNMEASURED },- OpFact { id: "cut.one", what: "a cut one way, the default direction (the plane's −normal, into a face)", checks: "T07 (nothing on that side: the step failed, as it must) and T27's first direction", measured: M2026_2021 },- OpFact { id: "cut.one.reversed", what: "a cut one way, reversed (reverse:true)", checks: "T08 T24", measured: M2026_2021 },+ OpFact { id: "cut.one", what: "a cut one way, the default direction (the plane's −normal, into a face)", checks: "T07 (nothing on that side: the step failed, as it must) and T27's first direction; the Tool Block step 3's cuts, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA },+ OpFact { id: "cut.one.reversed", what: "a cut one way, reversed (reverse:true)", checks: "T08 T24; the LEGO brick, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA }, OpFact { id: "cut.one.throughAll.reversed", what: "a cut through all, reversed", checks: "T09", measured: M2026_2021 }, OpFact { id: "cut.both", what: "a cut both ways (depthMm along the cut's own direction, depth2Mm the other)", checks: "T27", measured: M2026_2021 }, OpFact { id: "cut.midPlane", what: "a cut symmetric about the sketch plane", checks: "T12", measured: M2026_2021 },- OpFact { id: "select.multiSelectTyped", what: "the picked entities selected by MultiSelect2 with a typed object array", checks: "11 of 11 live selections (T06 T16-T21 T25 T28-T30)", measured: M2026_2021 },+ OpFact { id: "select.multiSelectTyped", what: "the picked entities selected by MultiSelect2 with a typed object array", checks: "11 of 11 live selections (T06 T16-T21 T25 T28-T30); the Tool Block step 3's face picks, tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA }, OpFact { id: "select.entitySelect4", what: "a picked entity selected by IEntity::Select4 (the ladder's 2nd rung)", checks: "never needed live: the first rung worked", measured: UNMEASURED }, OpFact { id: "select.selectByRay", what: "a picked entity selected by SelectByRay (the ladder's 3rd rung)", checks: "never needed live: the first rung worked", measured: UNMEASURED }, OpFact { id: "select.selectByIdAtPoint", what: "a picked entity selected by SelectByID2 at the point, through the view (the last rung)", checks: "never needed live: the first rung worked", measured: UNMEASURED },@@ -199,40 +215,47 @@ pub const OP_FACTS: &[OpFact] = &[ OpFact { id: "set_appearance.part", what: "a colour on the part (or on the one body of a single-body part)", checks: "T15 T24", measured: M2026_2021 }, OpFact { id: "set_appearance.face", what: "a colour on one face picked by a point", checks: "T16", measured: M2026_2021 }, OpFact { id: "set_appearance.body", what: "a colour on one body of a multi-body part", checks: "not in the live battery", measured: UNMEASURED },- OpFact { id: "set_material", what: "a material from the SOLIDWORKS library (the body's density follows it)", checks: "T22 T24", measured: M2026_2021 },+ OpFact { id: "set_material", what: "a material from the SOLIDWORKS library (the body's density follows it)", checks: "T22 T24; every CSWA part (ABS, 6061 Alloy, AISI 1020), tools/cswa-check.py 2026-10-15", measured: M2026_2021_CSWA }, OpFact { id: "set_material.reappliesAppearance", what: "a material after a colour: the bridge re-applies the colour", checks: "T31 (swx_selftest)", measured: M2026_2021 }, OpFact { id: "set_prop", what: "a custom property", checks: "T24", measured: M2026_2021 }, // ── 0.11.0, CSWA phase 1: built and simulated, NOT YET RUN LIVE ──- OpFact { id: "sketch.line", what: "lines of a closed contour (line, polyline, polygon, slot, rounded rect): ISketchManager::CreateLine", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "sketch.arc", what: "arcs of a closed contour (arc, arc3, tangentArc, slot, rounded rect): ISketchManager::CreateArc", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "sketch.faceOffset", what: "a sketch on a plane offset from a picked face (along its outward normal)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "sketch.line", what: "lines of a closed contour (line, polyline, polygon, slot, rounded rect): ISketchManager::CreateLine", checks: "the Tool Block steps 1-3 and the Q9 L-bracket's polyline, tools/cswa-check.py 2026-10-15", measured: M2026_CSWA },+ OpFact { id: "sketch.arc", what: "arcs of a closed contour (arc, arc3, tangentArc, slot, rounded rect): ISketchManager::CreateArc", checks: "the Tool Block steps 1-3 (tangentArc R19, arc3 R29 and R5), tools/cswa-check.py 2026-10-15", measured: M2026_CSWA },+ OpFact { id: "sketch.faceOffset", what: "a sketch on a plane offset from a picked face (along its outward normal)", checks: "the Tool Block step 3's R41 slot, 12 inside the back face, tools/cswa-check.py 2026-10-15", measured: M2026_CSWA }, OpFact { id: "mirror.features.faceOffset", what: "features mirrored about a plane offset from a face", checks: "not run live (0.11.0)", measured: UNMEASURED }, OpFact { id: "mirror.bodies.faceOffset", what: "every body mirrored about a plane offset from a face", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "sketch.construction", what: "construction geometry (CreateCenterLine; arcs with ConstructionGeometry)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "sketch.construction", what: "construction geometry (CreateCenterLine; arcs with ConstructionGeometry)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-09 within 0.1 % of its key", measured: M2026_RC1 }, OpFact { id: "extrude.upToNext", what: "a boss up to the next face (swEndCondUpToNext 11)", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "extrude.upToSurface", what: "a boss up to a picked face (swEndCondUpToSelection 10, the face at mark 1)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "extrude.upToSurface", what: "a boss up to a picked face (swEndCondUpToSurface 4, the face at mark 1)", checks: "CAUGHT 2026-10-16 (canary 0.11.4-rc1, cswa-12): with swEndCondUpToSelection 10 the boss stopped at the NEXT face (3392.9 mm3 short); now 4, the macro recorder's id, with a read-back of the stored end condition; not yet run live", measured: UNMEASURED }, OpFact { id: "extrude.offsetFromSurface", what: "a boss to a distance from a picked face (swEndCondOffsetFromSurface 5)", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "extrude.draft", what: "a boss with draft (Dchk1/Ddir1/Dang1)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "extrude.draft", what: "a boss with draft (Dchk1/Ddir1/Dang1; Ddir1 TRUE = outward, measured)", checks: "CAUGHT 2026-10-16 (canary 0.11.4-rc1, cswa-12): Ddir1 as the help reads it widened the 5 deg boss; the flag is now passed as SOLIDWORKS measured it; not yet run live", measured: UNMEASURED }, OpFact { id: "cut.upToNext", what: "a cut up to the next face", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "cut.upToSurface", what: "a cut up to a picked face", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "cut.offsetFromSurface", what: "a cut to a distance from a picked face", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "cut.draft", what: "a cut with draft (a countersink is one)", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "revolve.360", what: "a full revolve about a line of the sketch (FeatureRevolve2)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "cut.upToSurface", what: "a cut up to a picked face (swEndCondUpToSurface 4, the face at mark 1)", checks: "CAUGHT 2026-10-16 (canary 0.11.4-rc1, cswa-12): with 10 the cut went one plate deep instead of to the face (1005.3 mm3 short); now 4; not yet run live", measured: UNMEASURED },+ OpFact { id: "cut.offsetFromSurface", what: "a cut to a distance from a picked face", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-08 within 0.1 % of its key", measured: M2026_RC1 },+ OpFact { id: "cut.draft", what: "a cut with draft (a countersink is one; Ddir1 TRUE = outward, measured)", checks: "CAUGHT 2026-10-16 (canary 0.11.4-rc1, cswa-11): the 45 deg countersink cut widened into the outward frustum, 804.25 mm3 more than the inward one; fixed with the boss; not yet run live", measured: UNMEASURED },+ OpFact { id: "revolve.360", what: "a full revolve about a line of the sketch (FeatureRevolve2)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-09 within 0.1 % of its key", measured: M2026_RC1 }, OpFact { id: "revolve.angle", what: "a revolve through less than 360°", checks: "not run live (0.11.0)", measured: UNMEASURED }, OpFact { id: "revolve.midPlane", what: "a revolve symmetric about the sketch plane", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "revolve_cut.360", what: "a full revolve-cut (FeatureRevolve2 with IsCut)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "revolve_cut.360", what: "a full revolve-cut (FeatureRevolve2 with IsCut)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-09 within 0.1 % of its key", measured: M2026_RC1 }, OpFact { id: "revolve_cut.angle", what: "a revolve-cut through less than 360°", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "revolve_cut.midPlane", what: "a revolve-cut symmetric about the sketch plane", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "mirror.features.plane", what: "features mirrored about a named plane (InsertMirrorFeature2, features mark 1, plane mark 2)", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "mirror.features.offset", what: "features mirrored about an offset plane", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "revolve_cut.midPlane", what: "a revolve-cut symmetric about the sketch plane", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-09 within 0.1 % of its key", measured: M2026_RC1 },+ OpFact { id: "mirror.features.plane", what: "features mirrored about a named plane (InsertMirrorFeature2, features mark 1, plane mark 2)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-10 within 0.1 % of its key", measured: M2026_RC1 },+ OpFact { id: "mirror.features.offset", what: "features mirrored about an offset plane", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-10 within 0.1 % of its key", measured: M2026_RC1 }, OpFact { id: "mirror.features.face", what: "features mirrored about a planar face", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "mirror.bodies.plane", what: "every body mirrored about a named plane (BMirrorBody, bodies mark 256)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "mirror.bodies.plane", what: "every body mirrored about a named plane (BMirrorBody, bodies mark 256)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-10 within 0.1 % of its key", measured: M2026_RC1 }, OpFact { id: "mirror.bodies.offset", what: "every body mirrored about an offset plane", checks: "not run live (0.11.0)", measured: UNMEASURED }, OpFact { id: "mirror.bodies.face", what: "every body mirrored about a planar face", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "hole.simple", what: "a plain hole: a circle on the face's plane, cut blind or through all", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "hole.simple", what: "a plain hole: a circle on the face's plane, cut blind or through all", checks: "3dengr Q6 and Q8 (Ø20, Ø30 through all) and the Tool Block step 3's Ø11, tools/cswa-check.py 2026-10-15", measured: M2026_CSWA }, OpFact { id: "hole.counterbore", what: "a counterbored hole (two cuts)", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "hole.countersink", what: "a countersunk hole (a drafted cut, then the hole)", checks: "not run live (0.11.0)", measured: UNMEASURED },- OpFact { id: "set_material.density", what: "a density in kg/m³ (the document's own, or checked against the material's)", checks: "not run live (0.11.0)", measured: UNMEASURED },+ OpFact { id: "hole.countersink", what: "a countersunk hole (a drafted cut, then the hole)", checks: "CAUGHT 2026-10-16 (canary 0.11.4-rc1, cswa-11): its cone opened downward (the draft flag); the hole and the counterbore beside it were right; not yet run live", measured: UNMEASURED },+ OpFact { id: "set_material.density", what: "a density in kg/m³ (the document's own, or checked against the material's)", checks: "every CSWA part (1020, 2700, 7900 kg/m³ read back), tools/cswa-check.py 2026-10-15", measured: M2026_CSWA },+ // ── 0.11.4: Offset Entities, sketch regions, and the through-all cut+ // the community plate exercises: built and simulated, NOT YET RUN LIVE ──+ OpFact { id: "sketch.offsetEntities.outer", what: "a face's OUTER loop offset into the sketch: its edges selected, IModelDoc2::SketchOffsetEntities2 (side checked, redone the other way if SOLIDWORKS put it outside)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-08 within 0.1 % of its key", measured: M2026_RC1 },+ OpFact { id: "sketch.offsetEntities.face", what: "every loop of a face offset into the sketch: the face selected, IModelDoc2::SketchOffsetEntities2", checks: "not run live (0.11.4)", measured: UNMEASURED },+ OpFact { id: "extrude.regions", what: "a boss of selected sketch regions (EnableContourSelection, SelectByID2 \"SKETCHREGION\" at mark 4)", checks: "not run live (0.11.4)", measured: UNMEASURED },+ OpFact { id: "cut.regions", what: "a cut of selected sketch regions (EnableContourSelection, SelectByID2 \"SKETCHREGION\" at mark 4)", checks: "tools/cswa-check.py 2026-10-16 (canary 0.11.4-rc1): cswa-08 within 0.1 % of its key", measured: M2026_RC1 },+ OpFact { id: "cut.one.throughAll", what: "a cut through all, the default direction (into a face)", checks: "not run live (0.11.4)", measured: UNMEASURED }, OpFact { id: "titles.hiddenExtensions", what: "documents addressed by title while Windows hides known extensions: swx_new_document reads back 'Part1-…' (no .SLDPRT); swx_design_info and swx_get_parameters by the reported title, the stem and stem+.SLDPRT; swx_set_parameter, swx_export_step, swx_save and swx_close_doc by the stem; nothing left open", checks: "the focused HideFileExt test, 2026-10-15 22:38-22:41Z", measured: M2026_HIDEEXT }, OpFact { id: "save_as", what: "save_as as a script step", checks: "not in the live battery (swx_save_as, the verb, is)", measured: UNMEASURED }, OpFact { id: "rebuild", what: "rebuild as a script step", checks: "not in the live battery", measured: UNMEASURED },@@ -313,7 +336,7 @@ pub fn op_variants(op: &crate::script::Op, result: &serde_json::Value) -> Vec<St Op::NewAssembly { visible: true } => v.push("new_assembly".into()), Op::NewAssembly { visible: false } => v.push("new_assembly.invisible".into()), Op::ClearPart => v.push("clear_part".into()),- Op::Sketch { plane, entities, .. } => {+ Op::Sketch { plane, entities, offsets, .. } => { v.push(match plane { PlaneRef::Named(n) => format!("sketch.plane.{}", plane_key(n)), PlaneRef::Offset { from, offset } => match plane_key(from) {@@ -335,7 +358,7 @@ pub fn op_variants(op: &crate::script::Op, result: &serde_json::Value) -> Vec<St if entities.iter().any(|e| matches!(e, crate::script::Entity::Circle { .. })) { v.push("sketch.circle".into()); }- if entities.len() > 1 {+ if entities.len() + offsets.len() > 1 { v.push("sketch.multiProfile".into()); } if entities.iter().any(|e| matches!(e, crate::script::Entity::Line { construction: false, .. })) {@@ -347,6 +370,13 @@ pub fn op_variants(op: &crate::script::Op, result: &serde_json::Value) -> Vec<St if entities.iter().any(|e| e.is_construction()) { v.push("sketch.construction".into()); }+ // Offset Entities (0.11.4): by what was SELECTED for SOLIDWORKS —+ // the outer loop's edges, or the face.+ for loops in [crate::script::OffsetLoops::Outer, crate::script::OffsetLoops::All] {+ if offsets.iter().any(|o| o.loops == loops) {+ v.push(if loops == crate::script::OffsetLoops::Outer { "sketch.offsetEntities.outer" } else { "sketch.offsetEntities.face" }.into());+ }+ } } Op::Extrude(e) | Op::Cut(e) => { let kind = if matches!(op, Op::Cut(_)) { "cut" } else { "extrude" };@@ -374,6 +404,9 @@ pub fn op_variants(op: &crate::script::Op, result: &serde_json::Value) -> Vec<St if e.draft.is_some() { v.push(format!("{kind}.draft")); }+ if !e.regions.is_empty() {+ v.push(format!("{kind}.regions"));+ } } Op::Fillet { edges, .. } | Op::Chamfer { edges, .. } => { let kind = if matches!(op, Op::Fillet { .. }) { "fillet" } else { "chamfer" };@@ -598,7 +631,45 @@ mod tests { "fillet.allOfFeature", "fillet.FeatureFillet3", "chamfer.atPoints", "shell.inward", "linear_pattern.x", "circular_pattern.y", "set_prop", "select.multiSelectTyped", ] {- assert_eq!(op_fact(id).map(|f| f.measured), Some(M2026_2021), "{id} was measured on 2026, and on 2021 by the community run");+ let m = op_fact(id).map(|f| f.measured).unwrap_or_default();+ assert!(m.starts_with(M2026_2021), "{id} was measured on 2026, and on 2021 by the community run: {m:?}");+ }+ // THE FIRST LIVE CSWA RUN (2026-10-15, bridge 0.11.2): EXACTLY the+ // variants its eight scripts used (tools/cswa/reports/cswa-2026-10-15-+ // sw2026-0.11.2.json, every step's proven.variants), and nothing else.+ assert_eq!(+ LIVE_2026_10_15_CSWA.to_json(),+ serde_json::json!({"solidworks": 2026, "major": 34, "edition": "connected", "date": "2026-10-15", "bridge": "0.11.2", "by": "adom"})+ );+ let mut by_cswa: Vec<&str> = OP_FACTS.iter().filter(|f| f.measured.contains(&LIVE_2026_10_15_CSWA) && f.checks.contains("tools/cswa-check.py 2026-10-15")).map(|f| f.id).collect();+ by_cswa.sort_unstable();+ assert_eq!(+ by_cswa,+ [+ "clear_part", "cut.one", "cut.one.reversed", "extrude.one", "hole.simple", "select.multiSelectTyped", "set_material",+ "set_material.density", "sketch.arc", "sketch.circle", "sketch.face.front.positive", "sketch.faceOffset", "sketch.line",+ "sketch.multiProfile", "sketch.offset.top.positive", "sketch.plane.front", "sketch.plane.top", "sketch.rect",+ ]+ );+ // THE FIRST CANARY (2026-10-16, 0.11.4-rc1): EXACTLY the variants its+ // twelve PASSING parts exercised and nothing had measured before (the+ // report in scratch, cswa-00..10 pass; 11 and 12 caught two bugs).+ let mut by_rc1: Vec<&str> = OP_FACTS.iter().filter(|f| f.measured.contains(&LIVE_2026_10_16_RC1)).map(|f| f.id).collect();+ by_rc1.sort_unstable();+ assert_eq!(+ by_rc1,+ [+ "cut.offsetFromSurface", "cut.regions", "mirror.bodies.plane", "mirror.features.offset", "mirror.features.plane",+ "revolve.360", "revolve_cut.360", "revolve_cut.midPlane", "sketch.construction", "sketch.offsetEntities.outer",+ ]+ );+ // ...and the five it caught stay unmeasured, saying so, until a run proves the fix.+ for id in ["extrude.upToSurface", "cut.upToSurface", "extrude.draft", "cut.draft", "hole.countersink"] {+ let f = op_fact(id).unwrap();+ assert!(f.measured.is_empty() && f.checks.starts_with("CAUGHT 2026-10-16"), "{id}: {:?} / {}", f.measured, f.checks);+ }+ for id in ["sketch.line", "sketch.arc", "sketch.faceOffset", "hole.simple", "set_material.density", "sketch.face.front.positive"] {+ assert_eq!(op_fact(id).map(|f| f.measured), Some(M2026_CSWA), "{id}: first measured by the CSWA run"); } // 2021 (0.10.10): Michael's community run, and EXACTLY the facts its // selftest checks (T01-T22, T24-T32) measured — plus new_part and the@@ -628,9 +699,18 @@ mod tests { // ...and EXACTLY what is not: its "not yet measured" list (throughAll+both // on a boss, the ladder's later rungs, the CreateDefinition fillet) plus // the variants no live check built — a reversed boss among them.- let mut unmeasured: Vec<&str> =- OP_FACTS.iter().filter(|f| f.measured.is_empty() && f.checks != "not run live (0.11.0)").map(|f| f.id).collect();+ let mut unmeasured: Vec<&str> = OP_FACTS+ .iter()+ .filter(|f| f.measured.is_empty() && f.checks != "not run live (0.11.0)" && f.checks != "not run live (0.11.4)")+ .map(|f| f.id)+ .collect(); unmeasured.sort_unstable();+ // 0.11.4's, still unrun after the first canary (it measured cut.regions and the+ // outer-loop Offset Entities through cswa-08; the through-all cut ran only in cswa-11).+ let mut new_0114: Vec<&str> = OP_FACTS.iter().filter(|f| f.checks == "not run live (0.11.4)").map(|f| f.id).collect();+ assert!(OP_FACTS.iter().filter(|f| f.checks == "not run live (0.11.4)").all(|f| f.measured.is_empty()));+ new_0114.sort_unstable();+ assert_eq!(new_0114, ["cut.one.throughAll", "extrude.regions", "sketch.offsetEntities.face"]); // 0.11.0's CSWA ops: every one of them NOT YET RUN LIVE, and listed. let mut new_ops: Vec<&str> = OP_FACTS.iter().filter(|f| f.checks == "not run live (0.11.0)").map(|f| f.id).collect(); assert!(OP_FACTS.iter().filter(|f| f.checks == "not run live (0.11.0)").all(|f| f.measured.is_empty()));@@ -638,21 +718,20 @@ mod tests { assert_eq!( new_ops, [- "cut.draft", "cut.offsetFromSurface", "cut.upToNext", "cut.upToSurface", "extrude.draft", "extrude.offsetFromSurface",- "extrude.upToNext", "extrude.upToSurface", "hole.counterbore", "hole.countersink", "hole.simple", "mirror.bodies.face",- "mirror.bodies.faceOffset", "mirror.bodies.offset", "mirror.bodies.plane", "mirror.features.face",- "mirror.features.faceOffset", "mirror.features.offset", "mirror.features.plane",- "revolve.360", "revolve.angle", "revolve.midPlane", "revolve_cut.360", "revolve_cut.angle", "revolve_cut.midPlane",- "set_material.density", "sketch.arc", "sketch.construction", "sketch.faceOffset", "sketch.line",+ // (the 2026-10-16 canary measured eight of 0.11.0's and caught five; see by_rc1 below)+ "cut.upToNext", "extrude.offsetFromSurface", "extrude.upToNext", "hole.counterbore", "mirror.bodies.face",+ "mirror.bodies.faceOffset", "mirror.bodies.offset", "mirror.features.face", "mirror.features.faceOffset",+ "revolve.angle", "revolve.midPlane", "revolve_cut.angle", ] ); assert_eq!( unmeasured, [- "chamfer.allOfFeature", "extrude.both.throughAll", "fillet.createDefinition", "new_assembly",+ "chamfer.allOfFeature", "cut.draft", "cut.upToSurface", "extrude.both.throughAll", "extrude.draft",+ "extrude.upToSurface", "fillet.createDefinition", "hole.countersink", "new_assembly", "new_assembly.invisible", "new_part.invisible", "rebuild", "save_as", "select.entitySelect4", "select.selectByIdAtPoint", "select.selectByRay", "set_appearance.body",- "sketch.face.front.positive", "sketch.face.right.negative", "sketch.offset.front.negative",+ "sketch.face.right.negative", "sketch.offset.front.negative", "sketch.offset.named", "sketch.offset.right.negative", "sketch.offset.right.positive", "sketch.plane.named", "zoom_fit", ]@@ -725,13 +804,42 @@ mod tests { assert_eq!(ids(&o[16], serde_json::json!({"appearanceReapplied": [{"target": "Part"}]})), ["set_material", "set_material.reappliesAppearance"]); } + /// 0.11.4: an offset is classified by what was SELECTED for SOLIDWORKS (the+ /// outer loop's edges, or the face); a region pick is its own variant, on+ /// top of the end condition; an offset and a circle are two profiles.+ #[test]+ fn offsets_and_regions_are_their_own_variants() {+ let o = ops(serde_json::json!([+ {"op": "sketch", "plane": "Front Plane", "entities": [+ {"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 10]}, "offsetMm": -1}},+ {"circle": {"radiusMm": 4}}]},+ {"op": "cut", "regionsAtMm": [[1, 1]], "offsetFromSurface": {"face": {"atPointMm": [0, 0, 0]}, "distanceMm": 2}},+ {"op": "sketch", "plane": "Front Plane", "entities": [{"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 10]}, "offsetMm": 1, "loops": "all"}}]},+ {"op": "extrude", "depthMm": 2, "regionAtMm": [1, 1]},+ {"op": "sketch_rect", "plane": "Front Plane", "widthMm": 2, "heightMm": 2},+ {"op": "cut", "throughAll": true}+ ]));+ assert_eq!(ids(&o[0], serde_json::json!({})), ["sketch.plane.front", "sketch.circle", "sketch.multiProfile", "sketch.offsetEntities.outer"]);+ assert_eq!(ids(&o[1], serde_json::json!({})), ["cut.offsetFromSurface", "cut.regions"]);+ assert_eq!(ids(&o[2], serde_json::json!({})), ["sketch.plane.front", "sketch.offsetEntities.face"], "one offset alone is one profile");+ assert_eq!(ids(&o[3], serde_json::json!({})), ["extrude.one", "extrude.regions"]);+ assert_eq!(ids(&o[5], serde_json::json!({"dir": {"value": false}})), ["cut.one.throughAll"]);+ // The canary of 2026-10-16 measured the offset cut and its regions (cswa-08); a step+ // using the unrun ones (a boss of regions) is live:false and names it.+ let p = proof(&ids(&o[1], serde_json::json!({})), Some(34));+ assert_eq!(p["live"], true, "{p}");+ let p = proof(&ids(&o[3], serde_json::json!({})), Some(34));+ assert_eq!(p["live"], false);+ assert_eq!(p["unmeasured"].as_array().map(|a| a.len()), Some(1), "{p}");+ }+ #[test] fn proven_is_live_only_where_every_variant_was_measured_on_this_release() { let v = |ids: &[&str]| ids.iter().map(|s| s.to_string()).collect::<Vec<_>>(); // The coordinator's shape, on SOLIDWORKS 2026. let p = proof(&v(&["sketch.face.top.positive", "sketch.circle", "select.multiSelectTyped"]), Some(34)); assert_eq!(p["live"], true);- assert_eq!(p["measuredOn"], serde_json::json!([LIVE_2026_10_14.to_json(), LIVE_2021_10_15.to_json()]));+ assert_eq!(p["measuredOn"], serde_json::json!([LIVE_2026_10_14.to_json(), LIVE_2021_10_15.to_json(), LIVE_2026_10_15_CSWA.to_json()])); assert!(p.get("why").is_none() && p.get("unmeasured").is_none()); // ...and on SOLIDWORKS 2021 too, by the community run (0.10.10). assert_eq!(proof(&v(&["sketch.face.top.positive", "sketch.circle"]), Some(29))["live"], true);@@ -739,7 +847,7 @@ mod tests { // elsewhere, not live here. let p = proof(&v(&["sketch.face.right.positive", "sketch.circle"]), Some(29)); assert_eq!(p["live"], false);- assert_eq!(p["measuredOn"].as_array().map(|a| a.len()), Some(2));+ assert_eq!(p["measuredOn"], serde_json::json!([LIVE_2026_10_14_B.to_json(), LIVE_2026_10_14.to_json(), LIVE_2026_10_15_CSWA.to_json()])); assert!(p["why"].as_str().unwrap_or("").contains("this is SOLIDWORKS 2021"), "{p}"); // A version that could not be read is never live. assert_eq!(proof(&v(&["new_part"]), None)["live"], false);@@ -749,10 +857,10 @@ mod tests { assert_eq!(p["measuredOn"], serde_json::json!([])); assert_eq!(p["unmeasured"][0]["variant"], "fillet.createDefinition"); // Variants measured in DIFFERENT runs on the same release cover the step,- // and both runs are listed.+ // and every run is listed (0.10.4's, 0.10.3's, and the CSWA run's). let p = proof(&v(&["sketch.face.right.positive", "sketch.circle", "select.multiSelectTyped"]), Some(34)); assert_eq!(p["live"], true, "{p}");- assert_eq!(p["measuredOn"], serde_json::json!([LIVE_2026_10_14_B.to_json(), LIVE_2026_10_14.to_json()]));+ assert_eq!(p["measuredOn"], serde_json::json!([LIVE_2026_10_14_B.to_json(), LIVE_2026_10_14.to_json(), LIVE_2026_10_15_CSWA.to_json()])); // A variant the table does not know has never been built live. let p = proof(&v(&["linear_pattern.x+y"]), Some(34)); assert_eq!(p["live"], false);
src/cswa.rs+158−4@@ -27,6 +27,11 @@ pub const SPECS: &[(&str, &str)] = &[ ("cswa-06-tool-block-step2.json", include_str!("../resources/cswa/cswa-06-tool-block-step2.json")), ("cswa-07-tool-block-step3.json", include_str!("../resources/cswa/cswa-07-tool-block-step3.json")), ("cswa-08-tool-block-step4.json", include_str!("../resources/cswa/cswa-08-tool-block-step4.json")),+ ("cswa-08b-tool-block-step4-explicit.json", include_str!("../resources/cswa/cswa-08b-tool-block-step4-explicit.json")),+ ("cswa-09-community-stepped-shaft.json", include_str!("../resources/cswa/cswa-09-community-stepped-shaft.json")),+ ("cswa-10-community-mirrored-block.json", include_str!("../resources/cswa/cswa-10-community-mirrored-block.json")),+ ("cswa-11-community-slotted-plate.json", include_str!("../resources/cswa/cswa-11-community-slotted-plate.json")),+ ("cswa-12-community-up-to-plates.json", include_str!("../resources/cswa/cswa-12-community-up-to-plates.json")), ]; // ── SPEC VARIABLES (0.11.0) ────────────────────────────────────────────────@@ -187,13 +192,27 @@ fn resolve_extends(v: &Value, all: &[Value], depth: usize) -> Result<Value, Stri } } if let (Value::Object(m), Value::Object(o)) = (&mut merged, v) {+ // What is TRUE OF THE BASE PART ONLY is not inherited: the ops it+ // lacked, the derivation of ITS key, why IT is skipped in the simulator. m.remove("needsOps");+ m.remove("derivation");+ m.remove("simulatorSkips"); for (k, x) in o { if k != "extends" && k != "variables" && k != "scriptAppend" && k != "derivedAppend" { m.insert(k.clone(), x.clone()); } } m.insert("variables".into(), vars);+ // A derivedAppend name the base already derives would SHADOW it — and+ // every "=name" in the base's script would silently take the new value+ // (0.11.4: Step 4's tangent point `tpx` redrew Step 1's R5 fillet).+ // Refused: an appended value gets a name of its own.+ if let (Some(Value::Array(extra)), Some(Value::Array(base))) = (o.get("derivedAppend"), m.get("derived")) {+ let taken: Vec<&str> = base.iter().filter_map(|p| p.get(0).and_then(|n| n.as_str())).collect();+ if let Some(clash) = extra.iter().filter_map(|p| p.get(0).and_then(|n| n.as_str())).find(|n| taken.contains(n)) {+ return Err(format!("{id}: derivedAppend redefines {clash:?}, which {base_id} already derives — name it differently"));+ }+ } // More steps after the base part's (the Tool Block's Steps 3 and 4 // cut the Step 2 part), and more derived values for them. for (key, into) in [("scriptAppend", "script"), ("derivedAppend", "derived")] {@@ -275,6 +294,16 @@ pub struct Spec { /// Ops the part needs that the bridge does not have yet: the part is /// SKIPPED (and said so), never half-built. pub needs_ops: Vec<String>,+ /// Why the SIMULATOR cannot build this part (0.11.4) — e.g. Offset+ /// Entities needs SOLIDWORKS' own face outline. Skipped there, said so;+ /// run live as any other part.+ pub simulator_skips: Option<String>,+ /// HOW A DERIVED KEY IS REPRODUCED (0.11.4): `[name, Python expression]`+ /// pairs evaluated in order (math's functions, the spec's variables and+ /// derived values in scope); `massG`, and `volumeMm3` / `centerOfMassMm`+ /// where the key has them, must come out as the key says.+ /// `tools/cswa-check.py --derivations` checks every one.+ pub derivation: Vec<(String, String)>, } pub fn parse_spec(v: &Value) -> Result<Spec, String> {@@ -302,6 +331,12 @@ pub fn parse_spec(v: &Value) -> Result<Spec, String> { }; let script = v.get("script").cloned().ok_or_else(|| format!("{id}: script is required"))?; let needs_ops: Vec<String> = v.get("needsOps").and_then(|n| n.as_array()).map(|a| a.iter().filter_map(|x| x.as_str().map(String::from)).collect()).unwrap_or_default();+ let simulator_skips = match v.get("simulatorSkips") {+ None | Some(Value::Null) => None,+ Some(Value::String(why)) if !why.trim().is_empty() => Some(why.clone()),+ Some(_) => return Err(format!("{id}: simulatorSkips is the reason the simulator cannot build the part (a sentence)")),+ };+ let derivation = derivation_pairs(v).map_err(|m| format!("{id}: {m}"))?; if needs_ops.is_empty() { // A runnable spec must PARSE: a typo is caught here, not on a live run. crate::script::parse(&script).map_err(|m| format!("{id}: its script does not parse: {m}"))?;@@ -318,10 +353,36 @@ pub fn parse_spec(v: &Value) -> Result<Spec, String> { tol_pct, script, needs_ops,+ simulator_skips,+ derivation, id, }) } +/// `derivation`: a list of `[name, expression]` pairs; a name is an+/// identifier (it becomes a Python variable), the last ones the key's+/// quantities.+fn derivation_pairs(v: &Value) -> Result<Vec<(String, String)>, String> {+ let Some(d) = v.get("derivation").filter(|d| !d.is_null()) else { return Ok(Vec::new()) };+ let bad = || "derivation is a list of [name, Python expression] pairs".to_string();+ let mut out = Vec::new();+ for pair in d.as_array().ok_or_else(bad)? {+ match pair.as_array().map(|a| a.as_slice()) {+ Some([Value::String(n), Value::String(e)])+ if !n.is_empty() && n.chars().next().map(|c| c.is_ascii_alphabetic() || c == '_').unwrap_or(false)+ && n.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') && !e.trim().is_empty() =>+ {+ out.push((n.clone(), e.clone()))+ }+ _ => return Err(bad()),+ }+ }+ if !out.iter().any(|(n, _)| n == "massG") {+ return Err("a derivation must end in massG (the key)".into());+ }+ Ok(out)+}+ /// Every shipped spec, parsed. pub fn specs() -> Vec<Result<Spec, String>> { let raw: Vec<Result<Value, String>> = SPECS.iter().map(|(name, text)| serde_json::from_str::<Value>(text).map_err(|e| format!("{name}: {e}"))).collect();@@ -387,11 +448,20 @@ pub fn compare(spec: &Spec, mp: &Value) -> (bool, Value) { (pass, Value::Array(checks)) } -/// The one-line verdict: "N of M CSWA parts within tolerance".-pub fn summary(passed: usize, ran: usize, skipped: usize) -> String {+/// The one-line verdict: "N of M CSWA parts within tolerance", and what was+/// skipped and why — parts needing ops the bridge lacks, and (in the+/// simulator) parts only SOLIDWORKS can build.+pub fn summary(passed: usize, ran: usize, skipped: usize, simulator_only: usize) -> String { let mut s = format!("{passed} of {ran} CSWA parts within tolerance");+ let mut why = Vec::new(); if skipped > 0 {- s.push_str(&format!(" ({skipped} skipped: they need ops the bridge does not have yet)"));+ why.push(format!("{skipped} skipped: they need ops the bridge does not have yet"));+ }+ if simulator_only > 0 {+ why.push(format!("{simulator_only} skipped in the simulator: only SOLIDWORKS can build them"));+ }+ if !why.is_empty() {+ s.push_str(&format!(" ({})", why.join("; "))); } s }@@ -472,6 +542,34 @@ mod tests { } } + #[test]+ fn an_appended_derived_value_may_not_shadow_the_base_s() {+ let base = json!({"id": "b", "expected": {"massG": 1}, "variables": {"A": 2}, "derived": [["k", "A*2"]],+ "script": [{"op": "new_part"}, {"op": "sketch_rect", "widthMm": "=k", "heightMm": 1}]});+ let child = json!({"id": "c", "extends": "b", "derivedAppend": [["k", "A*3"]], "scriptAppend": []});+ let all = vec![base.clone(), child.clone()];+ let e = expand(&child, &all).unwrap_err();+ assert!(e.contains("redefines \"k\"") && e.contains("b already derives"), "{e}");+ // ...a new name is fine, and the base's script keeps its value.+ let ok = json!({"id": "c", "extends": "b", "derivedAppend": [["k2", "A*3"]], "scriptAppend": [{"op": "sketch_rect", "widthMm": "=k2", "heightMm": 1}]});+ let all = vec![base, ok.clone()];+ let x = expand(&ok, &all).unwrap();+ assert_eq!(x["script"][1]["widthMm"], 4.0);+ assert_eq!(x["script"][2]["widthMm"], 6.0);+ // The Python twin refuses it too.+ let dir = std::env::temp_dir().join(format!("swx-cswa-shadow-{}", std::process::id()));+ let _ = std::fs::remove_dir_all(&dir);+ std::fs::create_dir_all(dir.join("resources/cswa")).unwrap();+ std::fs::create_dir_all(dir.join("tools")).unwrap();+ std::fs::copy(std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tools/cswa-check.py"), dir.join("tools/cswa-check.py")).unwrap();+ std::fs::write(dir.join("resources/cswa/b.json"), json!({"id": "b", "expected": {"massG": 1}, "variables": {"A": 2}, "derived": [["k", "A*2"]], "script": []}).to_string()).unwrap();+ std::fs::write(dir.join("resources/cswa/c.json"), json!({"id": "c", "extends": "b", "derivedAppend": [["k", "A*3"]]}).to_string()).unwrap();+ if let Ok(o) = std::process::Command::new("python3").arg(dir.join("tools/cswa-check.py")).arg("--expand-only").output() {+ assert!(!o.status.success() && String::from_utf8_lossy(&o.stderr).contains("redefines 'k'"), "{}", String::from_utf8_lossy(&o.stderr));+ }+ let _ = std::fs::remove_dir_all(&dir);+ }+ #[test] fn a_reply_is_compared_within_the_tolerance() { let spec = parse_spec(&json!({"id": "t", "expected": {"massG": 100.0, "volumeMm3": 1000.0, "centerOfMassMm": [10.0, 0.0, -5.0], "surfaceAreaMm2": 500.0},@@ -492,7 +590,10 @@ mod tests { let col = json!({"massG": 100.0, "volumeMm3": 1000.0, "simulated": "mock", "simulatedBy": {"volume": "column integration"}, "centerOfMassMm": [0, 0, 0], "surfaceAreaMm2": 1.0}); assert!(!compare(&spec, &col).0, "a wrong centre of mass from the column model fails"); assert!(!compare(&spec, &json!({})).0, "nothing measured is not a pass");- assert_eq!(summary(3, 4, 1), "3 of 4 CSWA parts within tolerance (1 skipped: they need ops the bridge does not have yet)");+ assert_eq!(summary(3, 4, 1, 0), "3 of 4 CSWA parts within tolerance (1 skipped: they need ops the bridge does not have yet)");+ assert_eq!(summary(4, 4, 0, 1), "4 of 4 CSWA parts within tolerance (1 skipped in the simulator: only SOLIDWORKS can build them)");+ assert_eq!(summary(2, 2, 1, 2), "2 of 2 CSWA parts within tolerance (1 skipped: they need ops the bridge does not have yet; 2 skipped in the simulator: only SOLIDWORKS can build them)");+ assert_eq!(summary(5, 5, 0, 0), "5 of 5 CSWA parts within tolerance"); } #[test]@@ -503,5 +604,58 @@ mod tests { // A spec that needs a missing op is not parsed as a script: it is skipped. assert!(parse_spec(&json!({"id": "a", "expected": {"massG": 1}, "needsOps": ["loft"], "script": [{"op": "loft"}]})).is_ok()); assert!(parse_spec(&json!({"id": "a", "expected": {"massG": 1, "tolerancePct": 9}, "script": [{"op": "new_part"}]})).unwrap_err().contains("tolerancePct"));+ // A derivation must be [name, expression] pairs and end in the key's mass (0.11.4).+ let with = |d: Value| parse_spec(&json!({"id": "a", "expected": {"massG": 1}, "script": [{"op": "new_part"}], "derivation": d}));+ assert!(with(json!([["V", "1"]])).unwrap_err().contains("must end in massG"));+ assert!(with(json!([["massG"]])).unwrap_err().contains("[name, Python expression]"));+ assert!(with(json!([["1x", "1"], ["massG", "1"]])).unwrap_err().contains("[name, Python expression]"), "a name is an identifier");+ assert!(with(json!({"massG": "1"})).unwrap_err().contains("[name, Python expression]"));+ assert_eq!(with(json!([["V", "2*3"], ["massG", "V*1e-3"]])).unwrap().derivation, vec![("V".to_string(), "2*3".to_string()), ("massG".to_string(), "V*1e-3".to_string())]);+ assert!(parse_spec(&json!({"id": "a", "expected": {"massG": 1}, "script": [], "simulatorSkips": 3})).unwrap_err().contains("simulatorSkips"));+ }++ /// What is true of the BASE part only — the derivation of ITS key, why IT+ /// is skipped in the simulator, the ops it lacked — is not inherited by a+ /// spec that extends it (0.11.4).+ #[test]+ fn a_spec_that_extends_another_does_not_inherit_its_derivation_or_its_skips() {+ let base = json!({"id": "b", "expected": {"massG": 2}, "script": [{"op": "new_part"}], "derivation": [["massG", "2"]],+ "simulatorSkips": "only SOLIDWORKS", "needsOps": ["loft"]});+ let child = json!({"id": "c", "extends": "b", "expected": {"massG": 3}});+ let all = vec![base, child.clone()];+ let x = expand(&child, &all).unwrap();+ assert!(x.get("derivation").is_none() && x.get("simulatorSkips").is_none() && x.get("needsOps").is_none(), "{x}");+ let s = parse_spec(&x).unwrap();+ assert!(s.derivation.is_empty() && s.simulator_skips.is_none() && s.needs_ops.is_empty());+ // ...while its own are its own.+ let own = json!({"id": "c", "extends": "b", "expected": {"massG": 3}, "simulatorSkips": "mine"});+ let all = vec![all[0].clone(), own.clone()];+ assert_eq!(parse_spec(&expand(&own, &all).unwrap()).unwrap().simulator_skips.as_deref(), Some("mine"));+ }++ /// The Python checker REFUSES a derivation that does not reproduce its+ /// key (0.11.4) — run on a scratch copy holding one wrong spec.+ #[test]+ fn a_derivation_that_misses_its_key_is_reported() {+ let dir = std::env::temp_dir().join(format!("swx-cswa-derivation-{}", std::process::id()));+ let _ = std::fs::remove_dir_all(&dir);+ std::fs::create_dir_all(dir.join("resources/cswa")).unwrap();+ std::fs::create_dir_all(dir.join("tools")).unwrap();+ std::fs::copy(std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tools/cswa-check.py"), dir.join("tools/cswa-check.py")).unwrap();+ let spec = |mass: f64, com: Value| json!({"id": "d", "expected": {"massG": mass, "volumeMm3": 1000.0, "centerOfMassMm": com},+ "derivation": [["volumeMm3", "10**3"], ["massG", "volumeMm3*2.7e-3"], ["centerOfMassMm", "[5, 5, 5]"]], "script": []});+ let run = |v: &Value| -> Option<(bool, String)> {+ std::fs::write(dir.join("resources/cswa/d.json"), v.to_string()).unwrap();+ let o = std::process::Command::new("python3").arg(dir.join("tools/cswa-check.py")).arg("--derivations").output().ok()?;+ Some((o.status.success(), String::from_utf8_lossy(&o.stdout).to_string()))+ };+ if let Some((ok, out)) = run(&spec(2.7, json!([5.0, 5.0, 5.0]))) {+ assert!(ok, "the exact key is reproduced: {out}");+ let (ok, out) = run(&spec(2.7001, json!([5.0, 5.0, 5.0]))).unwrap();+ assert!(!ok && out.contains("massG: the derivation gives"), "a mass 1e-4 g off is reported: {out}");+ let (ok, out) = run(&spec(2.7, json!([5.0, 5.0, 5.01]))).unwrap();+ assert!(!ok && out.contains("centerOfMassMm"), "a centre of mass 0.01 mm off is reported: {out}");+ }+ let _ = std::fs::remove_dir_all(&dir); } }
src/modeling.rs+38−2@@ -293,11 +293,33 @@ pub fn dir_flag(sketch_normal: Option<V3>, reference: Option<V3>, reverse: bool) pub fn end_condition_id(u: &crate::script::UpTo) -> i32 { match u { crate::script::UpTo::Next => 11,- crate::script::UpTo::Surface { .. } => 10,+ // swEndCondUpToSurface 4, the id the macro recorder writes, NOT+ // swEndCondUpToSelection 10 (the help's current name for it).+ // MEASURED 2026-10-16 (SOLIDWORKS 2026, canary 0.11.4-rc1, cswa-12):+ // with 10 and the face at mark 1, a boss and a cut both built with an+ // EMPTY direction box and stopped at the NEXT face (the boss 3392.9 mm3+ // short, the cut 1005.3 mm3 short, both exactly one face early);+ // OffsetFromSurface 5 with the same selection went to the face (the+ // pillar at x 68 was right). A forum report says the same of 10+ // (3dswym, "FeatureCut4 Method": the recorder writes 4, 10 leaves the+ // direction box empty).+ crate::script::UpTo::Surface { .. } => 4, crate::script::UpTo::OffsetFrom { .. } => 5, } } +/// The `Ddir1` / `Ddir2` flag `FeatureExtrusion3` and `FeatureCut4` take for a+/// draft. MEASURED 2026-10-16 (SOLIDWORKS 2026, canary 0.11.4-rc1): the flag+/// TRUE made the profile GROW along the extrude - a 5 deg boss widened (cswa-12)+/// and a 45 deg countersink cut widened into exactly the outward frustum, 804.25+/// mm3 more than the inward one (cswa-11, 1273.4 vs 469.1 mm3). The 2024 help+/// for FeatureExtrusion3 says "True for first draft angle to be inward"; its+/// sibling FeatureExtruRefSurface3 says the opposite, and SOLIDWORKS itself+/// did the opposite. So: TRUE = OUTWARD, and the bridge passes `outward` as is.+pub fn draft_outward_flag(d: &crate::script::Draft) -> bool {+ d.outward+}+ /// Why a geometric pick found no single entity. #[derive(Clone, Debug, PartialEq)] pub enum PickError {@@ -767,7 +789,7 @@ mod tests { #[test] fn spans_follow_the_ops_own_direction() {- let e = |depth: f64, depth2: f64, direction: Direction, through_all: bool| Extent { depth, depth2, through_all, reverse: false, direction , up_to: None, draft: None };+ let e = |depth: f64, depth2: f64, direction: Direction, through_all: bool| Extent { depth, depth2, through_all, reverse: false, direction , up_to: None, draft: None, regions: Vec::new() }; assert_eq!(extent_span(0.0, 1.0, &e(5.0, 5.0, Direction::One, false), (0.0, 10.0)), (0.0, 5.0)); assert_eq!(extent_span(0.0, -1.0, &e(5.0, 5.0, Direction::One, false), (0.0, 10.0)), (-5.0, 0.0)); // The audit's T27: a cut on Front Plane (own direction −Z), both 6 / 2.@@ -949,4 +971,18 @@ mod tests { let line = Entity::Line { x0: 1.0, y0: 2.0, x1: 3.0, y1: 4.0, construction: true }; assert_eq!(entity_to_sketch(&front, 0.0, &line, &flip).0, Entity::Line { x0: -1.0, y0: 2.0, x1: -3.0, y1: 4.0, construction: true }); }++ /// MEASURED 2026-10-16 on SOLIDWORKS 2026 (canary 0.11.4-rc1): "up to surface" is+ /// swEndCondUpToSurface 4 (10, the help's UpToSelection, left the direction box+ /// empty and stopped at the next face), and Ddir1 TRUE drafts OUTWARD (the help+ /// says inward; a 5 deg boss and a 45 deg countersink both widened with TRUE).+ #[test]+ fn end_condition_ids_and_the_draft_flag_as_solidworks_measured_them() {+ use crate::script::{Draft, UpTo};+ assert_eq!(end_condition_id(&UpTo::Next), 11);+ assert_eq!(end_condition_id(&UpTo::Surface { point: [0.0, 0.0, 0.0] }), 4, "swEndCondUpToSurface, the macro recorder's id");+ assert_eq!(end_condition_id(&UpTo::OffsetFrom { point: [0.0, 0.0, 0.0], offset: 0.008, reverse_offset: false }), 5);+ assert!(!draft_outward_flag(&Draft { angle: 0.1, outward: false }), "inward (the default, a countersink) = Ddir FALSE");+ assert!(draft_outward_flag(&Draft { angle: 0.1, outward: true }), "outward = Ddir TRUE");+ } }
src/script.rs+213−19@@ -260,12 +260,60 @@ pub struct Extent { /// A taper (0.11.0): `angle` radians from the extrude direction; inward /// (the profile shrinks as it goes) unless `outward`. pub draft: Option<Draft>,+ /// SKETCH REGIONS (0.11.4): extrude only the regions of the sketch that+ /// hold these points ((u, v) metres, the sketch's own coordinates) —+ /// SOLIDWORKS' "Selected Contours", for a sketch whose contours CROSS+ /// (an offset outline and a circle). Empty: the whole sketch.+ pub regions: Vec<[f64; 2]>, } impl Extent { /// A plain blind extent `depth` one way. pub fn blind(depth: f64) -> Extent {- Extent { depth, depth2: depth, through_all: false, reverse: false, direction: Direction::One, up_to: None, draft: None }+ Extent { depth, depth2: depth, through_all: false, reverse: false, direction: Direction::One, up_to: None, draft: None, regions: Vec::new() }+ }+}++/// OFFSET ENTITIES (0.11.4): a model face's edges offset into the sketch by+/// SOLIDWORKS itself (IModelDoc2::SketchOffsetEntities2) — an outline the DSL+/// cannot draw, because it is the MODEL's (the CSWA Tool Block's Step 4+/// pocket: the front face's outline 1 mm in).+#[derive(Debug, Clone, PartialEq)]+pub struct OffsetFace {+ /// A point ON the face (metres), picked geometrically.+ pub point: [f64; 3],+ /// Metres, never 0: NEGATIVE = INWARD (the new outline lies inside the+ /// face), positive = outward. SOLIDWORKS' own sign does not decide the+ /// side (it varies by face): the bridge checks where the new entities+ /// landed and offsets the other way if they landed outside.+ pub offset: f64,+ /// Which of the face's edges.+ pub loops: OffsetLoops,+ /// SketchOffsetEntities2's `Chain`: carry the offset along every edge+ /// contiguous with the selected ones.+ pub chain: bool,+}++/// The edges of a face that Offset Entities takes.+#[derive(Debug, Clone, Copy, PartialEq, Eq)]+pub enum OffsetLoops {+ /// The face's OUTER loop only (its edges selected): holes in the face are+ /// left out of the sketch.+ Outer,+ /// The whole FACE selected: every loop, a hole's edge offset away from+ /// the face's material too.+ All,+}++impl OffsetFace {+ pub fn describe(&self) -> serde_json::Value {+ serde_json::json!({"offsetEntities": {+ "fromFace": {"atPointMm": [self.point[0] / MM, self.point[1] / MM, self.point[2] / MM]},+ "offsetMm": self.offset / MM,+ "side": if self.offset < 0.0 { "inward" } else { "outward" },+ "loops": match self.loops { OffsetLoops::Outer => "outer", OffsetLoops::All => "all" },+ "chain": self.chain,+ }}) } } @@ -373,7 +421,7 @@ pub enum Op { /// profiles in one sketch extrude into rings, walls or hole patterns in ONE /// feature. `shorthand` is the op the caller wrote: "sketch", "sketch_rect" /// or "sketch_circle" (the last two are one-entity shorthands).- Sketch { shorthand: &'static str, plane: PlaneRef, entities: Vec<Entity> },+ Sketch { shorthand: &'static str, plane: PlaneRef, entities: Vec<Entity>, offsets: Vec<OffsetFace> }, /// Extrude the sketch just closed. Extrude(Extent), /// Cut-extrude through the sketch just closed.@@ -797,6 +845,11 @@ fn resolve_axis(ops: &mut [Op], j: usize, r: usize, sketch_step: &Value) -> Resu Op::Revolve(rv) | Op::RevolveCut(rv) => rv.axis_spec.clone(), _ => return Ok(()), };+ if let Op::Sketch { offsets, .. } = &ops[j] {+ if !offsets.is_empty() {+ return Err("a sketch with offsetEntities cannot be revolved: its profile is SOLIDWORKS' own, so no side of an axis can be checked — extrude or cut it".into());+ }+ } let Op::Sketch { entities, .. } = &mut ops[j] else { return Ok(()) }; let line_from = |a: (f64, f64), b: (f64, f64)| Entity::Line { x0: a.0, y0: a.1, x1: b.0, y1: b.1, construction: true }; let span = |ents: &[Entity], a: f64, b: f64| {@@ -1376,6 +1429,57 @@ fn face_point(v: &Value, what: &str) -> Result<[f64; 3], String> { point3(p, &format!("{what}.atPointMm")) } +/// `{"offsetEntities": {"fromFace": {"atPointMm": [x, y, z]}, "offsetMm": -1,+/// "loops": "outer" | "all", "chain": true}}` (0.11.4).+fn offset_entities(v: &Value) -> Result<OffsetFace, String> {+ if !v.is_object() {+ return Err("offsetEntities is {\"fromFace\": {\"atPointMm\": [x, y, z]}, \"offsetMm\": -1 (negative = inward)}".into());+ }+ let from = v.get("fromFace").filter(|f| !f.is_null()).ok_or_else(|| "offsetEntities needs fromFace: {\"atPointMm\": [x, y, z]} (mm, a point ON the face)".to_string())?;+ let point = face_point(from, "fromFace")?;+ let offset = mm(v, "offsetMm", None)?;+ if offset == 0.0 {+ return Err("offsetMm must not be 0 (negative offsets INTO the face, positive away from it)".into());+ }+ if offset.abs() > 1.0 {+ return Err("offsetMm must be within ±1000 mm".into());+ }+ let loops = match v.get("loops").and_then(|l| l.as_str()) {+ None | Some("outer") => OffsetLoops::Outer,+ Some("all") => OffsetLoops::All,+ Some(other) => return Err(format!("loops is \"outer\" (the face's outer loop, the default) or \"all\" (every loop: the face selected), got {other:?}")),+ };+ Ok(OffsetFace { point, offset, loops, chain: flag(v, "chain", true) })+}++/// "entity N …" from `sketch_entities` over the DRAWN entities, renumbered+/// as the caller wrote the list (the offsets taken out of it).+fn renumber_entity(m: &str, written_at: &[usize]) -> String {+ let Some(rest) = m.strip_prefix("entity ") else { return m.to_string() };+ let digits: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect();+ match digits.parse::<usize>().ok().and_then(|n| n.checked_sub(1)).and_then(|k| written_at.get(k)) {+ Some(at) => format!("entity {}{}", at + 1, &rest[digits.len()..]),+ None => m.to_string(),+ }+}++/// `regionsAtMm: [[u, v], ...]` (or one `regionAtMm: [u, v]`): the sketch+/// regions to extrude, by a point inside each (0.11.4).+fn regions(step: &Value) -> Result<Vec<[f64; 2]>, String> {+ let list: Vec<Value> = match (step.get("regionsAtMm").filter(|r| !r.is_null()), step.get("regionAtMm").filter(|r| !r.is_null())) {+ (None, None) => return Ok(Vec::new()),+ (Some(_), Some(_)) => return Err("give regionsAtMm OR regionAtMm, not both".into()),+ (Some(r), None) => r.as_array().filter(|a| !a.is_empty()).cloned().ok_or_else(|| "regionsAtMm must be a non-empty list of [u, v] points (mm, the sketch's coordinates)".to_string())?,+ (None, Some(r)) => vec![r.clone()],+ };+ if list.len() > 32 {+ return Err("at most 32 regions".into());+ }+ list.iter()+ .map(|p| need_pt2(&serde_json::json!({"p": p}), &["p"]).map(|(u, v)| [u, v]).map_err(|_| "each region is a point [u, v] (mm) inside it, in the sketch's coordinates".to_string()))+ .collect()+}+ /// The end condition other than a depth, if one is given. fn up_to(step: &Value) -> Result<Option<UpTo>, String> { let mut found: Vec<UpTo> = Vec::new();@@ -1433,7 +1537,7 @@ fn extent(step: &Value, is_cut: bool) -> Result<Extent, String> { return Err("an up-to end condition goes ONE way (the bridge does not build two-direction up-to extents)".into()); } let depth = if let UpTo::OffsetFrom { offset, .. } = u { offset } else { 0.0 };- return Ok(Extent { depth, depth2: depth, through_all: false, reverse: flag(step, "reverse", false), direction: Direction::One, up_to: Some(u), draft });+ return Ok(Extent { depth, depth2: depth, through_all: false, reverse: flag(step, "reverse", false), direction: Direction::One, up_to: Some(u), draft, regions: regions(step)? }); } let through_all = flag(step, "throughAll", false); let mid = flag(step, "midPlane", false);@@ -1462,7 +1566,7 @@ fn extent(step: &Value, is_cut: bool) -> Result<Extent, String> { Some(_) => positive_mm(step, "depth2Mm")?, None => depth, };- Ok(Extent { depth, depth2, through_all, reverse: flag(step, "reverse", false), direction, up_to: None, draft })+ Ok(Extent { depth, depth2, through_all, reverse: flag(step, "reverse", false), direction, up_to: None, draft, regions: regions(step)? }) } fn edges(step: &Value) -> Result<EdgeSel, String> {@@ -1632,7 +1736,7 @@ pub fn hole_plan( let reverse = !outward_is_normal; let inward = if outward_is_normal { -1.0 } else { 1.0 }; let plane_at = |hh: f64| if hh.abs() < 1e-12 { PlaneRef::Named(base.to_string()) } else { PlaneRef::Offset { from: base.to_string(), offset: hh } };- let sketch = |hh: f64, r: f64| Op::Sketch { shorthand: "sketch", plane: plane_at(hh), entities: vec![Entity::Circle { cx: u, cy: v, r }] };+ let sketch = |hh: f64, r: f64| Op::Sketch { shorthand: "sketch", plane: plane_at(hh), entities: vec![Entity::Circle { cx: u, cy: v, r }], offsets: Vec::new() }; let blind = |t: f64| Extent { reverse, ..Extent::blind(t) }; let mut ops = Vec::new(); let mut start = h;@@ -1673,19 +1777,42 @@ fn parse_step(step: &Value) -> Result<Op, String> { "new_part" => Op::NewPart { visible: visible_arg(step)? }, "new_assembly" => Op::NewAssembly { visible: visible_arg(step)? }, "clear_part" => Op::ClearPart,- "sketch_rect" => Op::Sketch { shorthand: "sketch_rect", plane: plane_ref(step)?, entities: rect_entities(step)? },- "sketch_circle" => Op::Sketch { shorthand: "sketch_circle", plane: plane_ref(step)?, entities: vec![circle(step)?] },+ "sketch_rect" => Op::Sketch { shorthand: "sketch_rect", plane: plane_ref(step)?, entities: rect_entities(step)?, offsets: Vec::new() },+ "sketch_circle" => Op::Sketch { shorthand: "sketch_circle", plane: plane_ref(step)?, entities: vec![circle(step)?], offsets: Vec::new() }, "sketch" => { let list = step.get("entities").and_then(|e| e.as_array()).filter(|a| !a.is_empty())- .ok_or_else(|| format!("sketch needs entities: a non-empty list, each one of {}", ENTITY_KINDS.join(", ")))?;+ .ok_or_else(|| format!("sketch needs entities: a non-empty list, each one of {}, or offsetEntities", ENTITY_KINDS.join(", ")))?; if list.len() > 500 { return Err("a sketch may hold at most 500 entities".into()); }- let (entities, _) = sketch_entities(list)?;- if !entities.iter().any(|e| !e.is_construction()) {+ // OFFSET ENTITIES (0.11.4) are the MODEL's edges, drawn by+ // SOLIDWORKS: kept apart from the entities the bridge draws.+ let mut offsets = Vec::new();+ let mut drawn: Vec<Value> = Vec::new();+ // Where each drawn entity stands in the caller's list, so an error+ // names the entity the caller wrote (offsets are taken out first).+ let mut written_at: Vec<usize> = Vec::new();+ for (i, e) in list.iter().enumerate() {+ match e.get("offsetEntities") {+ Some(o) => offsets.push(offset_entities(o).map_err(|m| format!("entity {} (offsetEntities): {m}", i + 1))?),+ None => {+ drawn.push(e.clone());+ written_at.push(i);+ }+ }+ }+ if offsets.len() > 8 {+ return Err("a sketch may hold at most 8 offsetEntities".into());+ }+ let entities = if drawn.is_empty() {+ Vec::new()+ } else {+ sketch_entities(&drawn).map_err(|m| renumber_entity(&m, &written_at))?.0+ };+ if offsets.is_empty() && !entities.iter().any(|e| !e.is_construction()) { return Err("the sketch has only construction geometry — there is no profile".into()); }- Op::Sketch { shorthand: "sketch", plane: plane_ref(step)?, entities }+ Op::Sketch { shorthand: "sketch", plane: plane_ref(step)?, entities, offsets } } "extrude" => Op::Extrude(extent(step, false)?), "cut" => Op::Cut(extent(step, true)?),@@ -1910,12 +2037,13 @@ mod tests { Op::Sketch { shorthand: "sketch_rect", plane: PlaneRef::Named("Top Plane".into()),- entities: vec![Entity::Rect { x0: 0.0, y0: 0.0, x1: 0.05, y1: 0.03 }]+ entities: vec![Entity::Rect { x0: 0.0, y0: 0.0, x1: 0.05, y1: 0.03 }],+ offsets: vec![] } ); assert_eq!( ops[2],- Op::Extrude(Extent { depth: 0.02, depth2: 0.02, through_all: false, reverse: false, direction: Direction::One , up_to: None, draft: None })+ Op::Extrude(Extent { depth: 0.02, depth2: 0.02, through_all: false, reverse: false, direction: Direction::One , up_to: None, draft: None, regions: Vec::new() }) ); assert_eq!( ops[3],@@ -1934,7 +2062,8 @@ mod tests { Op::Sketch { shorthand: "sketch_circle", plane: PlaneRef::Named("Front Plane".into()),- entities: vec![Entity::Circle { cx: 0.0, cy: 0.0, r: 0.005 }]+ entities: vec![Entity::Circle { cx: 0.0, cy: 0.0, r: 0.005 }],+ offsets: vec![] } ); }@@ -2217,8 +2346,8 @@ mod tests { ])) .unwrap(); assert!(matches!(&ops[0], Op::Sketch { shorthand: "sketch", entities, .. } if entities.len() == 3));- assert_eq!(ops[1], Op::Extrude(Extent { depth: 0.0086, depth2: 0.002, through_all: false, reverse: false, direction: Direction::Both , up_to: None, draft: None }));- assert_eq!(ops[2], Op::Cut(Extent { depth: 0.0, depth2: 0.0, through_all: true, reverse: true, direction: Direction::One , up_to: None, draft: None }));+ assert_eq!(ops[1], Op::Extrude(Extent { depth: 0.0086, depth2: 0.002, through_all: false, reverse: false, direction: Direction::Both , up_to: None, draft: None, regions: Vec::new() }));+ assert_eq!(ops[2], Op::Cut(Extent { depth: 0.0, depth2: 0.0, through_all: true, reverse: true, direction: Direction::One , up_to: None, draft: None, regions: Vec::new() })); assert!(matches!(&ops[3], Op::Cut(e) if e.direction == Direction::MidPlane && near(e.depth, 0.004))); // through all + mid plane is SOLIDWORKS' "Through All - Both" assert!(matches!(&ops[4], Op::Extrude(e) if e.direction == Direction::Both && e.through_all));@@ -2269,6 +2398,71 @@ mod tests { } } + /// OFFSET ENTITIES AND SKETCH REGIONS (0.11.4): parsed, defaulted, and+ /// refused for what would make them meaningless.+ #[test]+ fn offset_entities_and_regions_parse_and_refuse_what_they_must() {+ let ops = parse(&json!([+ {"op": "sketch", "face": {"atPointMm": [70, 10, 44]}, "entities": [+ {"offsetEntities": {"fromFace": {"atPointMm": [70, 10, 44]}, "offsetMm": -1}},+ {"circle": {"centerMm": [72, 28.7], "radiusMm": 42}}]},+ {"op": "cut", "regionsAtMm": [[25, 0], [30, 1]], "offsetFromSurface": {"face": {"atPointMm": [30, 0, 0]}, "distanceMm": 12}},+ {"op": "sketch", "plane": "Top Plane", "entities": [+ {"offsetEntities": {"fromFace": {"atPointMm": [0, 10, 0]}, "offsetMm": 2, "loops": "all", "chain": false}}]},+ {"op": "extrude", "depthMm": 3, "regionAtMm": [1, 2]}+ ]))+ .unwrap();+ let Op::Sketch { entities, offsets, .. } = &ops[0] else { panic!() };+ assert_eq!(entities.len(), 1, "the circle is drawn by the bridge; the offset is not an entity");+ assert_eq!(offsets, &vec![OffsetFace { point: [0.07, 0.01, 0.044], offset: -0.001, loops: OffsetLoops::Outer, chain: true }], "defaults: the outer loop, chained");+ assert_eq!(offsets[0].describe()["offsetEntities"]["side"], "inward");+ let Op::Cut(e) = &ops[1] else { panic!() };+ assert_eq!(e.regions, vec![[0.025, 0.0], [0.03, 0.001]]);+ assert!(matches!(e.up_to, Some(UpTo::OffsetFrom { .. })), "regions go with any end condition");+ let Op::Sketch { entities, offsets, .. } = &ops[2] else { panic!() };+ assert!(entities.is_empty(), "a sketch may hold nothing but an offset");+ assert_eq!((offsets[0].loops, offsets[0].chain, offsets[0].offset), (OffsetLoops::All, false, 0.002));+ assert_eq!(offsets[0].describe()["offsetEntities"]["side"], "outward");+ let Op::Extrude(e) = &ops[3] else { panic!() };+ assert_eq!(e.regions, vec![[0.001, 0.002]], "regionAtMm is one region");+ // Refusals.+ let one = |ent: Value| parse(&json!([{"op": "sketch", "entities": [ent]}])).unwrap_err();+ assert!(one(json!({"offsetEntities": {"offsetMm": -1}})).contains("needs fromFace"));+ assert!(one(json!({"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}, "offsetMm": 0}})).contains("must not be 0"));+ assert!(one(json!({"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}}})).contains("offsetMm"));+ assert!(one(json!({"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}, "offsetMm": -1, "loops": "inner"}})).contains("loops is"));+ assert!(one(json!({"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}, "offsetMm": 2000}})).contains("1000"));+ assert!(one(json!({"offsetEntities": 5})).starts_with("step 1: entity 1 (offsetEntities):"));+ // An entity after an offset is numbered as the caller wrote it.+ let e = parse(&json!([{"op": "sketch", "entities": [+ {"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}, "offsetMm": -1}},+ {"circle": {"radiusMm": 2}},+ {"polyline": {"points": [[0, 0], [10, 0], [10, 10]]}}]}]))+ .unwrap_err();+ assert!(e.starts_with("step 1: entity 3"), "{e}");+ assert_eq!(renumber_entity("entity 2 (polyline): a gap", &[1, 2]), "entity 3 (polyline): a gap");+ assert_eq!(renumber_entity("entity 9: x", &[1]), "entity 9: x", "out of range: as it was");+ assert_eq!(renumber_entity("no entity", &[1]), "no entity");+ let cut = |extra: Value| {+ let mut c = json!({"op": "cut", "depthMm": 1});+ for (k, v) in extra.as_object().unwrap() {+ c[k] = v.clone();+ }+ parse(&json!([{"op": "sketch_rect", "widthMm": 1, "heightMm": 1}, c])).unwrap_err()+ };+ assert!(cut(json!({"regionsAtMm": []})).contains("non-empty"));+ assert!(cut(json!({"regionsAtMm": [[1, 2, 3]]})).contains("[u, v]"));+ assert!(cut(json!({"regionsAtMm": [[1, 2]], "regionAtMm": [1, 2]})).contains("not both"));+ // A sketch whose profile is SOLIDWORKS' own cannot be revolved: no side+ // of an axis can be checked.+ let e = parse(&json!([+ {"op": "sketch", "entities": [{"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}, "offsetMm": -1}}]},+ {"op": "revolve", "axis": "x"}+ ]))+ .unwrap_err();+ assert!(e.contains("cannot be revolved"), "{e}");+ }+ #[test] fn an_open_contour_is_refused_naming_the_gap() { let e = sketch_of(json!([{"polyline": {"points": [[0, 0], [10, 0], [10, 10], [0, 10]]}}])).unwrap_err();@@ -2395,7 +2589,7 @@ mod tests { assert_eq!(e(json!({"op": "extrude", "depthMm": 5, "draftDeg": 3})).unwrap(), Op::Extrude(Extent { draft: Some(Draft { angle: 3f64.to_radians(), outward: false }), ..Extent::blind(0.005) })); assert!(e(json!({"op": "extrude", "depthMm": 5, "draftDeg": 90})).unwrap_err().contains("draftDeg")); assert_eq!(crate::modeling::end_condition_id(&UpTo::Next), 11);- assert_eq!(crate::modeling::end_condition_id(&UpTo::Surface { point: [0.0; 3] }), 10);+ assert_eq!(crate::modeling::end_condition_id(&UpTo::Surface { point: [0.0; 3] }), 4, "swEndCondUpToSurface (measured 2026-10-16; 10 stops at the next face)"); assert_eq!(crate::modeling::end_condition_id(&UpTo::OffsetFrom { point: [0.0; 3], offset: 0.0, reverse_offset: false }), 5); } @@ -2435,13 +2629,13 @@ mod tests { let plan = hole_plan(&top, "Top Plane", 0.02, true, [0.005, 0.02, -0.003], 0.006, None, Some((0.011, 0.004)), None); assert_eq!(plan.iter().map(|o| o.name()).collect::<Vec<_>>(), ["sketch", "cut", "sketch", "cut"]); // Top Plane: sketch +y = model −Z, so model z −3 is sketch v +3.- assert_eq!(plan[0], Op::Sketch { shorthand: "sketch", plane: PlaneRef::Offset { from: "Top Plane".into(), offset: 0.02 }, entities: vec![Entity::Circle { cx: 0.005, cy: 0.003, r: 0.0055 }] });+ assert_eq!(plan[0], Op::Sketch { shorthand: "sketch", plane: PlaneRef::Offset { from: "Top Plane".into(), offset: 0.02 }, entities: vec![Entity::Circle { cx: 0.005, cy: 0.003, r: 0.0055 }], offsets: vec![] }); assert_eq!(plan[1], Op::Cut(Extent::blind(0.004))); assert!(matches!(&plan[2], Op::Sketch { plane: PlaneRef::Offset { offset, .. }, .. } if (offset - 0.016).abs() < 1e-15)); assert_eq!(plan[3], Op::Cut(Extent { through_all: true, ..Extent::blind(0.0) })); // From a face looking down (−normal) at height 0: Top Plane itself, reversed. let plan = hole_plan(&top, "Top Plane", 0.0, false, [0.0; 3], 0.006, Some(0.005), None, Some((0.012, std::f64::consts::FRAC_PI_2)));- assert_eq!(plan[0], Op::Sketch { shorthand: "sketch", plane: PlaneRef::Named("Top Plane".into()), entities: vec![Entity::Circle { cx: 0.0, cy: 0.0, r: 0.006 }] });+ assert_eq!(plan[0], Op::Sketch { shorthand: "sketch", plane: PlaneRef::Named("Top Plane".into()), entities: vec![Entity::Circle { cx: 0.0, cy: 0.0, r: 0.006 }], offsets: vec![] }); let Op::Cut(cs) = &plan[1] else { panic!() }; assert!(cs.reverse && (cs.depth - 0.003).abs() < 1e-15 && cs.draft == Some(Draft { angle: std::f64::consts::FRAC_PI_4, outward: false })); let Op::Cut(main) = &plan[3] else { panic!() };
src/selftest.rs+11−3@@ -467,7 +467,7 @@ fn cswa_level(ctx: &Ctx, args: &Value, sw: &Value, ready: bool, started: Instant let mut memory_log = MemoryLog::default(); let mut none: Option<String> = None; let mut last: Option<String> = None;- let (mut passed, mut ran, mut skipped) = (0usize, 0usize, 0usize);+ let (mut passed, mut ran, mut skipped, mut simulator_only) = (0usize, 0usize, 0usize, 0usize); let mut parts: Vec<Value> = Vec::new(); for spec in crate::cswa::specs() { let spec = match spec {@@ -486,6 +486,14 @@ fn cswa_level(ctx: &Ctx, args: &Value, sw: &Value, ready: bool, started: Instant run.skip(&name, "swx_run_script", &format!("needs ops the bridge does not have yet: {}", spec.needs_ops.join(", "))); continue; }+ // A part only SOLIDWORKS can build (0.11.4: Offset Entities reads the+ // face's own outline) is skipped in the SIMULATOR, saying why — and+ // built like any other on a real install.+ if let (true, Some(why)) = (crate::is_mock(), &spec.simulator_skips) {+ simulator_only += 1;+ run.skip(&name, "swx_run_script", &format!("skipped in the simulator: {why}"));+ continue;+ } let id = spec.id.as_str(); if let Err(stop) = presence_between(ctx, last.as_deref(), id, idle_wait, &mut none) { memory_log.stopped_for = Some("userPresent");@@ -534,9 +542,9 @@ fn cswa_level(ctx: &Ctx, args: &Value, sw: &Value, ready: bool, started: Instant if let Some(prev) = &active { run.call(ctx, "re-activate the document that was active before", "swx_activate_document", json!({"name": prev})); }- let verdict = crate::cswa::summary(passed, ran, skipped);+ let verdict = crate::cswa::summary(passed, ran, skipped, simulator_only); let mut extra = memory_log.to_json(memory_override.as_deref());- extra["cswa"] = json!({"summary": verdict, "passed": passed, "ran": ran, "skipped": skipped, "parts": parts,+ extra["cswa"] = json!({"summary": verdict, "passed": passed, "ran": ran, "skipped": skipped + simulator_only, "skippedInSimulator": simulator_only, "parts": parts, "allPassed": ran > 0 && passed == ran && memory_log.stopped.is_none()}); finish_with("cswa", sw, ready, true, started, run, Some(format!("{verdict}.")), extra) }
src/verbs3.rs+2−1@@ -5195,12 +5195,13 @@ fn script_help(message: impl Into<String>) -> Value { "new_part": {"visible": "true (default) | false — created HIDDEN (ISldWorks::DocumentVisible). A hidden part CANNOT BE MODELLED (SOLIDWORKS selects only in the active document, and a hidden one cannot be activated — measured): a script that models it is refused document_hidden. Use reuseDocument, not hiding, to keep memory flat"}, "new_assembly": {"visible": "as new_part"}, "clear_part": {"(none)": "deletes EVERY feature after the origin of a part the BRIDGE created — never anyone else's; N checks then cost one document"},- "sketch": {"plane": "Front Plane|Top Plane|Right Plane|<any plane name> | {offsetFrom, offsetMm} | {offsetFrom: {face: {atPointMm:[x,y,z]}}, offsetMm} (offsetMm along the face's OUTWARD normal; negative = into the part)", "face": "{atPointMm:[x,y,z]} instead of plane", "entities": "[{rect:{widthMm, heightMm, xMm, yMm, anchor:corner|center, centerMm:[x,y], cornerRadiusMm?}}, {circle:{radiusMm|diameterMm, xMm, yMm | centerMm}}, {line:{from:[x,y], to:[x,y]}}, {centerline:{from, to}}, {polyline:{points:[[x,y],...], close:bool}}, {arc:{center:[x,y], radiusMm, startDeg, endDeg, ccw:true}}, {arc3:{start, mid, end}}, {tangentArc:{to:[x,y], radiusMm?}} (continues the entity before it), {slot:{center, lengthMm (centre to centre), widthMm, angleDeg}}, {polygon:{center, sides, circumradiusMm | inscribedRadiusMm, angleDeg (first vertex)}}, {sketchFillet:{at:[x,y], radiusMm}} / {sketchChamfer:{at:[x,y], distanceMm}} (round or cut the corner where two LINES drawn before it meet)] — ALL in one sketch: concentric circles make a ring, a rect with circles inside makes a plate with holes. Lines and arcs must CLOSE (each end meets exactly one other within 1e-6 mm — an open contour is refused naming the gap); several closed contours are several regions. Any entity takes construction:true (never part of a profile). 0.11.0, not yet run live"},+ "sketch": {"plane": "Front Plane|Top Plane|Right Plane|<any plane name> | {offsetFrom, offsetMm} | {offsetFrom: {face: {atPointMm:[x,y,z]}}, offsetMm} (offsetMm along the face's OUTWARD normal; negative = into the part)", "face": "{atPointMm:[x,y,z]} instead of plane", "entities": "[{rect:{widthMm, heightMm, xMm, yMm, anchor:corner|center, centerMm:[x,y], cornerRadiusMm?}}, {circle:{radiusMm|diameterMm, xMm, yMm | centerMm}}, {line:{from:[x,y], to:[x,y]}}, {centerline:{from, to}}, {polyline:{points:[[x,y],...], close:bool}}, {arc:{center:[x,y], radiusMm, startDeg, endDeg, ccw:true}}, {arc3:{start, mid, end}}, {tangentArc:{to:[x,y], radiusMm?}} (continues the entity before it), {slot:{center, lengthMm (centre to centre), widthMm, angleDeg}}, {polygon:{center, sides, circumradiusMm | inscribedRadiusMm, angleDeg (first vertex)}}, {sketchFillet:{at:[x,y], radiusMm}} / {sketchChamfer:{at:[x,y], distanceMm}} (round or cut the corner where two LINES drawn before it meet), {offsetEntities:{fromFace:{atPointMm:[x,y,z]}, offsetMm (NEGATIVE = into the face), loops:outer|all, chain:true}} (0.11.4: a model face's outline offset into the sketch by SOLIDWORKS, the side checked; not yet run live)] — ALL in one sketch: concentric circles make a ring, a rect with circles inside makes a plate with holes. Lines and arcs must CLOSE (each end meets exactly one other within 1e-6 mm — an open contour is refused naming the gap); several closed contours are several regions. Any entity takes construction:true (never part of a profile). 0.11.0, not yet run live"}, "sketch_rect": {"plane": "as sketch", "face": "as sketch", "widthMm": "required", "heightMm": "required", "xMm": 0, "yMm": 0, "anchor": "corner (default: xMm/yMm is the CORNER) | center", "centerMm": "[x, y] (implies center)"}, "sketch_circle": {"plane": "as sketch", "face": "as sketch", "radiusMm": "required (or diameterMm)", "xMm": 0, "yMm": 0, "centerMm": "[x, y]"}, "extrude": {"depthMm": "required unless throughAll", "reverse": false, "direction": "one|both|midPlane", "depth2Mm": "direction both: the other side (default = depthMm)", "midPlane": false, "throughAll": false}, "cut": {"depthMm": "required unless throughAll", "throughAll": false, "reverse": false, "direction": "one|both|midPlane", "depth2Mm": "as extrude", "midPlane": false}, "extrude / cut end conditions (0.11.0, not yet run live)": {"upToNext": "true — to the next face (swEndCondUpToNext 11)", "upToSurface": "{face:{atPointMm:[x,y,z]}} — to that face (swEndCondUpToSelection 10)", "offsetFromSurface": "{face:{atPointMm}, distanceMm, reverseOffset:false} — distanceMm short of that face (swEndCondOffsetFromSurface 5)", "draftDeg": "a taper, 0..90", "draftOutward": "false (default: the profile shrinks as it goes)"},+ "extrude / cut regions (0.11.4, not yet run live)": {"regionsAtMm": "[[u, v], ...] — only the sketch regions holding these points (the sketch's own coordinates): SOLIDWORKS' Selected Contours, for contours that CROSS (an offset outline and a circle). regionAtMm: [u, v] for one"}, "revolve": {"axis": "\"x\" | \"y\" (the sketch's own axes) | {entity: i} (the sketch's i-th entity as written, 0-based: a line or centerline) | {line: [[x,y],[x,y]]} (added as a centerline)", "angleDeg": 360, "midPlane": false, "reverse": false, "_": "the profile must lie on ONE side of the axis; FeatureRevolve2. 0.11.0, not yet run live"}, "revolve_cut": {"_": "as revolve, removing material (FeatureRevolve2 IsCut)"}, "mirror": {"plane": "a plane name | {offsetFrom, offsetMm}", "face": "{atPointMm:[x,y,z]} — a planar face, instead of plane", "features": "\"last\" (default) | a name | [names] | \"all\" (= mirrorBody)", "mirrorBody": "true: every solid body", "_": "InsertMirrorFeature2 (features mark 1, plane mark 2, bodies mark 256). 0.11.0, not yet run live"},
tests/cswa.rs+147−4@@ -51,12 +51,29 @@ fn a_flanged_bushing_revolved_holed_and_mirrored_weighs_what_the_closed_forms_sa let steps = r["steps"].as_array().cloned().unwrap_or_default(); let ops: Vec<&str> = steps.iter().map(|x| x["op"].as_str().unwrap_or("")).collect(); check!(b, "revolve, hole, mirror, set_material ran in order", ops == ["new_part", "sketch", "revolve", "hole", "mirror", "set_material"], format!("{ops:?}"));- for (i, op) in [(2, "revolve"), (3, "hole"), (4, "mirror"), (5, "set_material")] {+ // The 360 revolve and the mirror about a named plane were measured by the first+ // canary (2026-10-16, 0.11.4-rc1, cswa-09 and cswa-10 on SOLIDWORKS 2026) — so on+ // this simulated 2025 they are not live, and nothing is unmeasured.+ for (i, op) in [(2, "revolve"), (4, "mirror")] {+ let p = &steps[i]["result"]["proven"]; check!( b,- &format!("{op} says proven.live:false, naming its unmeasured variant"),- steps[i]["result"]["proven"]["live"] == false && steps[i]["result"]["proven"]["unmeasured"].as_array().map(|a| !a.is_empty()).unwrap_or(false),- s(&steps[i]["result"]["proven"])+ &format!("{op}: measured on 2026 by the canary, so not live on this simulated 2025, and nothing unmeasured"),+ p["live"] == false && p.get("unmeasured").is_none()+ && p["measuredOn"].as_array().map(|a| a.iter().any(|m| m["bridge"] == "0.11.4-rc1" && m["solidworks"] == 2026)).unwrap_or(false),+ s(p)+ );+ }+ // The plain hole and the density were measured by the first live CSWA run+ // (2026-10-15, SOLIDWORKS 2026) — not on the simulated release (2025).+ for (i, op) in [(3, "hole"), (5, "set_material")] {+ let p = &steps[i]["result"]["proven"];+ check!(+ b,+ &format!("{op}: measured on 2026 by the CSWA run, so not live on this simulated 2025, and nothing unmeasured"),+ p["live"] == false && p.get("unmeasured").is_none()+ && p["measuredOn"].as_array().map(|a| a.iter().any(|m| m["bridge"] == "0.11.2" && m["solidworks"] == 2026)).unwrap_or(false),+ s(p) ); } check!(b, "the sketch's lines are named as sketch.line", steps[1]["result"]["proven"]["variants"].as_array().map(|a| a.iter().any(|v| v == "sketch.line")).unwrap_or(false), s(&steps[1]["result"]["proven"]));@@ -160,3 +177,129 @@ fn the_script_help_teaches_the_cswa_ops() { s(&r["opArgs"]["sketch"]) ); }++/// THE SPECS DO WHAT THEY SAY (0.11.4). Every spec's `exercises` list is a+/// subset of the variants its steps report — run in the simulator (which+/// classifies each step exactly as the COM host does), or, for a part only+/// SOLIDWORKS can build, classified from its parsed script. Every DERIVED key+/// is reproduced by its `derivation` (tools/cswa-check.py --derivations,+/// where python3 is installed). And a part the simulator cannot build is+/// skipped there, saying why, while the live checker runs it.+#[test]+fn every_spec_exercises_what_it_names_and_every_derived_key_reproduces() {+ let (b, _m) = boot("cswa-exercises");+ let all: Vec<Value> = swx_bridge::cswa::SPECS.iter().map(|(_, t)| serde_json::from_str(t).unwrap()).collect();+ let mut checked = 0;+ for raw in &all {+ let id = raw["id"].as_str().unwrap().to_string();+ let Some(ex) = raw.get("exercises").and_then(|e| e.as_array()) else { continue };+ let spec = swx_bridge::cswa::expand(raw, &all).unwrap();+ let mut seen: Vec<String> = Vec::new();+ if raw.get("simulatorSkips").is_some() {+ let ops = swx_bridge::script::parse(&spec["script"]).unwrap();+ for op in &ops {+ seen.extend(swx_bridge::compat::op_variants(op, &json!({})));+ }+ // A face sketch's side needs the face SOLIDWORKS picked: not claimed here.+ seen.retain(|v| !v.starts_with("sketch.face."));+ for e in ex.iter().filter_map(|e| e.as_str()).filter(|e| !e.starts_with("sketch.face.")) {+ check!(b, &format!("{id} exercises {e} (from its parsed script)"), seen.iter().any(|v| v == e), format!("{seen:?}"));+ }+ } else {+ let r = b.call("swx_run_script", json!({"script": spec["script"]}));+ check!(b, &format!("{id} builds in the simulator"), r["success"] == true, s(&r));+ for st in r["steps"].as_array().cloned().unwrap_or_default() {+ for v in st["result"]["proven"]["variants"].as_array().cloned().unwrap_or_default() {+ seen.push(v.as_str().unwrap_or("").to_string());+ }+ }+ for e in ex.iter().filter_map(|e| e.as_str()) {+ check!(b, &format!("{id} exercises {e}"), seen.iter().any(|v| v == e), format!("{seen:?}"));+ }+ let _ = b.call("swx_close_doc", json!({"targetDocument": r["documentName"], "save": false}));+ }+ checked += 1;+ }+ check!(b, "the community specs and both Step 4 variants name what they exercise", checked >= 6, format!("{checked}"));+ // Every community spec carries a derivation, and every derivation reproduces its key.+ for raw in &all {+ if raw["id"].as_str().unwrap_or("").contains("community") {+ check!(b, "a community spec derives its key", raw["official"] == false && raw["derivation"].as_array().map(|d| !d.is_empty()).unwrap_or(false), s(raw));+ }+ }+ let out = std::process::Command::new("python3")+ .arg(std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tools/cswa-check.py"))+ .arg("--derivations")+ .output();+ if let Ok(o) = out {+ let report: Value = serde_json::from_slice(&o.stdout).unwrap_or(Value::Null);+ check!(+ b,+ "tools/cswa-check.py --derivations reproduces every derived key (massG, volume, centre of mass)",+ o.status.success() && report.as_object().map(|m| m.len() >= 4 && m.values().all(|v| v["ok"] == true)).unwrap_or(false),+ format!("{}\n{}", String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr))+ );+ }+ // The part only SOLIDWORKS builds: skipped in the simulator, the reason given.+ let r = b.call("swx_selftest", json!({"level": "cswa", "only": ["cswa-08-tool-block-step4", "cswa-08b-tool-block-step4-explicit"]}));+ let rows = r["results"].as_array().cloned().unwrap_or_default();+ let main = rows.iter().find(|x| x["name"].as_str().unwrap_or("").contains("cswa-08-tool-block-step4:")).cloned().unwrap_or(Value::Null);+ check!(+ b,+ "Step 4 by Offset Entities is skipped in the simulator, saying why; the explicit variant runs and lands within the exam's 1 %",+ main["skipped"].as_str().unwrap_or("").starts_with("skipped in the simulator: Offset Entities")+ && r["cswa"]["ran"] == 1 && r["cswa"]["passed"] == 1 && r["cswa"]["skippedInSimulator"] == 1+ && r["cswa"]["summary"] == "1 of 1 CSWA parts within tolerance (1 skipped in the simulator: only SOLIDWORKS can build them)",+ s(&r["cswa"])+ );+}++/// WHICH BUILD RAN (the canary gate): tools/cswa-check.py reads the INSTALLED+/// exe back through ab's read_file in ranges and hashes it, finds the manifest+/// ab installed from (a map or a list in ~/.adom/bridge-install-urls.json), and+/// names its own report (`--report auto`) — checked here against a fake ab, in+/// python3 (skipped where it is not installed).+#[test]+fn the_live_checker_records_which_build_ran() {+ let script = r#"+import base64, hashlib, importlib.util, json, os, sys+spec = importlib.util.spec_from_file_location("cc", sys.argv[1]); cc = importlib.util.module_from_spec(spec); spec.loader.exec_module(cc)+blob = bytes(range(256)) * 9000+files = {"C:\\ab\\solidworks\\swx-bridge.exe": blob, "C:\\ab\\solidworks\\bridge.json": b'{"version":"9.9.9"}',+ "~/.adom/bridge-install-urls.json": json.dumps({"solidworks": "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/manifests/canary.json"}).encode()}+def fake(verb, args, timeout=300):+ if verb == "bridge_info":+ return {"success": True, "version": "9.9.9", "installPath": "C:\\ab\\solidworks\\", "manifestUrl": "m", "source": "cache"}+ data = files.get(args.get("path"))+ if data is None:+ return {"success": False, "error": "no such file"}+ if args.get("encoding") == "base64":+ off, n = args.get("offset", 0), args.get("length", 1000000)+ part = data[off:off + n]+ return {"success": True, "content": base64.b64encode(part).decode(), "totalSize": len(data), "nextOffset": off + len(part), "eof": off + len(part) >= len(data)}+ return {"success": True, "content": data.decode()}+cc.call = fake+cc.wiki_json = lambda url: {"sha256": "z" * 64, "version": "9.9.9", "canary": {"rc": "9.9.9-rc1"}} if url.endswith("canary.json") else None+f = cc.bridge_facts()+assert f["exeSha256"] == hashlib.sha256(blob).hexdigest(), f+assert f["bridgeJsonSha256"] == hashlib.sha256(b'{"version":"9.9.9"}').hexdigest(), f+assert f["installedFrom"].endswith("manifests/canary.json") and f["zipSha256"] == "z" * 64 and f["canary"]["rc"] == "9.9.9-rc1", f+files["~/.adom/bridge-install-urls.json"] = json.dumps([{"name": "kicad", "manifestUrl": "k"}, {"name": "solidworks", "manifestUrl": "s"}]).encode()+assert cc.installed_from() == "s"+del files["C:\\ab\\solidworks\\swx-bridge.exe"]+f = cc.bridge_facts()+assert f["exeSha256"] is None and "read_file" in f["exeWhy"], f+p = cc.report_path("auto", {"bridgeVersion": "9.9.9"}, {"versionSupport": {"year": 2026}})+assert os.path.basename(p).startswith("cswa-") and p.endswith("-sw2026-9.9.9.json") and "tools/cswa/reports" in p.replace(os.sep, "/"), p+assert cc.report_path("mine.json", {}, {}) == "mine.json"+assert cc.wiki_json("https://example.com/not-the-wiki.json") is None+print("OK")+"#;+ let out = std::process::Command::new("python3")+ .arg("-c")+ .arg(script)+ .arg(std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tools/cswa-check.py"))+ .output();+ let Ok(o) = out else { return };+ assert!(o.status.success() && String::from_utf8_lossy(&o.stdout).contains("OK"), "{}{}", String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr));+}
tests/issue1.rs+9−2@@ -391,10 +391,16 @@ fn steps_say_what_was_measured_live_on_this_release() { let st = r["steps"].as_array().cloned().unwrap_or_default(); let measured = json!([{"solidworks": 2026, "major": 34, "edition": "connected", "date": "2026-10-14", "bridge": "0.10.3", "by": "adom"}, {"solidworks": 2021, "major": 29, "edition": "desktop", "date": "2026-10-15", "bridge": "0.10.9", "by": "community"}]);+ // ...and the first live CSWA run (2026-10-15, bridge 0.11.2) re-measured the+ // Top Plane rect, the boss, the circle and the typed selection (the shell's+ // faces are selected that way) — everything here but new_part.+ let mut with_cswa = measured.clone();+ with_cswa.as_array_mut().unwrap().push(json!({"solidworks": 2026, "major": 34, "edition": "connected", "date": "2026-10-15", "bridge": "0.11.2", "by": "adom"})); check!( b, "measured variants are LIVE on 2026, with the measurement: new part, Top Plane rect, boss, face sketch, shell",- [0usize, 1, 2, 3, 4, 5].iter().all(|i| st[*i]["result"]["proven"]["live"] == true && st[*i]["result"]["proven"]["measuredOn"] == measured),+ [0usize, 1, 2, 3, 4, 5].iter().all(|i| st[*i]["result"]["proven"]["live"] == true+ && st[*i]["result"]["proven"]["measuredOn"] == if *i == 0 { measured.clone() } else { with_cswa.clone() }), s(&r) ); check!(@@ -428,7 +434,8 @@ fn steps_say_what_was_measured_live_on_this_release() { b, "on 2021 the community-measured steps are live (both measurements listed); the reversed boss is live:false, measured on 2026 only — and says so", r["success"] == true- && [0usize, 1, 2, 3, 4, 5].iter().all(|i| st[*i]["result"]["proven"]["live"] == true && st[*i]["result"]["proven"]["measuredOn"] == measured)+ && [0usize, 1, 2, 3, 4, 5].iter().all(|i| st[*i]["result"]["proven"]["live"] == true+ && st[*i]["result"]["proven"]["measuredOn"] == if *i == 0 { measured.clone() } else { with_cswa.clone() }) && st[9]["result"]["proven"]["live"] == false && st[9]["result"]["proven"]["why"].as_str().unwrap_or("").contains("this is SOLIDWORKS 2021"), s(&r)
tests/regions.rsadded+132@@ -0,0 +1,132 @@+//! OFFSET ENTITIES AND SKETCH REGIONS (0.11.4) through the whole bridge, in the+//! SIMULATOR. What the simulator can honestly model it models exactly: the+//! offset of a plain block's face (a rectangle moved in or out) and the+//! regions of profiles that nest or stand apart. Anything else — a face whose+//! outline only SOLIDWORKS knows, contours that CROSS — it refuses, saying so;+//! the CSWA Step 4 spec runs those live. Every step says proven.live:false+//! until a live run measures it.++mod common;++use common::{Bridge, TempDir};+use serde_json::{json, Value};++const PI: f64 = std::f64::consts::PI;++fn s(v: &Value) -> String {+ serde_json::to_string_pretty(v).unwrap_or_default()+}++fn boot(tag: &str) -> (Bridge, TempDir) {+ let machine = TempDir::new(tag);+ std::fs::write(machine.join("windows.json"), "[]").unwrap();+ let b = Bridge::start_with(&[("SWX_LAUNCH_FAKE_DIR", &machine.path())]);+ b.call("swx_start", json!({}));+ (b, machine)+}++fn near(a: &Value, b: f64, rel: f64) -> bool {+ a.as_f64().map(|x| (x - b).abs() <= rel * b.abs().max(1e-9)).unwrap_or(false)+}++fn volume(b: &Bridge) -> Value {+ b.call("swx_mass_properties", json!({}))["volumeMm3"].clone()+}++#[test]+fn an_offset_of_a_plain_blocks_face_is_its_rectangle_moved_in_or_out() {+ let (b, _m) = boot("regions-offset");+ let block = json!([+ {"op": "new_part"},+ {"op": "sketch_rect", "plane": "Top Plane", "widthMm": 60, "heightMm": 40, "anchor": "center"},+ {"op": "extrude", "depthMm": 20}+ ]);+ // INWARD: the top face's outline 2 mm in, cut 5 deep — a pocket 56 x 36.+ let mut script = block.as_array().unwrap().clone();+ script.push(json!({"op": "sketch", "face": {"atPointMm": [0, 20, 0]}, "entities": [{"offsetEntities": {"fromFace": {"atPointMm": [0, 20, 0]}, "offsetMm": -2}}]}));+ script.push(json!({"op": "cut", "depthMm": 5}));+ let r = b.call("swx_run_script", json!({"script": script}));+ check!(b, "the inward offset of a block's top face pockets it", r["success"] == true, s(&r));+ let sk = &r["steps"][3]["result"];+ check!(+ b,+ "the step names the offset, the side it landed on, and that the simulator drew a rectangle",+ sk["offsets"][0]["offsetEntities"]["side"] == "inward" && sk["offsets"][0]["drawn"]["side"] == "inward"+ && [(0usize, 0usize, -28.0), (0, 1, -18.0), (1, 0, 28.0), (1, 1, 18.0)].iter().all(|(i, j, want)| near(&sk["offsets"][0]["drawn"]["rectMm"][*i][*j], *want, 1e-12))+ && near(&sk["profileAreaMm2"], 56.0 * 36.0, 1e-12),+ s(sk)+ );+ check!(+ b,+ "...and is classified as an outer-loop offset, not yet measured live",+ sk["proven"]["variants"].as_array().map(|a| a.iter().any(|v| v == "sketch.offsetEntities.outer")).unwrap_or(false)+ && sk["proven"]["live"] == false,+ s(&sk["proven"])+ );+ check!(b, "the pocket removed 56 x 36 x 5 (swx_mass_properties)", near(&volume(&b), 60.0 * 40.0 * 20.0 - 56.0 * 36.0 * 5.0, 1e-6), s(&volume(&b)));+ // OUTWARD, every loop: the bottom face's outline 3 mm out, a 4-deep boss below.+ let mut script = block.as_array().unwrap().clone();+ script.push(json!({"op": "sketch", "face": {"atPointMm": [0, 0, 0]}, "entities": [{"offsetEntities": {"fromFace": {"atPointMm": [0, 0, 0]}, "offsetMm": 3, "loops": "all"}}]}));+ script.push(json!({"op": "extrude", "depthMm": 4}));+ let r = b.call("swx_run_script", json!({"script": script}));+ check!(+ b,+ "the outward offset of the bottom face is a 66 x 46 boss below it, classified as a face offset",+ r["success"] == true && near(&volume(&b), 60.0 * 40.0 * 20.0 + 66.0 * 46.0 * 4.0, 1e-6)+ && r["steps"][3]["result"]["proven"]["variants"].as_array().map(|a| a.iter().any(|v| v == "sketch.offsetEntities.face")).unwrap_or(false),+ format!("{}\n{}", s(&r), s(&volume(&b)))+ );+ // A face whose outline is SOLIDWORKS' own (a cylinder's end, a cut block)+ // is refused — the simulator never invents an outline.+ let r = b.call("swx_run_script", json!({"script": [+ {"op": "new_part"},+ {"op": "sketch_circle", "plane": "Top Plane", "radiusMm": 10},+ {"op": "extrude", "depthMm": 5},+ {"op": "sketch", "face": {"atPointMm": [0, 5, 0]}, "entities": [{"offsetEntities": {"fromFace": {"atPointMm": [0, 5, 0]}, "offsetMm": -1}}]},+ {"op": "cut", "depthMm": 1}+ ]}));+ check!(+ b,+ "an offset of a face that is not a plain block's is refused, naming why (and saying it runs live)",+ r["success"] == false && r["error"].as_str().unwrap_or("").contains("plain block") && r["error"].as_str().unwrap_or("").contains("run it live"),+ s(&r)+ );+}++#[test]+fn a_region_pick_extrudes_only_the_regions_that_hold_its_points() {+ let (b, _m) = boot("regions-pick");+ let run = |b: &Bridge, entities: Value, extrude: Value| -> Value {+ b.call("swx_run_script", json!({"script": [+ {"op": "new_part"},+ {"op": "sketch", "plane": "Front Plane", "entities": entities},+ extrude+ ]}))+ };+ let two = json!([{"rect": {"xMm": 0, "yMm": 0, "widthMm": 10, "heightMm": 10}}, {"rect": {"xMm": 20, "yMm": 0, "widthMm": 10, "heightMm": 10}}]);+ let r = run(&b, two.clone(), json!({"op": "extrude", "depthMm": 5, "regionsAtMm": [[25, 5]]}));+ check!(b, "one of two rectangles picked: only it is extruded", r["success"] == true && near(&volume(&b), 500.0, 1e-9), format!("{}\n{}", s(&r), s(&volume(&b))));+ check!(+ b,+ "the extrude is classified as a region pick (not yet measured live)",+ r["steps"][2]["result"]["proven"]["variants"] == json!(["extrude.one", "extrude.regions"]) && r["steps"][2]["result"]["proven"]["live"] == false,+ s(&r["steps"][2])+ );+ let r = run(&b, two, json!({"op": "extrude", "depthMm": 5, "regionsAtMm": [[25, 5], [5, 5]]}));+ check!(b, "both picked: both", r["success"] == true && near(&volume(&b), 1000.0, 1e-9), s(&volume(&b)));+ let ring = json!([{"circle": {"radiusMm": 10}}, {"circle": {"radiusMm": 5}}]);+ let r = run(&b, ring.clone(), json!({"op": "extrude", "depthMm": 2, "regionAtMm": [0, 0]}));+ check!(b, "a point inside the inner circle picks the DISC", r["success"] == true && near(&volume(&b), PI * 25.0 * 2.0, 1e-6), s(&volume(&b)));+ let r = run(&b, ring, json!({"op": "extrude", "depthMm": 2, "regionAtMm": [7, 0]}));+ check!(b, "a point between the circles picks the RING", r["success"] == true && near(&volume(&b), PI * 75.0 * 2.0, 1e-6), s(&volume(&b)));+ let r = run(&b, json!([{"rect": {"xMm": 0, "yMm": 0, "widthMm": 10, "heightMm": 10}}]), json!({"op": "extrude", "depthMm": 2, "regionAtMm": [50, 50]}));+ check!(b, "a point in no profile is refused, naming it", r["success"] == false && r["error"].as_str().unwrap_or("").contains("in no closed profile"), s(&r));+ let crossing = json!([{"rect": {"xMm": 0, "yMm": 0, "widthMm": 10, "heightMm": 10}}, {"circle": {"centerMm": [10, 5], "radiusMm": 4}}]);+ let r = run(&b, crossing, json!({"op": "extrude", "depthMm": 2, "regionAtMm": [2, 2]}));+ check!(+ b,+ "CROSSING contours are SOLIDWORKS' to resolve: refused in the simulator, saying so",+ r["success"] == false && r["error"].as_str().unwrap_or("").contains("CROSS") && r["error"].as_str().unwrap_or("").contains("run it live"),+ s(&r)+ );+}
tests/wiring.rs+357−2@@ -1271,8 +1271,17 @@ fn the_live_gate_accepts_only_a_complete_passing_report_newer_than_the_code() { let root = Path::new(env!("CARGO_MANIFEST_DIR")); let dir = std::env::temp_dir().join(format!("swx-live-gate-{}", std::process::id())); std::fs::create_dir_all(&dir).unwrap();- let good = serde_json::json!({"tool": "cswa-check", "bridgeVersion": "9.9.9", "ran": 8, "passed": 8, "allPassed": true,- "stopped": null, "whenEpoch": 2000, "when": "t", "summary": "8 of 8 CSWA parts within tolerance"});+ // EVERY shipped part (0.11.4): the report lists one row per spec in resources/cswa.+ let mut ids: Vec<String> = std::fs::read_dir(root.join("resources/cswa")).unwrap().filter_map(|e| e.ok())+ .filter(|e| e.file_name().to_string_lossy().ends_with(".json"))+ .map(|e| serde_json::from_str::<serde_json::Value>(&std::fs::read_to_string(e.path()).unwrap()).unwrap()["id"].as_str().unwrap().to_string())+ .collect();+ ids.sort();+ let parts: Vec<serde_json::Value> = ids.iter().map(|i| serde_json::json!({"id": i, "pass": true})).collect();+ let n = parts.len();+ let good = serde_json::json!({"tool": "cswa-check", "bridgeVersion": "9.9.9", "ran": n, "passed": n, "allPassed": true,+ "stopped": null, "whenEpoch": 2000, "when": "t", "summary": format!("{n} of {n} CSWA parts within tolerance"),+ "parts": parts}); let run = |name: &str, report: &serde_json::Value, ver: &str, code_at: &str| -> Option<bool> { let p = dir.join(name); std::fs::write(&p, report.to_string()).unwrap();@@ -1296,7 +1305,353 @@ fn the_live_gate_accepts_only_a_complete_passing_report_newer_than_the_code() { assert_eq!(run("none.json", &with("ran", serde_json::json!(0)), "9.9.9", "1000"), Some(false), "a run of nothing is refused"); assert_eq!(run("stop.json", &with("stopped", serde_json::json!("user_present")), "9.9.9", "1000"), Some(false), "a stopped run is refused"); assert_eq!(run("tool.json", &with("tool", serde_json::json!("dsl-live-check")), "9.9.9", "1000"), Some(false), "another tool's report is refused");+ // A PARTIAL run (--only) proves nothing about the parts it left out (0.11.4)...+ let mut partial = good.clone();+ partial["parts"].as_array_mut().unwrap().pop();+ partial["ran"] = serde_json::json!(n - 1);+ partial["passed"] = serde_json::json!(n - 1);+ assert_eq!(run("partial.json", &partial, "9.9.9", "1000"), Some(false), "a run that left a shipped part out is refused");+ // ...and a part may be skipped only for an op the bridge lacks.+ let mut skipped = good.clone();+ skipped["parts"][0] = serde_json::json!({"id": ids[0], "skipped": "skipped in the simulator: only SOLIDWORKS can build it"});+ skipped["ran"] = serde_json::json!(n - 1);+ skipped["passed"] = serde_json::json!(n - 1);+ assert_eq!(run("skipped.json", &skipped, "9.9.9", "1000"), Some(false), "a part skipped for any other reason is refused");+ skipped["parts"][0] = serde_json::json!({"id": ids[0], "skipped": "needs ops the bridge does not have yet: loft"});+ assert_eq!(run("needs.json", &skipped, "9.9.9", "1000"), Some(true), "a part needing an op the bridge lacks may be skipped"); let missing = std::process::Command::new("python3").arg(root.join("tools/check-live-report.py")).args([dir.join("nope.json").to_string_lossy().as_ref(), "9.9.9", "0"]).output().unwrap(); assert!(!missing.status.success(), "no report, no release"); let _ = std::fs::remove_dir_all(&dir); }++/// EVERY PUBLISH IS PROVEN LIVE (0.11.4): `release.sh --publish` REFUSES+/// without `--require-live <report>` unless `--docs-only`, which+/// tools/check-docs-only.py allows only when nothing the bridge runs changed+/// since the last publish (src/, resources/ — untracked files included — and+/// Cargo.toml / Cargo.lock beyond the package's own version); the changelog+/// of a docs-only release says the live gate was skipped. Run for real in a+/// scratch copy, with a stub `adom-wiki` that fails if it is ever reached and+/// no exe to ship. (Skipped where bash, git or python3 is missing.)+#[test]+fn a_publish_without_a_live_report_is_refused_unless_it_is_docs_only() {+ let root = Path::new(env!("CARGO_MANIFEST_DIR"));+ let sh = std::fs::read_to_string(root.join("tools/release.sh")).unwrap();+ let refuse = sh.find("--publish needs --require-live").expect("the refusal");+ let docs = sh.find("tools/check-docs-only.py").expect("the docs-only gate");+ let build = sh.find("zip -qr").unwrap();+ let publish = sh.find("if [ \"$PUBLISH\" = 1 ]; then").unwrap();+ assert!(refuse < build && docs < build && refuse < publish && docs < publish, "both gates run before anything is built or published");+ let block = &sh[publish..];+ assert!(block.contains("Docs-only release: no code changed since $LAST_VER") && block.find("Docs-only release").unwrap() < block.find("adom-wiki release create").unwrap(),+ "a docs-only release says so in its changelog, before the release is created");+ let have = |tool: &str| std::process::Command::new(tool).arg("--version").output().map(|o| o.status.success()).unwrap_or(false);+ if !(have("bash") && have("git") && have("python3")) {+ return;+ }+ let dir = std::env::temp_dir().join(format!("swx-release-gate-{}", std::process::id()));+ let _ = std::fs::remove_dir_all(&dir);+ std::fs::create_dir_all(dir.join("tools")).unwrap();+ std::fs::create_dir_all(dir.join("bin")).unwrap();+ std::fs::create_dir_all(dir.join("src")).unwrap();+ std::fs::create_dir_all(dir.join("resources")).unwrap();+ for t in ["release.sh", "check-docs-only.py", "check-live-report.py"] {+ std::fs::copy(root.join("tools").join(t), dir.join("tools").join(t)).unwrap();+ }+ let stub = dir.join("bin/adom-wiki");+ std::fs::write(&stub, "#!/bin/sh\necho STUB-ADOM-WIKI-REACHED; exit 99\n").unwrap();+ #[cfg(unix)]+ {+ use std::os::unix::fs::PermissionsExt;+ std::fs::set_permissions(&stub, std::fs::Permissions::from_mode(0o755)).unwrap();+ }+ std::fs::write(dir.join("BRIDGE_VERSION"), "9.9.9\n").unwrap();+ std::fs::write(dir.join("src/a.rs"), "fn a() {}\n").unwrap();+ std::fs::write(dir.join("resources/r.txt"), "r\n").unwrap();+ std::fs::write(dir.join("adom-bridge-solidworks-manifest.json"), "{\"version\": \"9.9.8\"}\n").unwrap();+ std::fs::write(dir.join("Cargo.toml"), "[package]\nname = \"swx-bridge\"\nversion = \"9.9.8\"\n\n[dependencies]\nserde = \"1\"\n").unwrap();+ let git = |args: &[&str]| {+ let o = std::process::Command::new("git").args(args).current_dir(&dir).output().unwrap();+ assert!(o.status.success(), "git {args:?}: {}", String::from_utf8_lossy(&o.stderr));+ };+ git(&["init", "-q"]);+ git(&["config", "user.email", "[email protected]"]);+ git(&["config", "user.name", "t"]);+ git(&["add", "-A"]);+ git(&["commit", "-qm", "manifest: 9.9.8 as published"]);+ let path = format!("{}:{}", dir.join("bin").display(), std::env::var("PATH").unwrap_or_default());+ let run = |args: &[&str]| -> (bool, String) {+ let o = std::process::Command::new("bash").arg("tools/release.sh").args(args).current_dir(&dir).env("PATH", &path).output().unwrap();+ let text = format!("{}{}", String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr));+ assert!(!text.contains("STUB-ADOM-WIKI-REACHED"), "release.sh {args:?} reached the wiki:\n{text}");+ (o.status.success(), text)+ };+ let (ok, out) = run(&["--publish"]);+ assert!(!ok && out.contains("--publish needs --require-live") && out.contains("Nothing was built or published"), "a bare --publish is refused:\n{out}");+ let (ok, out) = run(&["--publish", "--docs-only", "--require-live", "r.json"]);+ assert!(!ok && out.contains("pick one"), "docs-only with a live report is a contradiction:\n{out}");+ // A plain build passes the gate (and stops at the missing exe).+ let (ok, out) = run(&[]);+ assert!(!ok && out.contains("swx-bridge.exe missing") && !out.contains("--require-live <report.json>"), "a plain build needs no live report:\n{out}");+ // A version bump and a doc are docs-only; the gate passes (and the build stops at the exe).+ std::fs::write(dir.join("Cargo.toml"), "[package]\nname = \"swx-bridge\"\nversion = \"9.9.9\"\n\n[dependencies]\nserde = \"1\"\n").unwrap();+ std::fs::write(dir.join("README.md"), "docs\n").unwrap();+ let (ok, out) = run(&["--publish", "--docs-only"]);+ assert!(!ok && out.contains("docs-only OK") && out.contains("swx-bridge.exe missing"), "a version bump and a doc are docs-only:\n{out}");+ // Code is not docs: a source edit, a new resource, a dependency.+ let refused = |what: &str, out: &str| assert!(out.contains("NOT docs-only") && out.contains("publish with --require-live") && !out.contains("swx-bridge.exe missing"), "{what} must be refused:\n{out}");+ std::fs::write(dir.join("src/a.rs"), "fn a() { let _ = 1; }\n").unwrap();+ let (ok, out) = run(&["--publish", "--docs-only"]);+ assert!(!ok && out.contains("src/a.rs changed"));+ refused("a source edit", &out);+ git(&["checkout", "-q", "src/a.rs"]);+ std::fs::write(dir.join("resources/new.json"), "{}\n").unwrap();+ let (ok, out) = run(&["--publish", "--docs-only"]);+ assert!(!ok && out.contains("resources/new.json is new"));+ refused("an untracked resource (it would ship)", &out);+ std::fs::remove_file(dir.join("resources/new.json")).unwrap();+ std::fs::write(dir.join("Cargo.toml"), "[package]\nname = \"swx-bridge\"\nversion = \"9.9.9\"\n\n[dependencies]\nserde = \"2\"\n").unwrap();+ let (ok, out) = run(&["--publish", "--docs-only"]);+ assert!(!ok && out.contains("Cargo.toml changed beyond the package's own version"));+ refused("a dependency change", &out);+ let _ = std::fs::remove_dir_all(&dir);+}++/// THE CANARY IS WHAT SHIPS (the canary flow, after 0.11.4). Only a PUBLISHED+/// build reaches the test machine, so `release.sh --canary` publishes the build+/// as a release CANDIDATE no one else gets: a release `<ver>-rc<N>` and the+/// page file `manifests/canary.json`, committed, which records the code commit+/// and the exe inside the zip. `--require-live <report> --publish` then+/// publishes THAT zip byte for byte, and only when the report says it ran that+/// exe (read back from the installed copy) and no code changed since. Run for+/// real in a scratch repo whose PATH cannot reach the real `adom-wiki`: a stub+/// records every call and plays the page. (Skipped where bash, git, python3,+/// zip or unzip is missing.)+#[test]+fn a_canary_is_staged_for_the_test_machine_and_the_publish_promotes_exactly_it() {+ use sha2_free::sha256_hex;+ let root = Path::new(env!("CARGO_MANIFEST_DIR"));+ let have = |tool: &str| std::process::Command::new("bash").args(["-c", &format!("PATH=/usr/bin:/bin command -v {tool}")]).output().map(|o| o.status.success()).unwrap_or(false);+ if !(have("bash") && have("git") && have("python3") && have("zip") && have("unzip") && have("sha256sum")) {+ eprintln!("skipped: a tool the release script needs is not in /usr/bin:/bin");+ return;+ }+ let dir = std::env::temp_dir().join(format!("swx-canary-{}", std::process::id()));+ let _ = std::fs::remove_dir_all(&dir);+ for d in ["tools", "bin", "src", "resources", "target/x86_64-pc-windows-gnu/release", "pagefiles", "rc-assets", "out"] {+ std::fs::create_dir_all(dir.join(d)).unwrap();+ }+ for t in ["release.sh", "check-docs-only.py", "check-live-report.py"] {+ std::fs::copy(root.join("tools").join(t), dir.join("tools").join(t)).unwrap();+ }+ let write = |p: &str, s: &str| std::fs::write(dir.join(p), s).unwrap();+ write("tools/sync-page.py", "import sys\nsys.exit(0)\n");+ write("tools/verify-wiki.py", "import sys\nprint('verify stub', sys.argv[1:])\nsys.exit(0)\n");+ // The stub wiki: logs every call; `repo push` of the canary "serves" it;+ // `api` serves it back; `release upload` stores the asset, `release download` hands it out.+ let log = dir.join("wiki.log");+ write(+ "bin/adom-wiki",+ &format!(+ "#!/bin/bash\nD='{d}'\necho \"$*\" >> \"$D/wiki.log\"\ncase \"$1 $2\" in\n\+ 'repo push') [ -f \"$D/stale-page\" ] && exit 0; for f in \"$@\"; do [ \"$f\" = manifests/canary.json ] && cp manifests/canary.json \"$D/pagefiles/canary.json\"; done; exit 0 ;;\n\+ 'api '*) [ -f \"$D/pagefiles/canary.json\" ] && cat \"$D/pagefiles/canary.json\" && exit 0; exit 1 ;;\n\+ 'release upload') cp \"$5\" \"$D/rc-assets/$4.zip\"; exit 0 ;;\n\+ 'release download') out=\"\"; prev=\"\"; for a in \"$@\"; do [ \"$prev\" = --out ] && out=\"$a\"; prev=\"$a\"; done; \+ [ -f \"$D/rc-assets/$4.zip\" ] && cp \"$D/rc-assets/$4.zip\" \"$out\"; exit 0 ;;\n\+ *) exit 0 ;;\nesac\n",+ d = dir.display()+ ),+ );+ #[cfg(unix)]+ {+ use std::os::unix::fs::PermissionsExt;+ std::fs::set_permissions(dir.join("bin/adom-wiki"), std::fs::Permissions::from_mode(0o755)).unwrap();+ }+ write("BRIDGE_VERSION", "9.9.9\n");+ write("bridge.json", "{\"name\": \"solidworks\", \"version\": \"9.9.9\"}\n");+ write("LICENSE", "MIT\n");+ write("package.json", "{\"version\": \"9.9.9\"}\n");+ write("page.json", "{}\n");+ write("resources/r.txt", "r\n");+ write("src/a.rs", "fn a() {}\n");+ write("Cargo.toml", "[package]\nname = \"swx-bridge\"\nversion = \"9.9.9\"\n");+ write(".gitignore", "/dist/\n/target/\n/out/\n/pagefiles/\n/rc-assets/\n/bin/\nwiki.log\n");+ let main_url = "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json";+ write("adom-bridge-solidworks-manifest.json", &format!("{{\"manifest_version\": 1, \"name\": \"solidworks\", \"version\": \"9.9.8\", \"url\": \"u\", \"sha256\": \"s\", \"size\": 1, \"updateManifestUrl\": \"{main_url}\"}}\n"));+ std::thread::sleep(std::time::Duration::from_millis(1100));+ write("target/x86_64-pc-windows-gnu/release/swx-bridge.exe", "EXE-v1");+ let exe_sha = sha256_hex(b"EXE-v1");+ let git = |args: &[&str]| {+ let o = std::process::Command::new("git").args(args).current_dir(&dir).output().unwrap();+ assert!(o.status.success(), "git {args:?}: {}", String::from_utf8_lossy(&o.stderr));+ String::from_utf8_lossy(&o.stdout).trim().to_string()+ };+ git(&["init", "-q"]);+ git(&["config", "user.email", "[email protected]"]);+ git(&["config", "user.name", "t"]);+ git(&["add", "-A"]);+ git(&["commit", "-qm", "manifest: 9.9.8 as published"]);+ let code_commit = git(&["log", "-1", "--format=%H", "--", "src", "resources", "Cargo.toml"]);+ // ONLY the stub can be reached: ~/.local/bin (the real adom-wiki) is not on this PATH.+ let path = format!("{}:/usr/bin:/bin", dir.join("bin").display());+ let which = std::process::Command::new("bash").args(["-c", "command -v adom-wiki"]).env("PATH", &path).output().unwrap();+ assert_eq!(String::from_utf8_lossy(&which.stdout).trim(), dir.join("bin/adom-wiki").display().to_string(), "the stub, and only the stub, is adom-wiki");+ let run = |args: &[&str]| -> (bool, String) {+ let o = std::process::Command::new("bash").arg("tools/release.sh").args(args).current_dir(&dir).env("PATH", &path).output().unwrap();+ (o.status.success(), format!("{}{}", String::from_utf8_lossy(&o.stdout), String::from_utf8_lossy(&o.stderr)))+ };+ let wiki = || std::fs::read_to_string(&log).unwrap_or_default();+ // ── THE CANARY ──+ let (ok, out) = run(&["--canary"]);+ assert!(ok, "--canary stages the candidate:\n{out}\n{}", wiki());+ let calls = wiki();+ let at = |needle: &str| calls.find(needle).unwrap_or_else(|| panic!("no {needle:?} in the wiki calls:\n{calls}"));+ assert!(at("release create adom/solidworks-bridge 9.9.9-rc1") < at("release upload adom/solidworks-bridge 9.9.9-rc1 dist/swx-bridge-v9.9.9.zip --platform any"));+ assert!(at("release upload adom/solidworks-bridge 9.9.9-rc1") < at("release verify adom/solidworks-bridge 9.9.9-rc1"));+ assert!(at("release verify") < at("repo push adom/solidworks-bridge --files manifests/canary.json"));+ let canary: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(dir.join("manifests/canary.json")).unwrap()).unwrap();+ let zip_sha = sha256_hex(&std::fs::read(dir.join("dist/swx-bridge-v9.9.9.zip")).unwrap());+ assert_eq!(canary["version"], "9.9.9");+ assert_eq!(canary["url"], "https://wiki.adom.inc/download/adom/solidworks-bridge/9.9.9-rc1/swx-bridge-v9.9.9.zip");+ assert_eq!(canary["sha256"], zip_sha.as_str());+ assert_eq!(canary["updateManifestUrl"], main_url, "the canary never pins the test machine: it points at the main manifest");+ assert_eq!(canary["canary"]["rc"], "9.9.9-rc1");+ assert_eq!(canary["canary"]["codeCommit"], code_commit.as_str());+ assert_eq!(canary["canary"]["exeSha256"], exe_sha.as_str());+ assert_eq!(git(&["log", "-1", "--format=%s"]), format!("canary: 9.9.9-rc1 (sha256 {}…, {} bytes)", &zip_sha[..8], canary["size"]), "the canary is committed");+ assert!(git(&["status", "--porcelain"]).is_empty(), "and leaves the tree clean: the main manifest untouched");+ assert!(out.contains("bridge_install '{\"manifestUrl\":\"https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/manifests/canary.json\"}'")+ && out.contains("python3 tools/cswa-check.py --target adom_drew2 --report auto")+ && out.contains("tools/release.sh --require-live"), "it prints the install, the live check and the publish:\n{out}");+ // A second canary of the same version is the next candidate.+ std::fs::write(&log, "").unwrap();+ let (ok, out) = run(&["--canary"]);+ assert!(ok && wiki().contains("release create adom/solidworks-bridge 9.9.9-rc2"), "the next candidate is rc2:\n{out}\n{}", wiki());+ let canary: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(dir.join("manifests/canary.json")).unwrap()).unwrap();+ assert_eq!(canary["canary"]["rc"], "9.9.9-rc2");+ // --canary publishes nothing else, and records only what is committed.+ let (ok, out) = run(&["--canary", "--publish"]);+ assert!(!ok && out.contains("run it alone"), "{out}");+ std::fs::write(dir.join("resources/r.txt"), "r2\n").unwrap();+ std::fs::write(&log, "").unwrap();+ let (ok, out) = run(&["--canary"]);+ assert!(!ok && out.contains("uncommitted changes to what the canary would hold") && !wiki().contains("release create"), "{out}");+ git(&["checkout", "-q", "resources/r.txt"]);+ // ── THE PUBLISH PROMOTES IT ──+ let report = |exe: Option<&str>, zip: Option<&str>| {+ let mut r = serde_json::json!({"tool": "cswa-check", "bridgeVersion": "9.9.9", "ran": 1, "passed": 1, "allPassed": true, "stopped": null,+ "whenEpoch": 4_000_000_000u64, "when": "later", "summary": "1 of 1 CSWA parts within tolerance", "parts": []});+ if let Some(e) = exe {+ r["bridge"] = serde_json::json!({"exeSha256": e, "zipSha256": zip});+ }+ let p = dir.join("out").join(format!("report-{}.json", exe.map(|e| &e[..6]).unwrap_or("none")));+ std::fs::write(&p, r.to_string()).unwrap();+ p.display().to_string()+ };+ let rc2_sha = canary["sha256"].as_str().unwrap().to_string();+ let refused = |what: &str, args: &[&str], needle: &str| {+ std::fs::write(&log, "").unwrap();+ let (ok, out) = run(args);+ assert!(!ok && out.contains(needle), "{what} must be refused ({needle:?}):\n{out}");+ assert!(!wiki().contains("release create adom/solidworks-bridge 9.9.9 "), "{what}: nothing was published:\n{}", wiki());+ };+ refused("a report of another exe", &["--require-live", &report(Some(&"0".repeat(64)), None), "--publish"], "not the one being published");+ refused("a report that does not say which build it ran", &["--require-live", &report(None, None), "--publish"], "does not say which build it ran");+ refused("a report installed from another zip", &["--require-live", &report(Some(&exe_sha), Some(&"1".repeat(64))), "--publish"], "not the canary being published");+ // Code committed after the canary: the canary is stale.+ std::fs::write(dir.join("src/a.rs"), "fn a() { let _ = 2; }\n").unwrap();+ git(&["commit", "-qam", "a code change after the canary"]);+ refused("a canary older than the code", &["--require-live", &report(Some(&exe_sha), Some(&rc2_sha)), "--publish"], "the code changed since the canary 9.9.9-rc2");+ git(&["reset", "-q", "--hard", "HEAD~1"]);+ // A canary of another version, and a canary whose record names another exe.+ std::fs::write(dir.join("BRIDGE_VERSION"), "9.9.10\n").unwrap();+ refused("a canary of another version", &["--require-live", &report(Some(&exe_sha), Some(&rc2_sha)), "--publish"], "the canary is 9.9.9-rc2 (version 9.9.9), not 9.9.10");+ std::fs::write(dir.join("BRIDGE_VERSION"), "9.9.9\n").unwrap();+ let real = std::fs::read_to_string(dir.join("manifests/canary.json")).unwrap();+ std::fs::write(dir.join("manifests/canary.json"), real.replace(&exe_sha, &"2".repeat(64))).unwrap();+ refused("a canary record that names another exe", &["--require-live", &report(Some(&exe_sha), Some(&rc2_sha)), "--publish"], "the canary record names exe");+ std::fs::write(dir.join("manifests/canary.json"), &real).unwrap();+ // The zip on disk is not the canary's, and the wiki cannot hand it back.+ let good_zip = std::fs::read(dir.join("rc-assets/9.9.9-rc2.zip")).unwrap();+ assert_eq!(sha256_hex(&good_zip), rc2_sha, "the stub kept the uploaded candidate");+ std::fs::write(dir.join("dist/swx-bridge-v9.9.9.zip"), b"tampered").unwrap();+ std::fs::remove_file(dir.join("rc-assets/9.9.9-rc2.zip")).unwrap();+ refused("a zip that is not the canary's", &["--require-live", &report(Some(&exe_sha), Some(&rc2_sha)), "--publish"], "neither in dist/ nor downloadable intact");+ // ...but the canary's own asset, downloaded, is.+ std::fs::write(dir.join("rc-assets/9.9.9-rc2.zip"), &good_zip).unwrap();+ std::fs::write(&log, "").unwrap();+ let (ok, out) = run(&["--require-live", &report(Some(&exe_sha), Some(&rc2_sha)), "--publish"]);+ assert!(ok, "a passing live report of the canary publishes it:\n{out}\n{}", wiki());+ assert!(out.contains("PROMOTING the canary 9.9.9-rc2") && out.contains("downloading 9.9.9-rc2"), "{out}");+ assert_eq!(sha256_hex(&std::fs::read(dir.join("dist/swx-bridge-v9.9.9.zip")).unwrap()), rc2_sha, "NO REBUILD: the zip that ships is the canary's, byte for byte");+ let calls = wiki();+ assert!(calls.contains("release create adom/solidworks-bridge 9.9.9 ") && calls.contains("release upload adom/solidworks-bridge 9.9.9 dist/swx-bridge-v9.9.9.zip --platform any"), "{calls}");+ let man: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(dir.join("adom-bridge-solidworks-manifest.json")).unwrap()).unwrap();+ assert_eq!(man["sha256"], rc2_sha.as_str(), "the main manifest names the canary's bytes");+ assert_eq!(man["url"], "https://wiki.adom.inc/download/adom/solidworks-bridge/9.9.9/swx-bridge-v9.9.9.zip");+ assert_eq!(git(&["log", "-1", "--format=%s"]), format!("manifest: 9.9.9 as published (sha256 {}…, {} bytes)", &rc2_sha[..8], good_zip.len()));+ assert!(out.contains(&format!("bridge_install '{{\"manifestUrl\":\"{main_url}\"}}'")), "it says how to re-point the test machine if it is still on the canary:\n{out}");+ // A page that does not serve the canary just pushed is caught on the read-back.+ // (The exe is rebuilt first: the reset above rewrote src/a.rs, newer than it.)+ std::thread::sleep(std::time::Duration::from_millis(1100));+ std::fs::write(dir.join("target/x86_64-pc-windows-gnu/release/swx-bridge.exe"), "EXE-v1").unwrap();+ std::fs::write(dir.join("stale-page"), "").unwrap();+ std::fs::write(&log, "").unwrap();+ let (ok, out) = run(&["--canary"]);+ assert!(!ok && out.contains("ERROR: the page does not serve this canary"), "a stale page must fail the canary:\n{out}");+ let _ = std::fs::remove_dir_all(&dir);+}++/// A small, dependency-free sha256 for the canary test (the crate has no+/// sha2 dependency): the reference algorithm, FIPS 180-4.+mod sha2_free {+ pub fn sha256_hex(data: &[u8]) -> String {+ const K: [u32; 64] = [+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be,+ 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa,+ 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85,+ 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,+ 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,+ ];+ let mut h: [u32; 8] = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];+ let mut msg = data.to_vec();+ let bits = (data.len() as u64).wrapping_mul(8);+ msg.push(0x80);+ while msg.len() % 64 != 56 {+ msg.push(0);+ }+ msg.extend_from_slice(&bits.to_be_bytes());+ for chunk in msg.chunks(64) {+ let mut w = [0u32; 64];+ for i in 0..16 {+ w[i] = u32::from_be_bytes([chunk[4 * i], chunk[4 * i + 1], chunk[4 * i + 2], chunk[4 * i + 3]]);+ }+ for i in 16..64 {+ let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3);+ let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10);+ w[i] = w[i - 16].wrapping_add(s0).wrapping_add(w[i - 7]).wrapping_add(s1);+ }+ let mut v = h;+ for i in 0..64 {+ let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25);+ let ch = (v[4] & v[5]) ^ (!v[4] & v[6]);+ let t1 = v[7].wrapping_add(s1).wrapping_add(ch).wrapping_add(K[i]).wrapping_add(w[i]);+ let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22);+ let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]);+ let t2 = s0.wrapping_add(maj);+ v = [t1.wrapping_add(t2), v[0], v[1], v[2], v[3].wrapping_add(t1), v[4], v[5], v[6]];+ }+ for i in 0..8 {+ h[i] = h[i].wrapping_add(v[i]);+ }+ }+ h.iter().map(|x| format!("{x:08x}")).collect()+ }++ #[test]+ fn the_test_sha256_is_the_real_one() {+ assert_eq!(sha256_hex(b""), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");+ assert_eq!(sha256_hex(b"abc"), "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");+ }+}
tools/check-docs-only.pyadded+80@@ -0,0 +1,80 @@+#!/usr/bin/env python3+"""check-docs-only.py [<since>] - the gate behind tools/release.sh --publish --docs-only (0.11.4).++A docs-only release skips the live CSWA gate, so it may change NOTHING the bridge runs. Exit 0 only when,+since <since> (default: the last commit that touched the release manifest = the last publish), nothing+changed in src/ or resources/ (committed, uncommitted or untracked: resources/ ships in the zip as it is+on disk), and Cargo.toml / Cargo.lock changed in nothing but THIS package's own version (the bump every+release makes; a dependency's version is code). Prints every offending path.+"""+import re, subprocess, sys++MAN = "adom-bridge-solidworks-manifest.json"+CODE = ["src", "resources"]+++def git(*args, ok=False):+ r = subprocess.run(["git", *args], capture_output=True, text=True)+ if r.returncode != 0:+ if ok:+ return None+ raise SystemExit(f" git {' '.join(args)} failed: {r.stderr.strip()}")+ return r.stdout+++def package_name(toml):+ m = re.search(r'^\[package\]\s*$(.*?)(?=^\[|\Z)', toml, re.M | re.S)+ n = m and re.search(r'^name\s*=\s*"([^"]*)"', m.group(1), re.M)+ return n.group(1) if n else None+++def without_own_version(name, text, pkg):+ """The file with this package's own version line blanked out."""+ if name == "Cargo.toml":+ def blank(m):+ return re.sub(r'^version\s*=\s*"[^"]*"\s*$', 'version = "<own>"', m.group(0), count=1, flags=re.M)+ return re.sub(r'^\[package\]\s*$.*?(?=^\[|\Z)', blank, text, count=1, flags=re.M | re.S)+ # Cargo.lock: the version line right after `name = "<pkg>"`.+ return re.sub(r'(^name = "' + re.escape(pkg or "") + r'"\nversion = )"[^"]*"', r'\1"<own>"', text, count=1, flags=re.M)+++def offending(since):+ bad = []+ # Working tree against <since>: committed AND uncommitted changes.+ for path in git("diff", "--name-only", since, "--", *CODE).split():+ bad.append(f"{path} changed since {since[:8]}")+ for path in git("ls-files", "--others", "--exclude-standard", "--", *CODE).split():+ bad.append(f"{path} is new (untracked) - resources/ ships in the zip as it is on disk")+ pkg = package_name(open("Cargo.toml").read()) if __import__("os").path.isfile("Cargo.toml") else None+ for name in ("Cargo.toml", "Cargo.lock"):+ old = git("show", f"{since}:{name}", ok=True)+ try:+ new = open(name).read()+ except OSError:+ new = None+ if old is None and new is None:+ continue+ if old is None or new is None:+ bad.append(f"{name} was {'added' if old is None else 'removed'} since {since[:8]}")+ elif without_own_version(name, old, pkg) != without_own_version(name, new, pkg):+ bad.append(f"{name} changed beyond the package's own version since {since[:8]}")+ return bad+++def main(argv):+ since = argv[1] if len(argv) > 1 else git("log", "-1", "--format=%H", "--", MAN).strip()+ if not since:+ print(f" no commit has touched {MAN} - nothing was ever published to compare with")+ return 1+ bad = offending(since)+ for b in bad:+ print(" " + b)+ if bad:+ print(f"NOT docs-only: the bridge's code changed since {since[:8]} - publish with --require-live <cswa-check report>")+ return 1+ print(f"docs-only OK: nothing in src/ or resources/, and nothing in Cargo.toml / Cargo.lock but the version, changed since {since[:8]}")+ return 0+++if __name__ == "__main__":+ sys.exit(main(sys.argv))
tools/check-live-report.py+53−10@@ -1,12 +1,26 @@ #!/usr/bin/env python3-"""check-live-report.py <report.json> <version> <last-code-commit-epoch> - the gate behind-tools/release.sh --require-live (0.11.0). Exit 0 only for a tools/cswa-check.py report that ran every-CSWA part and passed them all, was made by THIS bridge version, did not stop, and is NEWER than the-last commit that touched code."""-import json, os, sys+"""check-live-report.py <report.json> <version> <last-code-commit-epoch> [--exe-sha <sha256>] [--zip-sha <sha256>]+- the gate behind tools/release.sh --require-live (0.11.0). +Exit 0 only for a tools/cswa-check.py report that ran every CSWA part and passed them all, was made by THIS+bridge version, did not stop, and is NEWER than the last commit that touched code. EVERY part means every spec+shipped in resources/cswa/ (0.11.4): a run narrowed with --only proves nothing about the parts it left out, and a+part may be skipped only for the reason the checker gives a part that needs an op the bridge lacks. -def problems(r, ver, code_at):+WHICH BUILD RAN (the canary gate): with --exe-sha, the report must say (report.bridge.exeSha256, read back from the+test machine's INSTALLED exe by cswa-check) that it ran exactly that exe - the one inside the zip being published.+With --zip-sha, a report that names the zip it was installed from (report.bridge.zipSha256) must name that zip.+"""+import glob, json, os, sys++ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))+++def shipped_ids(root=ROOT):+ return sorted(json.load(open(p))["id"] for p in glob.glob(os.path.join(root, "resources", "cswa", "*.json")))+++def problems(r, ver, code_at, shipped=None, exe_sha=None, zip_sha=None): bad = [] if r.get("tool") != "cswa-check": bad.append(f"it is not a cswa-check report (tool={r.get('tool')!r})")@@ -20,24 +34,53 @@ def problems(r, ver, code_at): bad.append(f"the run STOPPED ({r.get('stopped')})") if int(r.get("whenEpoch") or 0) <= code_at: bad.append(f"it is OLDER than the last code commit ({r.get('when')} vs epoch {code_at})")+ if shipped is not None:+ parts = {p.get("id"): p for p in r.get("parts") or [] if isinstance(p, dict)}+ missing = [i for i in shipped if i not in parts]+ if missing:+ bad.append(f"it did not run {len(missing)} of the {len(shipped)} shipped parts ({', '.join(missing)}): a partial run (--only?) proves nothing about them")+ for i, p in parts.items():+ why = p.get("skipped")+ if why and not str(why).startswith("needs ops the bridge does not have yet"):+ bad.append(f"{i} was skipped ({why}) - only a part needing an op the bridge lacks may be")+ b = r.get("bridge") if isinstance(r.get("bridge"), dict) else {}+ if exe_sha:+ got = b.get("exeSha256")+ if not got:+ bad.append("it does not say which build it ran (no bridge.exeSha256: a cswa-check older than the canary gate, or ab "+ f"could not read the installed exe back: {b.get('exeWhy') or b.get('why') or 'no bridge facts'}) - re-run tools/cswa-check.py")+ elif got.lower() != exe_sha.lower():+ bad.append(f"it ran exe {got[:12]}…, not the one being published ({exe_sha[:12]}…): install the canary on the test machine and run it again")+ if zip_sha and b.get("zipSha256") and b["zipSha256"].lower() != zip_sha.lower():+ bad.append(f"it was installed from zip {b['zipSha256'][:12]}…, not the canary being published ({zip_sha[:12]}…)") return bad def main(argv):- if len(argv) != 4:+ args, opts = [], {}+ it = iter(argv[1:])+ for a in it:+ if a in ("--exe-sha", "--zip-sha"):+ opts[a] = next(it, "")+ else:+ args.append(a)+ if len(args) != 3: print(__doc__) return 2- path, ver, code_at = argv[1], argv[2], int(argv[3] or 0)+ path, ver, code_at = args[0], args[1], int(args[2] or 0) if not os.path.isfile(path): print(f" the report {path} does not exist") return 1 r = json.load(open(path))- bad = problems(r, ver, code_at)+ bad = problems(r, ver, code_at, shipped_ids(), opts.get("--exe-sha") or None, opts.get("--zip-sha") or None) for b in bad: print(" " + b) if bad: return 1- print(f"live CSWA report OK: {r.get('summary')} on SOLIDWORKS {(r.get('solidworks') or {}).get('majorVersion')}, {r.get('when')}")+ which = ""+ if opts.get("--exe-sha"):+ which = f"; it ran exe {opts['--exe-sha'][:12]}…, the one being published"+ print(f"live CSWA report OK: {r.get('summary')} on SOLIDWORKS {(r.get('solidworks') or {}).get('majorVersion')}, {r.get('when')}{which}") return 0
tools/cswa-check.py+183−7@@ -6,16 +6,19 @@ sometimes volume / centre of mass / surface area), the material, and the swx_run it. Each part is built through the bridge, weighed with swx_mass_properties, and compared with the key within the spec's tolerance (CSWA accepts about 1 %). Nothing is trusted that was not measured. - python3 tools/cswa-check.py [--target adom_drew2] [--only cswa-00-lego-2x4] [--fresh] [--keep]+ python3 tools/cswa-check.py [--target adom_drew2] [--report auto|<path>] [--only cswa-00-lego-2x4] [--fresh] [--keep]+ python3 tools/cswa-check.py --derivations # re-derive every derived key (no bridge call) Same rules as tools/dsl-live-check.py: every creation says purpose:"bridge"; by default the parts are built in ONE bridge-made part (reuseDocument: its leading new_part becomes clear_part), so N parts cost one document; the run STOPS on a user_present / low_commit_memory / dialog refusal and never creates another part after one. The report (every reply, every expectation, pass/fail) is written-to cswa-report.json; tools/release.sh --require-live <report> refuses to publish without a passing-one newer than the last code commit.+to cswa-report.json (--report auto: tools/cswa/reports/cswa-<date>-sw<year>-<version>.json);+tools/release.sh --require-live <report> refuses to publish without a passing one newer than the last code+commit. The report also says WHICH BUILD ran (`bridge`: the installed exe's sha256, read back through ab), and+the publish ships only the canary zip holding that exe (README, "Live validation"). """-import argparse, glob, json, math, os, subprocess, sys, time+import argparse, base64, glob, hashlib, json, math, os, re, subprocess, sys, time TARGET = "adom_drew2" THREAD = "SolidWorks Bridge"@@ -152,13 +155,20 @@ def resolve_extends(spec, by_id, depth=0): if depth > 8: raise ValueError(f"{spec['id']}: extends goes more than 8 deep") merged = resolve_extends(by_id[base_id], by_id, depth + 1)- merged.pop("needsOps", None)+ # What is true of the BASE part only is not inherited (src/cswa.rs::resolve_extends).+ for k in ("needsOps", "derivation", "simulatorSkips"):+ merged.pop(k, None) variables = dict(merged.get("variables") or {}) variables.update(spec.get("variables") or {}) for k, v in spec.items(): if k not in ("extends", "variables", "scriptAppend", "derivedAppend"): merged[k] = v merged["variables"] = variables+ # A derivedAppend name the base already derives would shadow it (src/cswa.rs::resolve_extends).+ taken = {p[0] for p in merged.get("derived") or []}+ for name, _ in spec.get("derivedAppend") or []:+ if name in taken:+ raise ValueError(f"{spec['id']}: derivedAppend redefines {name!r}, which {base_id} already derives - name it differently") for key, into in (("scriptAppend", "script"), ("derivedAppend", "derived")): if key in spec: merged.setdefault(into, []).extend(spec[key])@@ -186,6 +196,156 @@ def expand(spec, by_id): return spec +def spec_vars(spec):+ """The spec's variables and derived values, by the spec grammar (as expand() computes them)."""+ vars_ = {k: float(v) for k, v in (spec.get("variables") or {}).items()}+ for name, ex in spec.get("derived") or []:+ vars_[name] = evaluate(ex, vars_)+ return vars_+++QUANTITIES = ("massG", "volumeMm3", "centerOfMassMm", "surfaceAreaMm2")+++def check_derivation(spec, raw):+ """0.11.4: a DERIVED key must be reproducible. Evaluate the spec's `derivation` ([name, Python+ expression] pairs, in order; math's functions and the spec's variables in scope) and compare every+ quantity it yields with the key: within 1e-6 (relative, or absolute below 1). Returns (values, problems)."""+ import math as _m+ ns = {k: getattr(_m, k) for k in dir(_m) if not k.startswith("_")}+ ns.update({"abs": abs, "min": min, "max": max, "sum": sum, "len": len, "round": round, "range": range})+ ns.update(spec_vars(raw))+ problems, values = [], {}+ for name, ex in spec.get("derivation") or []:+ try:+ ns[name] = eval(ex, {"__builtins__": {}}, ns) # noqa: S307 - the repo's own spec files, a reviewer's tool+ except Exception as e: # pragma: no cover - reported+ problems.append(f"{name} = {ex}: {type(e).__name__}: {e}")+ return values, problems+ if name in QUANTITIES:+ values[name] = ns[name]+ exp = spec.get("expected") or {}+ if "massG" not in values:+ problems.append("the derivation does not yield massG")+ for q in QUANTITIES:+ if exp.get(q) is None:+ continue+ if q not in values:+ problems.append(f"the key has {q} but the derivation does not yield it")+ continue+ got, want = values[q], exp[q]+ pairs = list(zip(got, want)) if isinstance(want, list) else [(got, want)]+ if isinstance(want, list) and (not isinstance(got, (list, tuple)) or len(got) != len(want)):+ problems.append(f"{q}: the derivation gives {got}, the key {want}")+ continue+ for g, w in pairs:+ if abs(g - w) > 1e-6 * max(1.0, abs(w)):+ problems.append(f"{q}: the derivation gives {got}, the key says {want}")+ break+ return values, problems+++# ── WHICH BUILD RAN (the canary gate) ─────────────────────────────────────────+# tools/release.sh --publish ships the exact zip a live run tested (the canary), and refuses a report that does+# not say which build it ran. The bridge cannot hash the zip it came in (ab unzips it), so the facts come from+# ab, read-only: bridge_info (the install path), the INSTALLED exe read back through read_file (base64, in+# ranges) and hashed here, and - best effort - the manifest ab installed it from (its zip sha256, which ab+# checked before extracting).+WIKI = "https://wiki.adom.inc"+++def remote_sha256(path, chunk=1_000_000):+ """sha256 of a file on the target, read back through ab's read_file in ranges. (hex, None) or (None, why)."""+ h, off, total = hashlib.sha256(), 0, None+ for _ in range(64):+ r = call("read_file", {"path": path, "encoding": "base64", "offset": off, "length": chunk}, timeout=120)+ if not isinstance(r, dict) or r.get("success") is False or r.get("content") is None:+ return None, f"read_file {path}: {str(r)[:200]}"+ data = base64.b64decode(r["content"])+ h.update(data)+ total = r.get("totalSize", r.get("size"))+ off = r.get("nextOffset", off + len(data))+ if r.get("eof") or not data or (total is not None and off >= total):+ return h.hexdigest(), None+ return None, f"read_file {path}: more than 64 ranges"+++def installed_from():+ """The manifest URL ab installed the bridge from (~/.adom/bridge-install-urls.json on the target), or None."""+ r = call("read_file", {"path": "~/.adom/bridge-install-urls.json"}, timeout=60)+ try:+ d = json.loads(r.get("content") or "")+ except (AttributeError, ValueError):+ return None+ if isinstance(d, dict):+ for k in ("bridges", "urls"):+ if isinstance(d.get(k), (dict, list)):+ d = d[k]+ break+ entries = d.items() if isinstance(d, dict) else [((e or {}).get("name"), e) for e in d if isinstance(e, dict)] if isinstance(d, list) else []+ for name, v in entries:+ if name == "solidworks":+ return v if isinstance(v, str) else (v or {}).get("manifestUrl") or (v or {}).get("url")+ return None+++def wiki_json(url):+ """A wiki page file as JSON: https://wiki.adom.inc/api/v1/pages/<slug>/files/<path>, or the page form+ https://wiki.adom.inc/<owner>/<slug>/files/<path>, read with adom-wiki api (authenticated)."""+ m = re.match(r"^https://wiki\.adom\.inc(/api/v1/pages/[^/]+/files/.+)$", url or "")+ if not m:+ m2 = re.match(r"^https://wiki\.adom\.inc/[^/]+/([^/]+)/files/(.+)$", url or "")+ if not m2:+ return None+ api = f"/api/v1/pages/{m2.group(1)}/files/{m2.group(2)}"+ else:+ api = m.group(1)+ try:+ out = subprocess.run(["adom-wiki", "api", api], capture_output=True, text=True, timeout=60).stdout+ return json.loads(out)+ except (OSError, subprocess.TimeoutExpired, ValueError):+ return None+++def bridge_facts():+ facts = {"source": "ab bridge_info + read_file (read-only)"}+ info = call("bridge_info", {"name": "solidworks"}, timeout=60)+ if not isinstance(info, dict) or info.get("success") is False or info.get("status") == "error":+ facts["why"] = f"bridge_info failed: {str(info)[:200]}"+ return facts+ facts.update({"version": info.get("version"), "installPath": info.get("installPath"), "manifestUrl": info.get("manifestUrl"),+ "installSource": info.get("source")})+ path = (info.get("installPath") or "").rstrip("\\/")+ if path:+ facts["exeSha256"], why = remote_sha256(path + "\\swx-bridge.exe")+ if why:+ facts["exeWhy"] = why+ facts["bridgeJsonSha256"], _ = remote_sha256(path + "\\bridge.json")+ else:+ facts["exeSha256"], facts["exeWhy"] = None, "bridge_info gave no installPath"+ src = installed_from()+ facts["installedFrom"] = src+ m = wiki_json(src) if src else None+ if isinstance(m, dict):+ facts["zipSha256"] = m.get("sha256")+ facts["installedManifestVersion"] = m.get("version")+ if m.get("canary"):+ facts["canary"] = m.get("canary")+ return facts+++def report_path(arg, st, sw):+ """--report auto: tools/cswa/reports/cswa-<UTC date>-sw<year>-<bridge version>.json (never overwriting one)."""+ if arg != "auto":+ return arg+ year = (sw.get("versionSupport") or {}).get("year") or (sw.get("majorVersion") or 0) + 1992+ base = os.path.join(ROOT, "tools", "cswa", "reports", f"cswa-{time.strftime('%Y-%m-%d', time.gmtime())}-sw{year}-{st.get('bridgeVersion')}")+ path, n = base + ".json", 2+ while os.path.exists(path):+ path, n = f"{base}-{n}.json", n + 1+ return path++ def ok(r): return isinstance(r, dict) and r.get("success") is not False and r.get("status") != "error" @@ -236,8 +396,9 @@ def main(): ap.add_argument("--only", default="") ap.add_argument("--fresh", action="store_true", help="a fresh part per spec instead of one reused part") ap.add_argument("--keep", action="store_true", help="leave the parts open")- ap.add_argument("--report", default="cswa-report.json")+ ap.add_argument("--report", default="cswa-report.json", help="the report path, or auto: tools/cswa/reports/cswa-<date>-sw<year>-<version>.json") ap.add_argument("--expand-only", action="store_true", help="print every spec's script with its variables substituted, and stop (no bridge call)")+ ap.add_argument("--derivations", action="store_true", help="re-derive every derived key from its spec's `derivation` and compare (no bridge call)") a = ap.parse_args() TARGET = a.target raw = [json.load(open(p)) for p in sorted(glob.glob(os.path.join(ROOT, "resources", "cswa", "*.json")))]@@ -246,6 +407,17 @@ def main(): if a.expand_only: print(json.dumps({s["id"]: {"script": s.get("script"), "expected": s.get("expected"), "needsOps": s.get("needsOps") or []} for s in specs})) return 0+ if a.derivations:+ out, bad = {}, 0+ for spec in specs:+ if not spec.get("derivation"):+ continue+ values, problems = check_derivation(spec, resolve_extends(by_id[spec["id"]], by_id))+ out[spec["id"]] = {"derived": values, "expected": spec.get("expected"), "problems": problems, "ok": not problems}+ bad += bool(problems)+ print(json.dumps(out, indent=1))+ print(f"{len(out) - bad} of {len(out)} derived keys reproduced", file=sys.stderr)+ return 1 if bad else 0 only = {x.strip() for x in a.only.split(",") if x.strip()} st = call("swx_status", {"reason": "cswa-check: is SOLIDWORKS ready"}) sw = st.get("solidworks") or {}@@ -254,6 +426,10 @@ def main(): if not sw.get("running"): print("SOLIDWORKS is not running on the target: start it (swx_start) and run again. Nothing was done.") return 2+ a.report = report_path(a.report, st, sw)+ facts = bridge_facts()+ print(f"bridge build: exe sha256 {(facts.get('exeSha256') or 'UNREAD - ' + str(facts.get('exeWhy') or facts.get('why')))[:76]}"+ f" | installed from {facts.get('installedFrom') or '?'}") shared = None if not a.fresh: nd = call("swx_new_document", {"type": "part", "purpose": "bridge", "reason": "cswa-check: the one part every CSWA spec is built in"})@@ -309,7 +485,7 @@ def main(): ran = [r for r in results if "skipped" not in r] passed = sum(1 for r in ran if r.get("pass")) report = {"tool": "cswa-check", "when": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), "whenEpoch": int(time.time()),- "target": TARGET, "bridgeVersion": st.get("bridgeVersion"),+ "target": TARGET, "bridgeVersion": st.get("bridgeVersion"), "bridge": facts, "solidworks": {k: sw.get(k) for k in ("majorVersion", "edition", "versionSupport")}, "summary": f"{passed} of {len(ran)} CSWA parts within tolerance", "passed": passed, "ran": len(ran), "skipped": len(results) - len(ran), "stopped": stopped, "allPassed": bool(ran) and passed == len(ran) and not stopped,
tools/cswa/README.md+60−16@@ -1,4 +1,4 @@-# The CSWA benchmark (0.11.0)+# The CSWA benchmark (0.11.0; community parts, Step 4 and the live gate 0.11.4) > "Pull 3-5 random parts from CSWA exams as part of our e2e testing/validation for > each release. We can also use those as benchmarks for new feature developments."@@ -14,7 +14,8 @@ ship in the release zip (`resources/cswa/`) and are embedded in the exe. |---|---|---| | Live, from a dev container | `python3 tools/cswa-check.py [--target adom_drew2] [--only <id>] [--fresh] [--keep]` | mass, and volume / surface area / centre of mass when the key has them; writes `cswa-report.json` | | On the desktop, through the bridge | `swx_selftest {"level":"cswa"}` (`only:[ids]`) | the same, with the same presence and memory rules as `level:"write"`; summary `"N of M CSWA parts within tolerance"` |-| In the simulator | `cargo test --test cswa` | mass and volume only (the arithmetic model's surface area and centre of mass are not exact for every shape) |+| In the simulator | `cargo test --test cswa` | mass and volume, and the centre of mass where the column model made it (never the surface area); a part only SOLIDWORKS can build (`simulatorSkips`) is skipped there, saying why |+| Re-deriving the keys | `python3 tools/cswa-check.py --derivations` | every derived key against its spec's `derivation` (no bridge call) | `cswa-check.py` follows `tools/dsl-live-check.py`'s rules: @@ -27,17 +28,34 @@ ship in the release zip (`resources/cswa/`) and are embedded in the exe. ## The release gate ```bash-python3 tools/cswa-check.py --report /tmp/cswa-report.json # on the live target, with THIS build-tools/release.sh --require-live /tmp/cswa-report.json --publish+tools/release.sh --canary # release candidate <ver>-rc<N> + manifests/canary.json+adom-bridge --target adom_drew2 bridge_install '{"manifestUrl":"https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/manifests/canary.json"}'+python3 tools/cswa-check.py --target adom_drew2 --report auto # live, on THAT build; names its report+tools/release.sh --require-live tools/cswa/reports/<that report> --publish # promotes the candidate's exact zip ``` +`cswa-check` records WHICH BUILD it ran in `bridge` (read-only, through ab): `exeSha256`, the+installed exe read back with `read_file` and hashed; `installedFrom` and `zipSha256`, the manifest+ab installed from and the zip it named; `installPath`, `version`. The publish ships the canary's zip+without rebuilding it, and only when `bridge.exeSha256` is the exe inside it.++Since 0.11.4 EVERY publish goes through it: `--publish` alone is refused before anything is built. `--require-live` refuses to go on unless the report (`tools/check-live-report.py`): - comes from `cswa-check`; - was made by THIS bridge version;-- ran at least one part and passed every part it ran;+- ran EVERY spec shipped in `resources/cswa/` (0.11.4: a part may be skipped only for an op the+ bridge lacks; a run narrowed with `--only` is refused) and passed every part it ran; - did not stop;-- is newer than the last commit that touched `src/`, `resources/` or `Cargo.toml`.+- is newer than the last commit that touched `src/`, `resources/` or `Cargo.toml`;+- ran the exe being published (`bridge.exeSha256`), from the canary's zip if it says+ (`bridge.zipSha256`).++The one exception is `--docs-only --publish`, for a release that changes no code+(`tools/check-docs-only.py`: nothing in `src/` or `resources/`, and nothing in Cargo.toml or+Cargo.lock beyond the package's version, since the last publish). Its changelog says the live gate+was skipped. The ritual is in the main README, under "Live validation". Commit each live report in+`reports/` beside the earlier ones. ## Spec schema @@ -57,6 +75,10 @@ tools/release.sh --require-live /tmp/cswa-report.json --publish "tolerancePct": 1.0 // CSWA accepts about 1 % }, "keyBasis": "where the numbers came from, when it is not simply the published key",+ "derivation": [["V", "120*80*12 - ..."], ["volumeMm3", "V"], ["massG", "V*2.7e-3"]], // a DERIVED key, re-derivable (0.11.4)+ "exercises": ["revolve.360", "cut.regions"], // the op variants it builds (a test holds the simulator to it)+ "simulatorSkips": "why only SOLIDWORKS can build it", // optional: skipped in the simulator, run live+ "prediction": {"massG": 434.715, "how": "..."}, // optional: what the rebuild should weigh, when it is not the key "needsOps": [], // ops the bridge lacks: the part is SKIPPED, never half-built "variables": {"A": 81}, "derived": [["xR", "A-14"]], // optional, see below "extends": "<another spec's id>", // optional, see below@@ -69,6 +91,16 @@ Rules: - **The key is the PUBLISHED number,** never one the bridge computed. A spec whose key was derived (spec 0's mass is Michael's measured volume times the density of ABS) says so in `keyBasis`.+- **A COMMUNITY part's key is derived analytically, and the derivation ships with it**+ (0.11.4). `derivation` is a list of `[name, Python expression]` pairs, evaluated in order with+ math's functions and the spec's variables in scope. It must yield `massG`, plus `volumeMm3` and+ `centerOfMassMm` where the key has them, each within 1e-6 of the key:+ `python3 tools/cswa-check.py --derivations` checks every one, and so does `cargo test`.+ Such a key is exact, so the spec holds SOLIDWORKS to 0.1 %, not 1 %. Each spec states that+ 0.1 % tells its readings apart.+- **A `derivedAppend` name may not shadow one the base derives.** If it did, every `"=name"`+ in the base's script would silently take the new value: Step 4's `tpx` once redrew Step 1's+ R5 fillet. Both expanders refuse it. - **A runnable spec must parse** — `cargo test` parses every one (`src/cswa.rs`). - **A spec that needs a missing op** lists it in `needsOps`. That is the backlog: when the op lands, the spec runs.@@ -95,21 +127,33 @@ the two to the same numbers); the bridge itself is only ever sent numbers. | `cswa-05-tool-block-step1` | official sample exam, Q3 | 939.54 g | `line`, `tangentArc` (R19), `polyline`, `arc3` (R29, R5), `sketchChamfer`, a hole in the profile; variables A B C | | `cswa-06-tool-block-step2` | official, Q4 | 1032.32 g | the same script, `extends` with A 84, B 59, C 45 | | `cswa-07-tool-block-step3` | official, Q5 | 628.18 g | a plane offset 12 inside the BACK face, the R41 slot, two face cuts, an Ø11 `hole` |-| `cswa-08-tool-block-step4` | official, Q6 | 432.58 g | SKIPPED: `needsOps: ["offsetEntities"]` (the pocket is the front face's outline offset 1 mm) |+| `cswa-08-tool-block-step4` | official, Q6 | 432.58 g (predicted 434.72, +0.49 %) | `offsetEntities` of the front face's outer loop (−1 mm), sketch regions (`regionsAtMm`) with the R42 / R41 circles, two `offsetFromSurface` cuts (12 from the back face; 1 short of the slot's front wall). LIVE ONLY (`simulatorSkips`) |+| `cswa-08b-tool-block-step4-explicit` | official, Q6 | 432.58 g (predicted 434.72) | the same pocket DRAWN: the inset outline's lines, its R20 arc and the R42 / R41 arcs, every intersection derived in the spec; blind cuts 32 and 7 (the fallback if Offset Entities misbehaves live) |+| `cswa-09-community-stepped-shaft` | community, derived | 103.5689 g, CoM (46.8315, −0.1142, 0) | `revolve` 360, `revolve_cut` 360 (a groove) and 180° mid-plane (a half-depth flat), the sketch's x axis as a construction line |+| `cswa-10-community-mirrored-block` | community, derived | 722.9129 g, CoM (−0.0824, 16.0273, 0) | `mirror` features about Front Plane, bodies about Right Plane, a boss about an offset plane |+| `cswa-11-community-slotted-plate` | community, derived | 276.3593 g, CoM (1.3753, 5.9074, 0.0358) | two `slot`s through all, a hexagon `polygon` pocket, a counterbored and a countersunk `hole` |+| `cswa-12-community-up-to-plates` | community, derived | 369.6875 g, CoM (40.5252, 24.7232, 45.8697) | `upToNext`, `upToSurface` and `offsetFromSurface` bosses, a cut up to a face, a drafted boss and a drafted pocket | The recipes, ambiguities and the reviewer's numeric rebuilds are in [`SOURCES.md`](SOURCES.md) (`tb2.py`, `tb3b.py`, `tb4c.py` beside it). In the simulator every runnable part lands within-0.01 % of its key (`cargo test --test cswa`, `CSWA_PRINT=1` prints the table).+0.01 % of its key, or of its prediction (`cargo test --test cswa`, `CSWA_PRINT=1` prints the table). -## Roadmap (drawings only — not transcribed yet)+**Step 4's reading.** SOURCES.md Part 4, read literally, gives 434.72 g (+0.49 %). The front face's+outer loop is offset 1 mm in. A 1-mm wall stays outside the slot's R41 silhouette (R42). The pocket+outside that wall goes to 12 from the back face. The ear inside R41 is recessed to 1 mm short of the+slot's front wall, leaving a 1-mm skin. The reviewer's best case, 432.86 g, cuts the ear through to+the slot instead, and keeps a 1-mm ring round the Ø11. The drawing cannot tell the two apart+(ambiguity 4), and both are within the exam's 1 %. -| Candidate | Key | Needs |-|---|---|---|-| 2007 sample Q1 (copper, A 63 B 50 C 100) | 1280 g | multi-sketch, angled cuts, concentric bores — a human must read the drawing |-| 2007 sample Q6 (6061, A 100) | 2040.57 g | counterbored hole, R50 saddle, lugs — a human must read the drawing |-| Planchard 3-3 (6061, A 50 B 50 C 120) | 302.40 g, CoM (0, 19.20, 0) | `mirror`, mid-plane extrude, a through-all cut |-| Official chain-link assembly (2017 sample) | CoM (348.66, −88.48, −91.40) at A 25° B 125° C 130° | assemblies with mates (not in the DSL) |-| Tool Block step 4 | 432.58 g | `offsetEntities` (Offset Entities of a face's loop) |+## Roadmap: placeholders (drawings only, not transcribed)++These are one line each: the source and its published key. The geometry stays in the source; no+exam or book content is copied here.++- 2007 sample exam, Q1: https://cdn.goengineer.com/cswasampleexam2007.pdf (key 1280 g).+- 2007 sample exam, Q6: https://cdn.goengineer.com/cswasampleexam2007.pdf (key 2040.57 g).+- Planchard, Official CSWA Examination Guide, 3-3: https://static.sdcpublications.com/pdfsample/978-1-58503-656-1-3.pdf (key 302.40 g, CoM (0, 19.20, 0)).+- Official chain-link assembly, 2017 sample exam: https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (key CoM (348.66, −88.48, −91.40) at A 25° B 125° C 130°; it needs assemblies with mates, which the DSL lacks). ## Spec 0
tools/cswa/SOURCES.md+6−11@@ -101,18 +101,13 @@ Material 6061, 2700 kg/m³ (0.0027 g/mm³), MMGS, corner at origin, +X +Y +Z. - Q9 L-bracket, AISI 1020 0.0079: base 80 (X) × 10 (Y) × 40 (Z) at the origin corner; upright 10 thick (X) at the left end, 50 above the base, 40 deep: **410.80 g**, CoM **(26.54, 16.54, 20.00)**. -## Further official candidates (drawings only; NOT rebuilt or verified)+## Further official candidates (placeholders: URL and key only) -- 2007 Q1 (p.1–2): MMGS, Copper 0.0089, A = 63 (height), B = 50 (depth), C = 100 (length); key **1280 g**.- Callouts: 100, 63, 50, 40, 40, 20, 15, 15, 10, 35, 20°, 45°, 9, 12, 5, 13, 18, 30, 8, Ø20, Ø10 (×3), Ø50, R25 (×2),- R20, R10, R30. Multi-sketch, angled cuts, concentric bores; a human must read the drawing.-- 2007 Q6 (p.6): 6061 0.0027, A = 100; key **2040.57 g**. Base 200 × A × 25 with steps 50/37.5/100/25/15/5, boss- Ø25 with Ø12 through on an R25/20° lug at 40/15, raised block 60/40/30/10, R50 saddle, 30° face, 10-wide slot,- Ø15 hole with ⌴Ø25 ⌵5 counterbore, R35. Needs human reading.-- Planchard 3-3 (SDC p.3-7/3-8): A = 50, B = 50, C = 120, 6061 0.0027; key **302.40 g, volume 112,000 mm²,- surface 26,200 mm², CoM (0, 19.20, 0)**; mirrored stepped sketch on Front → Boss-Extrude mid-plane 50 →- Cut-Extrude through-all of a 30×20 rectangle on the right face. Figure dims 120, 70, 40, 30, 20, 10, 50; the- reviewer reproduced the volume but not the CoM, so the figure needs a human read. Fills the "mirror" slot.+One line each. Nothing from these drawings is transcribed here: the geometry stays in the source.++- 2007 sample exam, Q1: https://cdn.goengineer.com/cswasampleexam2007.pdf (key 1280 g).+- 2007 sample exam, Q6: https://cdn.goengineer.com/cswasampleexam2007.pdf (key 2040.57 g).+- Planchard, Official CSWA Examination Guide, 3-3: https://static.sdcpublications.com/pdfsample/978-1-58503-656-1-3.pdf (key 302.40 g, CoM (0, 19.20, 0)). ## Assembly targets (future)
tools/cswa/reports/cswa-2026-10-16-sw2026-0.11.4-rc1-FAILED.jsonadded+11993@@ -0,0 +1,11993 @@+{+ "tool": "cswa-check",+ "when": "2026-10-16T22:55:11Z",+ "whenEpoch": 1792191311,+ "target": "adom_drew2",+ "bridgeVersion": "0.11.4",+ "bridge": {+ "source": "ab bridge_info + read_file (read-only)",+ "version": "0.11.4",+ "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks",+ "manifestUrl": "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json",+ "installSource": "cache",+ "exeSha256": "35f04d753e8757ee6c30c19a3ad652b1de0d61915b91a0a9324eed982dbd90ae",+ "bridgeJsonSha256": "af4d848ed8676c05b8bdcec089b1af3698c789b8977d3128f5332d859af98243",+ "installedFrom": "https://wiki.adom.inc/api/v1/pages/adom/solidworks-bridge/files/manifests/canary.json"+ },+ "solidworks": {+ "majorVersion": 34,+ "edition": "connected",+ "versionSupport": {+ "lacks": [],+ "majorVersion": 34,+ "revision": "34.3.0",+ "supported": true,+ "supportedFrom": 2021,+ "tested": true,+ "testedOn": [+ 2026,+ 2021+ ],+ "year": 2026+ }+ },+ "summary": "12 of 14 CSWA parts within tolerance",+ "passed": 12,+ "ran": 14,+ "skipped": 0,+ "stopped": null,+ "allPassed": false,+ "parts": [+ {+ "id": "cswa-00-lego-2x4",+ "title": "LEGO 2x4 brick (spec 0: the acceptance brick, not an exam part)",+ "official": false,+ "source": "adom/solidworks-bridge issue #1 (Michael, SOLIDWORKS 2021: volumeM3 2.0733615208e-6 from swx_mass_properties); examples/lego-2x4.json",+ "expected": {+ "massG": 2.114829,+ "volumeMm3": 2073.3615208,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "ABS",+ "densityKgM3": 1020+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 41319,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":37.4,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 10 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 6s ago\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":10,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[],\"featuresDeleted\":0,\"passes\":0,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-15.9,-7.9],[15.9,7.9]]}}],\"heightMm\":15.8,\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch1\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false,\"widthMm\":31.8},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":9.6,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude1\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch1\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-14.7,-6.7],[14.7,6.7]]}}],\"heightMm\":13.4,\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch2\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false,\"widthMm\":29.4},\"step\":4},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":8.6,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude1\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"regions\":null,\"reverse\":true,\"sketch\":\"Sketch2\",\"throughAll\":false,\"upToFace\":null},\"step\":5},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[-8.0,0.0],\"radiusMm\":3.255}},{\"circle\":{\"centerMm\":[-8.0,0.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":3.255}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[8.0,0.0],\"radiusMm\":3.255}},{\"circle\":{\"centerMm\":[8.0,0.0],\"radiusMm\":2.4}}],\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.circle\",\"sketch.multiProfile\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch3\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false},\"step\":6},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":8.6,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude2\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch3\",\"throughAll\":false,\"upToFace\":null},\"step\":7},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane1\",\"entities\":[{\"circle\":{\"centerMm\":[-12.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[-12.0,4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[-4.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[-4.0,4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[4.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[4.0,4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[12.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[12.0,4.0],\"radiusMm\":2.4}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":9.6},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.top.positive\",\"sketch.circle\",\"sketch.multiProfile\"]},\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":9.6,\"plane\":\"Plane1\",\"verified\":true},\"sketch\":\"Sketch4\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane1\",\"transformInverted\":false},\"step\":8},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":1.7,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude3\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch4\",\"throughAll\":false,\"upToFace\":null},\"step\":9},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"ABS\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":1020.0,\"densityRequested\":1020.0,\"material\":\"ABS\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":10}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 37.4,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 10 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 6s ago"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 10,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [],+ "featuresDeleted": 0,+ "passes": 0,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -15.9,+ -7.9+ ],+ [+ 15.9,+ 7.9+ ]+ ]+ }+ }+ ],+ "heightMm": 15.8,+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch1",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false,+ "widthMm": 31.8+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 9.6,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude1",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch1",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -14.7,+ -6.7+ ],+ [+ 14.7,+ 6.7+ ]+ ]+ }+ }+ ],+ "heightMm": 13.4,+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch2",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false,+ "widthMm": 29.4+ },+ "step": 4+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 8.6,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude1",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "regions": null,+ "reverse": true,+ "sketch": "Sketch2",+ "throughAll": false,+ "upToFace": null+ },+ "step": 5+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ -8.0,+ 0.0+ ],+ "radiusMm": 3.255+ }+ },+ {+ "circle": {+ "centerMm": [+ -8.0,+ 0.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 3.255+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 8.0,+ 0.0+ ],+ "radiusMm": 3.255+ }+ },+ {+ "circle": {+ "centerMm": [+ 8.0,+ 0.0+ ],+ "radiusMm": 2.4+ }+ }+ ],+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.circle",+ "sketch.multiProfile"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch3",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false+ },+ "step": 6+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 8.6,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude2",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch3",+ "throughAll": false,+ "upToFace": null+ },+ "step": 7+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane1",+ "entities": [+ {+ "circle": {+ "centerMm": [+ -12.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ -12.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ -4.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ -4.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 4.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 4.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 12.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 12.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 9.6+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.top.positive",+ "sketch.circle",+ "sketch.multiProfile"+ ]+ },+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 9.6,+ "plane": "Plane1",+ "verified": true+ },+ "sketch": "Sketch4",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane1",+ "transformInverted": false+ },+ "step": 8+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 1.7,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude3",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch4",+ "throughAll": false,+ "upToFace": null+ },+ "step": 9+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "ABS"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 1020.0,+ "densityRequested": 1020.0,+ "material": "ABS",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 10+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.0159,+ 0.0,+ -0.0079,+ 0.0159,+ 0.0113,+ 0.0079+ ],+ "centerOfMass": [+ 7.979125726454492e-19,+ 0.006193169977140961,+ -1.0997928205986969e-18+ ],+ "centerOfMassMm": [+ 0.0,+ 6.19317,+ -0.0+ ],+ "density": 1020.0,+ "densityKgM3": 1020.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2238,+ "error": "",+ "massG": 2.114828751242137,+ "massKg": 0.002114828751242137,+ "materialName": "ABS",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.0159,0.0,-0.0079,0.0159,0.0113,0.0079],\"centerOfMass\":[7.979125726454492e-19,0.006193169977140961,-1.0997928205986969e-18],\"centerOfMassMm\":[0.0,6.19317,-0.0],\"density\":1020.0,\"densityKgM3\":1020.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":2.114828751242137,\"massKg\":0.002114828751242137,\"materialName\":\"ABS\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 47s ago\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.003776753621558533,\"surfaceAreaMm2\":3776.753621558533,\"timeoutSeconds\":120,\"volumeM3\":2.0733615208256247e-6,\"volumeMm3\":2073.3615208256247}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 47s ago"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.003776753621558533,+ "surfaceAreaMm2": 3776.753621558533,+ "timeoutSeconds": 120,+ "volumeM3": 2.0733615208256247e-06,+ "volumeMm3": 2073.3615208256247+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 2.114829,+ "measured": 2.114828751242137,+ "offPct": 1.1762552090642981e-05,+ "pass": true+ },+ {+ "quantity": "volumeMm3",+ "expected": 2073.3615208,+ "measured": 2073.3615208256247,+ "offPct": 1.2358943781890103e-09,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 43.6+ },+ {+ "id": "cswa-01-3dengr-q5-block",+ "title": "3dengr Q5: a 100 x 20 x 60 block in 6061",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 324.0,+ "volumeMm3": 120000.0,+ "centerOfMassMm": [+ 50.0,+ 10.0,+ 30.0+ ],+ "tolerancePct": 1.0+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 24925,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":20.8,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 49s ago\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch1\",\"Boss-Extrude1\",\"Cut-Extrude1\",\"Boss-Extrude2\",\"Plane1\",\"Sketch4\",\"Boss-Extrude3\",\"Sketch2\",\"Sketch3\"],\"featuresDeleted\":9,\"passes\":2,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[100.0,20.0]]}}],\"heightMm\":20.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch5\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":100.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":60.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude4\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch5\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 20.8,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 49s ago"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch1",+ "Boss-Extrude1",+ "Cut-Extrude1",+ "Boss-Extrude2",+ "Plane1",+ "Sketch4",+ "Boss-Extrude3",+ "Sketch2",+ "Sketch3"+ ],+ "featuresDeleted": 9,+ "passes": 2,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 100.0,+ 20.0+ ]+ ]+ }+ }+ ],+ "heightMm": 20.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch5",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 100.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 60.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude4",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch5",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.1,+ 0.02,+ 0.06+ ],+ "centerOfMass": [+ 0.05,+ 0.01,+ 0.03+ ],+ "centerOfMassMm": [+ 50.0,+ 10.0,+ 30.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2816,+ "error": "",+ "massG": 323.99999999999994,+ "massKg": 0.32399999999999995,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.1,0.02,0.06],\"centerOfMass\":[0.05,0.01,0.03],\"centerOfMassMm\":[50.0,10.0,30.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":323.99999999999994,\"massKg\":0.32399999999999995,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 74s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.0184,\"surfaceAreaMm2\":18400.0,\"timeoutSeconds\":120,\"volumeM3\":0.00012,\"volumeMm3\":120000.0}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 74s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.0184,+ "surfaceAreaMm2": 18400.0,+ "timeoutSeconds": 120,+ "volumeM3": 0.00012,+ "volumeMm3": 120000.0+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 324.0,+ "measured": 323.99999999999994,+ "offPct": 1.75442650804963e-14,+ "pass": true+ },+ {+ "quantity": "volumeMm3",+ "expected": 120000.0,+ "measured": 120000.0,+ "offPct": 0.0,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 50.0,+ 10.0,+ 30.0+ ],+ "measured": [+ 50.0,+ 10.0,+ 30.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 27.8+ },+ {+ "id": "cswa-02-3dengr-q6-hole",+ "title": "3dengr Q6/Q7: the block with a \u00d820 hole through it along Y at X 25, Z 30",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 307.04,+ "centerOfMassMm": [+ 51.38,+ 10.0,+ 30.0+ ],+ "tolerancePct": 1.0+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 151980,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":27.6,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 5 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 77s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":5,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch5\",\"Boss-Extrude4\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[100.0,20.0]]}}],\"heightMm\":20.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch6\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":100.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":60.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude5\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch6\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":20.0,\"face\":{\"atPointMm\":[25.0,20.0,30.0],\"heightMm\":20.0,\"normal\":[-0.0,1.0,-0.0],\"pickedBy\":\"geometry\",\"plane\":\"Top Plane\"},\"feature\":\"Cut-Extrude2\",\"features\":[\"Cut-Extrude2\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane2\",\"entities\":[{\"circle\":{\"centerMm\":[25.0,-30.0],\"radiusMm\":10.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":10.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0,\"plane\":\"Plane2\",\"verified\":true},\"sketch\":\"Sketch7\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane2\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude2\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch7\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":4},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":5}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 27.6,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 5 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 77s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 5,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch5",+ "Boss-Extrude4"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 100.0,+ 20.0+ ]+ ]+ }+ }+ ],+ "heightMm": 20.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch6",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 100.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 60.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude5",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch6",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 20.0,+ "face": {+ "atPointMm": [+ 25.0,+ 20.0,+ 30.0+ ],+ "heightMm": 20.0,+ "normal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "pickedBy": "geometry",+ "plane": "Top Plane"+ },+ "feature": "Cut-Extrude2",+ "features": [+ "Cut-Extrude2"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane2",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 25.0,+ -30.0+ ],+ "radiusMm": 10.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 10.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0,+ "plane": "Plane2",+ "verified": true+ },+ "sketch": "Sketch7",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane2",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude2",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch7",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 4+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 5+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.1,+ 0.02,+ 0.06+ ],+ "centerOfMass": [+ 0.05138132283342444,+ 0.009999999999999998,+ 0.029999999999999995+ ],+ "centerOfMassMm": [+ 51.381323,+ 10.0,+ 30.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2234,+ "error": "",+ "massG": 307.0353996706151,+ "massKg": 0.3070353996706151,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.1,0.02,0.06],\"centerOfMass\":[0.05138132283342444,0.009999999999999998,0.029999999999999995],\"centerOfMassMm\":[51.381323,10.0,30.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":307.0353996706151,\"massKg\":0.3070353996706151,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 229s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01902831853071796,\"surfaceAreaMm2\":19028.31853071796,\"timeoutSeconds\":120,\"volumeM3\":0.0001137168146928204,\"volumeMm3\":113716.8146928204}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 229s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01902831853071796,+ "surfaceAreaMm2": 19028.31853071796,+ "timeoutSeconds": 120,+ "volumeM3": 0.0001137168146928204,+ "volumeMm3": 113716.8146928204+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 307.04,+ "measured": 307.0353996706151,+ "offPct": 0.0014982834109282007,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 51.38,+ 10.0,+ 30.0+ ],+ "measured": [+ 51.381323,+ 10.0,+ 30.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 154.2+ },+ {+ "id": "cswa-03-3dengr-q8-hole30",+ "title": "3dengr Q8: the hole changed to \u00d830",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 285.83,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 32522,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":28.4,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 5 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 231s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":5,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch6\",\"Boss-Extrude5\",\"Plane2\",\"Sketch7\",\"Cut-Extrude2\"],\"featuresDeleted\":5,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[100.0,20.0]]}}],\"heightMm\":20.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch8\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":100.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":60.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude6\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch8\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":30.0,\"face\":{\"atPointMm\":[25.0,20.0,30.0],\"heightMm\":20.0,\"normal\":[-0.0,1.0,-0.0],\"pickedBy\":\"geometry\",\"plane\":\"Top Plane\"},\"feature\":\"Cut-Extrude3\",\"features\":[\"Cut-Extrude3\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane3\",\"entities\":[{\"circle\":{\"centerMm\":[25.0,-30.0],\"radiusMm\":15.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":15.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0,\"plane\":\"Plane3\",\"verified\":true},\"sketch\":\"Sketch9\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane3\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude3\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch9\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":4},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":5}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 28.4,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 5 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 231s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 5,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch6",+ "Boss-Extrude5",+ "Plane2",+ "Sketch7",+ "Cut-Extrude2"+ ],+ "featuresDeleted": 5,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 100.0,+ 20.0+ ]+ ]+ }+ }+ ],+ "heightMm": 20.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch8",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 100.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 60.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude6",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch8",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 30.0,+ "face": {+ "atPointMm": [+ 25.0,+ 20.0,+ 30.0+ ],+ "heightMm": 20.0,+ "normal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "pickedBy": "geometry",+ "plane": "Top Plane"+ },+ "feature": "Cut-Extrude3",+ "features": [+ "Cut-Extrude3"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane3",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 25.0,+ -30.0+ ],+ "radiusMm": 15.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 15.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0,+ "plane": "Plane3",+ "verified": true+ },+ "sketch": "Sketch9",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane3",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude3",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch9",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 4+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 5+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.1,+ 0.02,+ 0.06+ ],+ "centerOfMass": [+ 0.05333855767238339,+ 0.009999999999999998,+ 0.03+ ],+ "centerOfMassMm": [+ 53.338558,+ 10.0,+ 30.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2254,+ "error": "",+ "massG": 285.829649258884,+ "massKg": 0.285829649258884,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.1,0.02,0.06],\"centerOfMass\":[0.05333855767238339,0.009999999999999998,0.03],\"centerOfMassMm\":[53.338558,10.0,30.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":285.829649258884,\"massKg\":0.285829649258884,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 264s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01887123889803847,\"surfaceAreaMm2\":18871.238898038468,\"timeoutSeconds\":120,\"volumeM3\":0.00010586283305884592,\"volumeMm3\":105862.83305884592}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 264s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01887123889803847,+ "surfaceAreaMm2": 18871.238898038468,+ "timeoutSeconds": 120,+ "volumeM3": 0.00010586283305884592,+ "volumeMm3": 105862.83305884592+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 285.83,+ "measured": 285.829649258884,+ "offPct": 0.00012270969317231364,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 34.8+ },+ {+ "id": "cswa-04-3dengr-q9-l-bracket",+ "title": "3dengr Q9: an L-bracket in AISI 1020, ONE polyline sketch",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 410.8,+ "centerOfMassMm": [+ 26.54,+ 16.54,+ 20.0+ ],+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 20010,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":15.9,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 266s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch8\",\"Boss-Extrude6\",\"Plane3\",\"Sketch9\",\"Cut-Extrude3\"],\"featuresDeleted\":5,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,0.0],\"toMm\":[80.0,0.0]}},{\"line\":{\"fromMm\":[80.0,0.0],\"toMm\":[80.0,10.0]}},{\"line\":{\"fromMm\":[80.0,10.0],\"toMm\":[10.0,10.0]}},{\"line\":{\"fromMm\":[10.0,10.0],\"toMm\":[10.0,60.0]}},{\"line\":{\"fromMm\":[10.0,60.0],\"toMm\":[0.0,60.0]}},{\"line\":{\"fromMm\":[0.0,60.0],\"toMm\":[0.0,0.0]}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.multiProfile\",\"sketch.line\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch10\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":40.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude7\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch10\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7900.000000000001,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 15.9,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 266s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch8",+ "Boss-Extrude6",+ "Plane3",+ "Sketch9",+ "Cut-Extrude3"+ ],+ "featuresDeleted": 5,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 0.0+ ],+ "toMm": [+ 80.0,+ 0.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 80.0,+ 0.0+ ],+ "toMm": [+ 80.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 80.0,+ 10.0+ ],+ "toMm": [+ 10.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 10.0,+ 10.0+ ],+ "toMm": [+ 10.0,+ 60.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 10.0,+ 60.0+ ],+ "toMm": [+ 0.0,+ 60.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 0.0,+ 60.0+ ],+ "toMm": [+ 0.0,+ 0.0+ ]+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.multiProfile",+ "sketch.line"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch10",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 40.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude7",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch10",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7900.000000000001,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.08,+ 0.06,+ 0.04+ ],+ "centerOfMass": [+ 0.026538461538461535,+ 0.016538461538461537,+ 0.019999999999999997+ ],+ "centerOfMassMm": [+ 26.538462,+ 16.538462,+ 20.0+ ],+ "density": 7900.000000000001,+ "densityKgM3": 7900.000000000001,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2357,+ "error": "",+ "massG": 410.80000000000007,+ "massKg": 0.41080000000000005,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.08,0.06,0.04],\"centerOfMass\":[0.026538461538461535,0.016538461538461537,0.019999999999999997],\"centerOfMassMm\":[26.538462,16.538462,20.0],\"density\":7900.000000000001,\"densityKgM3\":7900.000000000001,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":410.80000000000007,\"massKg\":0.41080000000000005,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 286s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.0138,\"surfaceAreaMm2\":13800.0,\"timeoutSeconds\":120,\"volumeM3\":0.000052,\"volumeMm3\":52000.0}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 286s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.0138,+ "surfaceAreaMm2": 13800.0,+ "timeoutSeconds": 120,+ "volumeM3": 5.2e-05,+ "volumeMm3": 52000.0+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 410.8,+ "measured": 410.80000000000007,+ "offPct": 1.3837248992407013e-14,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 26.54,+ 16.54,+ 20.0+ ],+ "measured": [+ 26.538462,+ 16.538462,+ 20.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 22.4+ },+ {+ "id": "cswa-05-tool-block-step1",+ "title": "Official Tool Block, Step 1 (Q3): A 81, B 57, C 43",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 939.54,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 18995,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":14.8,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 288s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch10\",\"Boss-Extrude7\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[18.243084987875623,14.783251905279968]}},{\"arc\":{\"ccw\":true,\"centerMm\":[21.5424003635473,33.494599212511915],\"endMm\":[38.0,24.0],\"radiusMm\":19.0,\"startMm\":[18.243084987875623,14.783251905279968]}},{\"line\":{\"fromMm\":[38.0,24.0],\"toMm\":[62.00000000000001,24.0]}},{\"line\":{\"fromMm\":[67.0,19.0],\"toMm\":[67.0,0.0]}},{\"line\":{\"fromMm\":[67.0,0.0],\"toMm\":[38.0,-33.0]}},{\"line\":{\"fromMm\":[38.0,-33.0],\"toMm\":[32.788067396763054,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[54.69696969696975,-13.999999999999972],\"endMm\":[26.012264996781063,-18.264705882352946],\"radiusMm\":29.000000000000053,\"startMm\":[32.788067396763054,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[21.066626255369176,-18.999999999999964],\"endMm\":[21.06662625536923,-14.0],\"radiusMm\":5.000000000000048,\"startMm\":[26.012264996781063,-18.264705882352946]}},{\"line\":{\"fromMm\":[21.06662625536923,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[62.00000000000001,24.0],\"toMm\":[67.0,19.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch11\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":43.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude8\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch11\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7900.0,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 14.8,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 288s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch10",+ "Boss-Extrude7"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 18.243084987875623,+ 14.783251905279968+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 21.5424003635473,+ 33.494599212511915+ ],+ "endMm": [+ 38.0,+ 24.0+ ],+ "radiusMm": 19.0,+ "startMm": [+ 18.243084987875623,+ 14.783251905279968+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 38.0,+ 24.0+ ],+ "toMm": [+ 62.00000000000001,+ 24.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 19.0+ ],+ "toMm": [+ 67.0,+ 0.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 0.0+ ],+ "toMm": [+ 38.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 38.0,+ -33.0+ ],+ "toMm": [+ 32.788067396763054,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 54.69696969696975,+ -13.999999999999972+ ],+ "endMm": [+ 26.012264996781063,+ -18.264705882352946+ ],+ "radiusMm": 29.000000000000053,+ "startMm": [+ 32.788067396763054,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 21.066626255369176,+ -18.999999999999964+ ],+ "endMm": [+ 21.06662625536923,+ -14.0+ ],+ "radiusMm": 5.000000000000048,+ "startMm": [+ 26.012264996781063,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 21.06662625536923,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 62.00000000000001,+ 24.0+ ],+ "toMm": [+ 67.0,+ 19.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch11",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 43.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude8",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch11",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7900.0,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.067,+ 0.024,+ 0.043+ ],+ "centerOfMass": [+ 0.03062236692252704,+ 0.0003076468646468417,+ 0.0215+ ],+ "centerOfMassMm": [+ 30.622367,+ 0.307647,+ 21.5+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2285,+ "error": "",+ "massG": 939.5395682014016,+ "massKg": 0.9395395682014016,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.067,0.024,0.043],\"centerOfMass\":[0.03062236692252704,0.0003076468646468417,0.0215],\"centerOfMassMm\":[30.622367,0.307647,21.5],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":939.5395682014016,\"massKg\":0.9395395682014016,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 307s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01763006429786853,\"surfaceAreaMm2\":17630.06429786853,\"timeoutSeconds\":120,\"volumeM3\":0.0001189290592660002,\"volumeMm3\":118929.0592660002}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 307s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01763006429786853,+ "surfaceAreaMm2": 17630.06429786853,+ "timeoutSeconds": 120,+ "volumeM3": 0.0001189290592660002,+ "volumeMm3": 118929.0592660002+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 939.54,+ "measured": 939.5395682014016,+ "offPct": 4.595851143710552e-05,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 21.3+ },+ {+ "id": "cswa-06-tool-block-step2",+ "title": "Official Tool Block, Step 2 (Q4): A 84, B 59, C 45, all other dimensions the same",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 1032.32,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 20744,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":16.7,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 310s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch11\",\"Boss-Extrude8\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[20.10404235201319,14.455114912034407]}},{\"arc\":{\"ccw\":true,\"centerMm\":[23.40335772768487,33.166462219266364],\"endMm\":[41.0,26.0],\"radiusMm\":19.0,\"startMm\":[20.10404235201319,14.455114912034407]}},{\"line\":{\"fromMm\":[41.0,26.0],\"toMm\":[65.0,26.0]}},{\"line\":{\"fromMm\":[70.0,21.0],\"toMm\":[70.0,2.0]}},{\"line\":{\"fromMm\":[70.0,2.0],\"toMm\":[41.0,-33.0]}},{\"line\":{\"fromMm\":[41.0,-33.0],\"toMm\":[34.8339548426505,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[56.74285714285731,-14.000000000000036],\"endMm\":[28.0581524426685,-18.264705882352946],\"radiusMm\":29.000000000000107,\"startMm\":[34.8339548426505,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[23.112513701256617,-18.999999999999982],\"endMm\":[23.112513701256667,-14.0],\"radiusMm\":5.0000000000000515,\"startMm\":[28.0581524426685,-18.264705882352946]}},{\"line\":{\"fromMm\":[23.112513701256667,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[65.0,26.0],\"toMm\":[70.0,21.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch12\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":45.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude9\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch12\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 16.7,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 310s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch11",+ "Boss-Extrude8"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 20.10404235201319,+ 14.455114912034407+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 23.40335772768487,+ 33.166462219266364+ ],+ "endMm": [+ 41.0,+ 26.0+ ],+ "radiusMm": 19.0,+ "startMm": [+ 20.10404235201319,+ 14.455114912034407+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 41.0,+ 26.0+ ],+ "toMm": [+ 65.0,+ 26.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 70.0,+ 21.0+ ],+ "toMm": [+ 70.0,+ 2.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 70.0,+ 2.0+ ],+ "toMm": [+ 41.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 41.0,+ -33.0+ ],+ "toMm": [+ 34.8339548426505,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 56.74285714285731,+ -14.000000000000036+ ],+ "endMm": [+ 28.0581524426685,+ -18.264705882352946+ ],+ "radiusMm": 29.000000000000107,+ "startMm": [+ 34.8339548426505,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 23.112513701256617,+ -18.999999999999982+ ],+ "endMm": [+ 23.112513701256667,+ -14.0+ ],+ "radiusMm": 5.0000000000000515,+ "startMm": [+ 28.0581524426685,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 23.112513701256667,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 65.0,+ 26.0+ ],+ "toMm": [+ 70.0,+ 21.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch12",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 45.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude9",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch12",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.07,+ 0.026,+ 0.045+ ],+ "centerOfMass": [+ 0.03255336787850931,+ 0.0007907183444125474,+ 0.0225+ ],+ "centerOfMassMm": [+ 32.553368,+ 0.790718,+ 22.5+ ],+ "density": 7899.999999999999,+ "densityKgM3": 7899.999999999999,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2621,+ "error": "",+ "massG": 1032.3206766712833,+ "massKg": 1.0323206766712834,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.07,0.026,0.045],\"centerOfMass\":[0.03255336787850931,0.0007907183444125474,0.0225],\"centerOfMassMm\":[32.553368,0.790718,22.5],\"density\":7899.999999999999,\"densityKgM3\":7899.999999999999,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":1032.3206766712833,\"massKg\":1.0323206766712834,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 330s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.0188741376700506,\"surfaceAreaMm2\":18874.137670050597,\"timeoutSeconds\":120,\"volumeM3\":0.00013067350337611183,\"volumeMm3\":130673.50337611182}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 330s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.0188741376700506,+ "surfaceAreaMm2": 18874.137670050597,+ "timeoutSeconds": 120,+ "volumeM3": 0.00013067350337611183,+ "volumeMm3": 130673.50337611182+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 1032.32,+ "measured": 1032.3206766712833,+ "offPct": 6.55485976608361e-05,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 23.4+ },+ {+ "id": "cswa-07-tool-block-step3",+ "title": "Official Tool Block, Step 3 (Q5): A 86, B 58, C 44, then remove material",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 628.18,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 62905,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":58.6,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 11 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 333s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":11,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch12\",\"Boss-Extrude9\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[22.3613808357771,14.057085232755291]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.66069621144878,32.768432539987224],\"endMm\":[43.0,25.0],\"radiusMm\":18.99999999999998,\"startMm\":[22.3613808357771,14.057085232755291]}},{\"line\":{\"fromMm\":[43.0,25.0],\"toMm\":[67.0,25.0]}},{\"line\":{\"fromMm\":[72.0,20.0],\"toMm\":[72.0,1.0]}},{\"line\":{\"fromMm\":[72.0,1.0],\"toMm\":[43.0,-33.0]}},{\"line\":{\"fromMm\":[43.0,-33.0],\"toMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[59.20588235294099,-13.99999999999998],\"endMm\":[30.521177652752534,-18.264705882352946],\"radiusMm\":28.999999999999883,\"startMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.575538911340765,-18.99999999999997],\"endMm\":[25.5755389113407,-14.0],\"radiusMm\":4.9999999999999325,\"startMm\":[30.521177652752534,-18.264705882352946]}},{\"line\":{\"fromMm\":[25.5755389113407,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[67.0,25.0],\"toMm\":[72.0,20.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch13\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":44.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude10\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch13\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane4\",\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":{\"face\":{\"atPointMm\":[-10.0,0.0,0.0]}},\"offsetMm\":-12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.faceOffset\",\"sketch.circle\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,-1.0],\"faceOffsetMm\":-12.0,\"fromFace\":true,\"offsetFrom\":\"Front Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"plane\":\"Plane4\",\"verified\":true},\"sketch\":\"Sketch14\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane4\",\"transformInverted\":false},\"step\":5},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":24.0,\"dir\":{\"flippedToFollowTheReference\":true,\"reference\":[-0.0,-0.0,-1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude4\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch14\",\"throughAll\":false,\"upToFace\":null},\"step\":6},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[85.99999999999999,-13.999999999999998]]}}],\"heightMm\":26.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch15\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":106.0},\"step\":7},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude5\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch15\",\"throughAll\":false,\"upToFace\":null},\"step\":8},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[20.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch16\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":40.0},\"step\":9},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude6\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch16\",\"throughAll\":false,\"upToFace\":null},\"step\":10},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":11.0,\"face\":{\"atPointMm\":[58.0,11.0,44.0],\"heightMm\":44.0,\"normal\":[0.0,0.0,1.0],\"pickedBy\":\"geometry\",\"plane\":\"Front Plane\"},\"feature\":\"Cut-Extrude7\",\"features\":[\"Cut-Extrude7\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane5\",\"entities\":[{\"circle\":{\"centerMm\":[58.0,11.0],\"radiusMm\":5.5}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":5.5,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"plane\":\"Plane5\",\"verified\":true},\"sketch\":\"Sketch17\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane5\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude7\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch17\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":11}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 58.6,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 11 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 333s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 11,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch12",+ "Boss-Extrude9"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.66069621144878,+ 32.768432539987224+ ],+ "endMm": [+ 43.0,+ 25.0+ ],+ "radiusMm": 18.99999999999998,+ "startMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ 25.0+ ],+ "toMm": [+ 67.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 20.0+ ],+ "toMm": [+ 72.0,+ 1.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 1.0+ ],+ "toMm": [+ 43.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ -33.0+ ],+ "toMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 59.20588235294099,+ -13.99999999999998+ ],+ "endMm": [+ 30.521177652752534,+ -18.264705882352946+ ],+ "radiusMm": 28.999999999999883,+ "startMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.575538911340765,+ -18.99999999999997+ ],+ "endMm": [+ 25.5755389113407,+ -14.0+ ],+ "radiusMm": 4.9999999999999325,+ "startMm": [+ 30.521177652752534,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 25.5755389113407,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 25.0+ ],+ "toMm": [+ 72.0,+ 20.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch13",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 44.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude10",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch13",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane4",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 0.0+ ]+ }+ },+ "offsetMm": -12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.faceOffset",+ "sketch.circle"+ ]+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ -1.0+ ],+ "faceOffsetMm": -12.0,+ "fromFace": true,+ "offsetFrom": "Front Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "plane": "Plane4",+ "verified": true+ },+ "sketch": "Sketch14",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane4",+ "transformInverted": false+ },+ "step": 5+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 24.0,+ "dir": {+ "flippedToFollowTheReference": true,+ "reference": [+ -0.0,+ -0.0,+ -1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude4",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch14",+ "throughAll": false,+ "upToFace": null+ },+ "step": 6+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 85.99999999999999,+ -13.999999999999998+ ]+ ]+ }+ }+ ],+ "heightMm": 26.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch15",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 106.0+ },+ "step": 7+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude5",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch15",+ "throughAll": false,+ "upToFace": null+ },+ "step": 8+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 20.0,+ 40.0+ ]+ ]+ }+ }+ ],+ "heightMm": 80.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch16",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 40.0+ },+ "step": 9+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude6",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch16",+ "throughAll": false,+ "upToFace": null+ },+ "step": 10+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 11.0,+ "face": {+ "atPointMm": [+ 58.0,+ 11.0,+ 44.0+ ],+ "heightMm": 44.0,+ "normal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "pickedBy": "geometry",+ "plane": "Front Plane"+ },+ "feature": "Cut-Extrude7",+ "features": [+ "Cut-Extrude7"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane5",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 58.0,+ 11.0+ ],+ "radiusMm": 5.5+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 5.5,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "plane": "Plane5",+ "verified": true+ },+ "sketch": "Sketch17",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane5",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude7",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch17",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 11+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.07200000000000001,+ 0.025,+ 0.044+ ],+ "centerOfMass": [+ 0.03174279639698831,+ -0.0008683174573996889,+ 0.017834837095750275+ ],+ "centerOfMassMm": [+ 31.742796,+ -0.868317,+ 17.834837+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2399,+ "error": "",+ "massG": 628.1833833399141,+ "massKg": 0.6281833833399142,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.07200000000000001,0.025,0.044],\"centerOfMass\":[0.03174279639698831,-0.0008683174573996889,0.017834837095750275],\"centerOfMassMm\":[31.742796,-0.868317,17.834837],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":628.1833833399141,\"massKg\":0.6281833833399142,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 396s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01771252880409412,\"surfaceAreaMm2\":17712.52880409412,\"timeoutSeconds\":120,\"volumeM3\":0.00007951688396707775,\"volumeMm3\":79516.88396707775}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 396s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01771252880409412,+ "surfaceAreaMm2": 17712.52880409412,+ "timeoutSeconds": 120,+ "volumeM3": 7.951688396707775e-05,+ "volumeMm3": 79516.88396707775+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 628.18,+ "measured": 628.1833833399141,+ "offPct": 0.0005385940198978062,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 65.3+ },+ {+ "id": "cswa-08-tool-block-step4",+ "title": "Official Tool Block, Step 4 (Q6): a pocket 1 mm inside the front face's outline (Offset Entities, sketch regions)",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 432.58,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 197471,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":102.1,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 15 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 398s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":15,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch13\",\"Boss-Extrude10\",\"Plane4\",\"Sketch14\",\"Cut-Extrude4\",\"Sketch15\",\"Cut-Extrude5\",\"Sketch16\",\"Cut-Extrude6\",\"Plane5\",\"Sketch17\",\"Cut-Extrude7\"],\"featuresDeleted\":12,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[22.3613808357771,14.057085232755291]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.66069621144878,32.768432539987224],\"endMm\":[43.0,25.0],\"radiusMm\":18.99999999999998,\"startMm\":[22.3613808357771,14.057085232755291]}},{\"line\":{\"fromMm\":[43.0,25.0],\"toMm\":[67.0,25.0]}},{\"line\":{\"fromMm\":[72.0,20.0],\"toMm\":[72.0,1.0]}},{\"line\":{\"fromMm\":[72.0,1.0],\"toMm\":[43.0,-33.0]}},{\"line\":{\"fromMm\":[43.0,-33.0],\"toMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[59.20588235294099,-13.99999999999998],\"endMm\":[30.521177652752534,-18.264705882352946],\"radiusMm\":28.999999999999883,\"startMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.575538911340765,-18.99999999999997],\"endMm\":[25.5755389113407,-14.0],\"radiusMm\":4.9999999999999325,\"startMm\":[30.521177652752534,-18.264705882352946]}},{\"line\":{\"fromMm\":[25.5755389113407,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[67.0,25.0],\"toMm\":[72.0,20.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch18\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":44.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude11\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch18\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane6\",\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":{\"face\":{\"atPointMm\":[-10.0,0.0,0.0]}},\"offsetMm\":-12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.faceOffset\",\"sketch.circle\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,-1.0],\"faceOffsetMm\":-12.0,\"fromFace\":true,\"offsetFrom\":\"Front Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"plane\":\"Plane6\",\"verified\":true},\"sketch\":\"Sketch19\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane6\",\"transformInverted\":false},\"step\":5},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":24.0,\"dir\":{\"flippedToFollowTheReference\":true,\"reference\":[-0.0,-0.0,-1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude8\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch19\",\"throughAll\":false,\"upToFace\":null},\"step\":6},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[85.99999999999999,-13.999999999999998]]}}],\"heightMm\":26.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch20\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":106.0},\"step\":7},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude9\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch20\",\"throughAll\":false,\"upToFace\":null},\"step\":8},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[20.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch21\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":40.0},\"step\":9},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude10\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch21\",\"throughAll\":false,\"upToFace\":null},\"step\":10},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":11.0,\"face\":{\"atPointMm\":[58.0,11.0,44.0],\"heightMm\":44.0,\"normal\":[0.0,0.0,1.0],\"pickedBy\":\"geometry\",\"plane\":\"Front Plane\"},\"feature\":\"Cut-Extrude11\",\"features\":[\"Cut-Extrude11\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane7\",\"entities\":[{\"circle\":{\"centerMm\":[58.0,11.0],\"radiusMm\":5.5}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":5.5,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"plane\":\"Plane7\",\"verified\":true},\"sketch\":\"Sketch22\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane7\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude11\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch22\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":11},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":42.0}}],\"mapped\":true,\"offsets\":[{\"offsetEntities\":{\"chain\":true,\"fromFace\":{\"atPointMm\":[70.0,10.0,44.0]},\"loops\":\"outer\",\"offsetMm\":-1.0,\"side\":\"inward\"},\"route\":\"IModelDoc2::SketchOffsetEntities2\",\"segments\":8,\"selected\":\"the face's outer loop (8 edges)\",\"side\":\"inward\",\"sideVerified\":true,\"tries\":[{\"farthestFromTheFaceMm\":0.0,\"landed\":\"inward\",\"offsetMm\":-1.0,\"segments\":8}],\"why\":null}],\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"sketch.offsetEntities.outer\",\"what\":\"a face's OUTER loop offset into the sketch: its edges selected, IModelDoc2::SketchOffsetEntities2 (side checked, redone the other way if SOLIDWORKS put it outside)\"}],\"variants\":[\"sketch.face.front.positive\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.offsetEntities.outer\",\"select.multiSelectTyped\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"radiusMm\":42.0,\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch23\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":12},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":12.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":5,\"feature\":\"Cut-Extrude12\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"cut.offsetFromSurface\",\"what\":\"a cut to a distance from a picked face\"},{\"variant\":\"cut.regions\",\"what\":\"a cut of selected sketch regions (EnableContourSelection, SelectByID2 \\\"SKETCHREGION\\\" at mark 4)\"}],\"variants\":[\"cut.offsetFromSurface\",\"cut.regions\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":{\"selected\":[{\"atMm\":[25.0,0.0],\"modelMm\":[25.0,0.0,44.0]}],\"via\":\"SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on\"},\"reverse\":false,\"sketch\":\"Sketch23\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":13},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"offsets\":[{\"offsetEntities\":{\"chain\":true,\"fromFace\":{\"atPointMm\":[70.0,10.0,44.0]},\"loops\":\"outer\",\"offsetMm\":-1.0,\"side\":\"inward\"},\"route\":\"IModelDoc2::SketchOffsetEntities2\",\"segments\":8,\"selected\":\"the face's outer loop (8 edges)\",\"side\":\"inward\",\"sideVerified\":true,\"tries\":[{\"farthestFromTheFaceMm\":3.4694469519536138e-15,\"landed\":\"inward\",\"offsetMm\":-1.0,\"segments\":8}],\"why\":null}],\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"sketch.offsetEntities.outer\",\"what\":\"a face's OUTER loop offset into the sketch: its edges selected, IModelDoc2::SketchOffsetEntities2 (side checked, redone the other way if SOLIDWORKS put it outside)\"}],\"variants\":[\"sketch.face.front.positive\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.offsetEntities.outer\",\"select.multiSelectTyped\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch24\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":14},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":1.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":5,\"feature\":\"Cut-Extrude13\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"cut.offsetFromSurface\",\"what\":\"a cut to a distance from a picked face\"},{\"variant\":\"cut.regions\",\"what\":\"a cut of selected sketch regions (EnableContourSelection, SelectByID2 \\\"SKETCHREGION\\\" at mark 4)\"}],\"variants\":[\"cut.offsetFromSurface\",\"cut.regions\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":{\"selected\":[{\"atMm\":[65.0,15.0],\"modelMm\":[65.0,15.0,44.0]}],\"via\":\"SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on\"},\"reverse\":false,\"sketch\":\"Sketch24\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":15}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 102.1,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 15 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 398s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 15,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch13",+ "Boss-Extrude10",+ "Plane4",+ "Sketch14",+ "Cut-Extrude4",+ "Sketch15",+ "Cut-Extrude5",+ "Sketch16",+ "Cut-Extrude6",+ "Plane5",+ "Sketch17",+ "Cut-Extrude7"+ ],+ "featuresDeleted": 12,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.66069621144878,+ 32.768432539987224+ ],+ "endMm": [+ 43.0,+ 25.0+ ],+ "radiusMm": 18.99999999999998,+ "startMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ 25.0+ ],+ "toMm": [+ 67.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 20.0+ ],+ "toMm": [+ 72.0,+ 1.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 1.0+ ],+ "toMm": [+ 43.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ -33.0+ ],+ "toMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 59.20588235294099,+ -13.99999999999998+ ],+ "endMm": [+ 30.521177652752534,+ -18.264705882352946+ ],+ "radiusMm": 28.999999999999883,+ "startMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.575538911340765,+ -18.99999999999997+ ],+ "endMm": [+ 25.5755389113407,+ -14.0+ ],+ "radiusMm": 4.9999999999999325,+ "startMm": [+ 30.521177652752534,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 25.5755389113407,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 25.0+ ],+ "toMm": [+ 72.0,+ 20.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch18",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 44.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude11",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch18",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane6",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 0.0+ ]+ }+ },+ "offsetMm": -12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.faceOffset",+ "sketch.circle"+ ]+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ -1.0+ ],+ "faceOffsetMm": -12.0,+ "fromFace": true,+ "offsetFrom": "Front Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "plane": "Plane6",+ "verified": true+ },+ "sketch": "Sketch19",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane6",+ "transformInverted": false+ },+ "step": 5+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 24.0,+ "dir": {+ "flippedToFollowTheReference": true,+ "reference": [+ -0.0,+ -0.0,+ -1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude8",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch19",+ "throughAll": false,+ "upToFace": null+ },+ "step": 6+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 85.99999999999999,+ -13.999999999999998+ ]+ ]+ }+ }+ ],+ "heightMm": 26.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch20",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 106.0+ },+ "step": 7+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude9",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch20",+ "throughAll": false,+ "upToFace": null+ },+ "step": 8+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 20.0,+ 40.0+ ]+ ]+ }+ }+ ],+ "heightMm": 80.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch21",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 40.0+ },+ "step": 9+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude10",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch21",+ "throughAll": false,+ "upToFace": null+ },+ "step": 10+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 11.0,+ "face": {+ "atPointMm": [+ 58.0,+ 11.0,+ 44.0+ ],+ "heightMm": 44.0,+ "normal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "pickedBy": "geometry",+ "plane": "Front Plane"+ },+ "feature": "Cut-Extrude11",+ "features": [+ "Cut-Extrude11"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane7",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 58.0,+ 11.0+ ],+ "radiusMm": 5.5+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 5.5,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "plane": "Plane7",+ "verified": true+ },+ "sketch": "Sketch22",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane7",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude11",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch22",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 11+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 42.0+ }+ }+ ],+ "mapped": true,+ "offsets": [+ {+ "offsetEntities": {+ "chain": true,+ "fromFace": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ },+ "loops": "outer",+ "offsetMm": -1.0,+ "side": "inward"+ },+ "route": "IModelDoc2::SketchOffsetEntities2",+ "segments": 8,+ "selected": "the face's outer loop (8 edges)",+ "side": "inward",+ "sideVerified": true,+ "tries": [+ {+ "farthestFromTheFaceMm": 0.0,+ "landed": "inward",+ "offsetMm": -1.0,+ "segments": 8+ }+ ],+ "why": null+ }+ ],+ "plane": {+ "face": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "sketch.offsetEntities.outer",+ "what": "a face's OUTER loop offset into the sketch: its edges selected, IModelDoc2::SketchOffsetEntities2 (side checked, redone the other way if SOLIDWORKS put it outside)"+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.offsetEntities.outer",+ "select.multiSelectTyped"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "radiusMm": 42.0,+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch23",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 12+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 12.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 5,+ "feature": "Cut-Extrude12",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "cut.offsetFromSurface",+ "what": "a cut to a distance from a picked face"+ },+ {+ "variant": "cut.regions",+ "what": "a cut of selected sketch regions (EnableContourSelection, SelectByID2 \"SKETCHREGION\" at mark 4)"+ }+ ],+ "variants": [+ "cut.offsetFromSurface",+ "cut.regions"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": {+ "selected": [+ {+ "atMm": [+ 25.0,+ 0.0+ ],+ "modelMm": [+ 25.0,+ 0.0,+ 44.0+ ]+ }+ ],+ "via": "SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on"+ },+ "reverse": false,+ "sketch": "Sketch23",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 13+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "offsets": [+ {+ "offsetEntities": {+ "chain": true,+ "fromFace": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ },+ "loops": "outer",+ "offsetMm": -1.0,+ "side": "inward"+ },+ "route": "IModelDoc2::SketchOffsetEntities2",+ "segments": 8,+ "selected": "the face's outer loop (8 edges)",+ "side": "inward",+ "sideVerified": true,+ "tries": [+ {+ "farthestFromTheFaceMm": 3.4694469519536138e-15,+ "landed": "inward",+ "offsetMm": -1.0,+ "segments": 8+ }+ ],+ "why": null+ }+ ],+ "plane": {+ "face": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "sketch.offsetEntities.outer",+ "what": "a face's OUTER loop offset into the sketch: its edges selected, IModelDoc2::SketchOffsetEntities2 (side checked, redone the other way if SOLIDWORKS put it outside)"+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.offsetEntities.outer",+ "select.multiSelectTyped"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch24",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 14+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 1.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 5,+ "feature": "Cut-Extrude13",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "cut.offsetFromSurface",+ "what": "a cut to a distance from a picked face"+ },+ {+ "variant": "cut.regions",+ "what": "a cut of selected sketch regions (EnableContourSelection, SelectByID2 \"SKETCHREGION\" at mark 4)"+ }+ ],+ "variants": [+ "cut.offsetFromSurface",+ "cut.regions"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": {+ "selected": [+ {+ "atMm": [+ 65.0,+ 15.0+ ],+ "modelMm": [+ 65.0,+ 15.0,+ 44.0+ ]+ }+ ],+ "via": "SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on"+ },+ "reverse": false,+ "sketch": "Sketch24",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 15+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.11400000000000002,+ 0.07070187343596344,+ 0.044+ ],+ "centerOfMass": [+ 0.028679743560791063,+ -0.0013181364133994554,+ 0.011973208864464789+ ],+ "centerOfMassMm": [+ 28.679744,+ -1.318136,+ 11.973209+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2305,+ "error": "",+ "massG": 434.7151664097056,+ "massKg": 0.4347151664097056,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.11400000000000002,0.07070187343596344,0.044],\"centerOfMass\":[0.028679743560791063,-0.0013181364133994554,0.011973208864464789],\"centerOfMassMm\":[28.679744,-1.318136,11.973209],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":434.7151664097056,\"massKg\":0.4347151664097056,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 596s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.022011814184570586,\"surfaceAreaMm2\":22011.814184570587,\"timeoutSeconds\":120,\"volumeM3\":0.00005502723625439311,\"volumeMm3\":55027.23625439311}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 596s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.022011814184570586,+ "surfaceAreaMm2": 22011.814184570587,+ "timeoutSeconds": 120,+ "volumeM3": 5.502723625439311e-05,+ "volumeMm3": 55027.23625439311+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 432.58,+ "measured": 434.7151664097056,+ "offPct": 0.4935887950681074,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 199.8+ },+ {+ "id": "cswa-08b-tool-block-step4-explicit",+ "title": "Official Tool Block, Step 4 (Q6), the explicit inset profile: the same pocket drawn line by line (the Offset Entities fallback)",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 432.58,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 84664,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":80.3,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 15 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 598s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":15,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch18\",\"Boss-Extrude11\",\"Plane6\",\"Sketch19\",\"Cut-Extrude8\",\"Sketch20\",\"Cut-Extrude9\",\"Sketch21\",\"Cut-Extrude10\",\"Plane7\",\"Sketch22\",\"Cut-Extrude11\",\"Sketch23\",\"Cut-Extrude12\",\"Sketch24\",\"Cut-Extrude13\"],\"featuresDeleted\":16,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[22.3613808357771,14.057085232755291]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.66069621144878,32.768432539987224],\"endMm\":[43.0,25.0],\"radiusMm\":18.99999999999998,\"startMm\":[22.3613808357771,14.057085232755291]}},{\"line\":{\"fromMm\":[43.0,25.0],\"toMm\":[67.0,25.0]}},{\"line\":{\"fromMm\":[72.0,20.0],\"toMm\":[72.0,1.0]}},{\"line\":{\"fromMm\":[72.0,1.0],\"toMm\":[43.0,-33.0]}},{\"line\":{\"fromMm\":[43.0,-33.0],\"toMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[59.20588235294099,-13.99999999999998],\"endMm\":[30.521177652752534,-18.264705882352946],\"radiusMm\":28.999999999999883,\"startMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.575538911340765,-18.99999999999997],\"endMm\":[25.5755389113407,-14.0],\"radiusMm\":4.9999999999999325,\"startMm\":[30.521177652752534,-18.264705882352946]}},{\"line\":{\"fromMm\":[25.5755389113407,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[67.0,25.0],\"toMm\":[72.0,20.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch25\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":44.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude12\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch25\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane8\",\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":{\"face\":{\"atPointMm\":[-10.0,0.0,0.0]}},\"offsetMm\":-12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.faceOffset\",\"sketch.circle\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,-1.0],\"faceOffsetMm\":-12.0,\"fromFace\":true,\"offsetFrom\":\"Front Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"plane\":\"Plane8\",\"verified\":true},\"sketch\":\"Sketch26\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane8\",\"transformInverted\":false},\"step\":5},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":24.0,\"dir\":{\"flippedToFollowTheReference\":true,\"reference\":[-0.0,-0.0,-1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude14\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch26\",\"throughAll\":false,\"upToFace\":null},\"step\":6},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[85.99999999999999,-13.999999999999998]]}}],\"heightMm\":26.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch27\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":106.0},\"step\":7},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude15\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch27\",\"throughAll\":false,\"upToFace\":null},\"step\":8},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[20.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch28\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":40.0},\"step\":9},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude16\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch28\",\"throughAll\":false,\"upToFace\":null},\"step\":10},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":11.0,\"face\":{\"atPointMm\":[58.0,11.0,44.0],\"heightMm\":44.0,\"normal\":[0.0,0.0,1.0],\"pickedBy\":\"geometry\",\"plane\":\"Front Plane\"},\"feature\":\"Cut-Extrude17\",\"features\":[\"Cut-Extrude17\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane9\",\"entities\":[{\"circle\":{\"centerMm\":[58.0,11.0],\"radiusMm\":5.5}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":5.5,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"plane\":\"Plane9\",\"verified\":true},\"sketch\":\"Sketch29\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane9\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude17\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch29\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":11},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[21.0,-13.0],\"toMm\":[58.744476295793866,-13.0]}},{\"line\":{\"fromMm\":[58.744476295793866,-13.0],\"toMm\":[59.98684774684612,-11.543426574628398]}},{\"arc\":{\"ccw\":false,\"centerMm\":[72.00000000000006,28.70187343596347],\"endMm\":[32.6466829432945,14.028208705078669],\"radiusMm\":42.00000000000004,\"startMm\":[59.98684774684612,-11.543426574628398]}},{\"arc\":{\"ccw\":false,\"centerMm\":[25.660696211448773,32.76843253998723],\"endMm\":[22.18773265811017,13.072277479743086],\"radiusMm\":19.999999999999982,\"startMm\":[32.6466829432945,14.028208705078669]}},{\"line\":{\"fromMm\":[22.18773265811017,13.072277479743086],\"toMm\":[21.0,13.281706793236491]}},{\"line\":{\"fromMm\":[21.0,13.281706793236491],\"toMm\":[21.0,-13.0]}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch30\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":12},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":32.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude18\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch30\",\"throughAll\":false,\"upToFace\":null},\"step\":13},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[60.69803754833394,-10.709617841849566],\"toMm\":[71.0,1.3685450325175337]}},{\"line\":{\"fromMm\":[71.0,1.3685450325175337],\"toMm\":[71.0,19.585786437626908]}},{\"line\":{\"fromMm\":[71.0,19.585786437626908],\"toMm\":[66.58578643762691,24.0]}},{\"line\":{\"fromMm\":[66.58578643762691,24.0],\"toMm\":[43.63608468546215,24.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[25.660696211448517,32.7684325399873],\"endMm\":[33.57496135565881,14.400950207692958],\"radiusMm\":20.000000000000256,\"startMm\":[43.63608468546215,24.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[72.0,28.70187343596347],\"endMm\":[60.69803754833394,-10.709617841849566],\"radiusMm\":41.000000000000014,\"startMm\":[33.57496135565881,14.400950207692958]}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch31\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":14},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":7.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude19\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch31\",\"throughAll\":false,\"upToFace\":null},\"step\":15}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 80.3,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 15 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 598s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 15,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch18",+ "Boss-Extrude11",+ "Plane6",+ "Sketch19",+ "Cut-Extrude8",+ "Sketch20",+ "Cut-Extrude9",+ "Sketch21",+ "Cut-Extrude10",+ "Plane7",+ "Sketch22",+ "Cut-Extrude11",+ "Sketch23",+ "Cut-Extrude12",+ "Sketch24",+ "Cut-Extrude13"+ ],+ "featuresDeleted": 16,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.66069621144878,+ 32.768432539987224+ ],+ "endMm": [+ 43.0,+ 25.0+ ],+ "radiusMm": 18.99999999999998,+ "startMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ 25.0+ ],+ "toMm": [+ 67.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 20.0+ ],+ "toMm": [+ 72.0,+ 1.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 1.0+ ],+ "toMm": [+ 43.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ -33.0+ ],+ "toMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 59.20588235294099,+ -13.99999999999998+ ],+ "endMm": [+ 30.521177652752534,+ -18.264705882352946+ ],+ "radiusMm": 28.999999999999883,+ "startMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.575538911340765,+ -18.99999999999997+ ],+ "endMm": [+ 25.5755389113407,+ -14.0+ ],+ "radiusMm": 4.9999999999999325,+ "startMm": [+ 30.521177652752534,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 25.5755389113407,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 25.0+ ],+ "toMm": [+ 72.0,+ 20.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch25",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 44.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude12",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch25",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane8",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 0.0+ ]+ }+ },+ "offsetMm": -12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.faceOffset",+ "sketch.circle"+ ]+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ -1.0+ ],+ "faceOffsetMm": -12.0,+ "fromFace": true,+ "offsetFrom": "Front Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "plane": "Plane8",+ "verified": true+ },+ "sketch": "Sketch26",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane8",+ "transformInverted": false+ },+ "step": 5+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 24.0,+ "dir": {+ "flippedToFollowTheReference": true,+ "reference": [+ -0.0,+ -0.0,+ -1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude14",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch26",+ "throughAll": false,+ "upToFace": null+ },+ "step": 6+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 85.99999999999999,+ -13.999999999999998+ ]+ ]+ }+ }+ ],+ "heightMm": 26.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch27",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 106.0+ },+ "step": 7+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude15",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch27",+ "throughAll": false,+ "upToFace": null+ },+ "step": 8+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 20.0,+ 40.0+ ]+ ]+ }+ }+ ],+ "heightMm": 80.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch28",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 40.0+ },+ "step": 9+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude16",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch28",+ "throughAll": false,+ "upToFace": null+ },+ "step": 10+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 11.0,+ "face": {+ "atPointMm": [+ 58.0,+ 11.0,+ 44.0+ ],+ "heightMm": 44.0,+ "normal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "pickedBy": "geometry",+ "plane": "Front Plane"+ },+ "feature": "Cut-Extrude17",+ "features": [+ "Cut-Extrude17"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane9",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 58.0,+ 11.0+ ],+ "radiusMm": 5.5+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 5.5,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "plane": "Plane9",+ "verified": true+ },+ "sketch": "Sketch29",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane9",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude17",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch29",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 11+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 21.0,+ -13.0+ ],+ "toMm": [+ 58.744476295793866,+ -13.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 58.744476295793866,+ -13.0+ ],+ "toMm": [+ 59.98684774684612,+ -11.543426574628398+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 72.00000000000006,+ 28.70187343596347+ ],+ "endMm": [+ 32.6466829432945,+ 14.028208705078669+ ],+ "radiusMm": 42.00000000000004,+ "startMm": [+ 59.98684774684612,+ -11.543426574628398+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 25.660696211448773,+ 32.76843253998723+ ],+ "endMm": [+ 22.18773265811017,+ 13.072277479743086+ ],+ "radiusMm": 19.999999999999982,+ "startMm": [+ 32.6466829432945,+ 14.028208705078669+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 22.18773265811017,+ 13.072277479743086+ ],+ "toMm": [+ 21.0,+ 13.281706793236491+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 21.0,+ 13.281706793236491+ ],+ "toMm": [+ 21.0,+ -13.0+ ]+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch30",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 12+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 32.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude18",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch30",+ "throughAll": false,+ "upToFace": null+ },+ "step": 13+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 60.69803754833394,+ -10.709617841849566+ ],+ "toMm": [+ 71.0,+ 1.3685450325175337+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 71.0,+ 1.3685450325175337+ ],+ "toMm": [+ 71.0,+ 19.585786437626908+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 71.0,+ 19.585786437626908+ ],+ "toMm": [+ 66.58578643762691,+ 24.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 66.58578643762691,+ 24.0+ ],+ "toMm": [+ 43.63608468546215,+ 24.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 25.660696211448517,+ 32.7684325399873+ ],+ "endMm": [+ 33.57496135565881,+ 14.400950207692958+ ],+ "radiusMm": 20.000000000000256,+ "startMm": [+ 43.63608468546215,+ 24.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 72.0,+ 28.70187343596347+ ],+ "endMm": [+ 60.69803754833394,+ -10.709617841849566+ ],+ "radiusMm": 41.000000000000014,+ "startMm": [+ 33.57496135565881,+ 14.400950207692958+ ]+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch31",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 14+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 7.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude19",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch31",+ "throughAll": false,+ "upToFace": null+ },+ "step": 15+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.07200000000000001,+ 0.025,+ 0.044+ ],+ "centerOfMass": [+ 0.02867974356079105,+ -0.0013181364133994537,+ 0.01197320886446478+ ],+ "centerOfMassMm": [+ 28.679744,+ -1.318136,+ 11.973209+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2479,+ "error": "",+ "massG": 434.71516640970555,+ "massKg": 0.43471516640970553,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.07200000000000001,0.025,0.044],\"centerOfMass\":[0.02867974356079105,-0.0013181364133994537,0.01197320886446478],\"centerOfMassMm\":[28.679744,-1.318136,11.973209],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":434.71516640970555,\"massKg\":0.43471516640970553,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 683s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.02201181418457059,\"surfaceAreaMm2\":22011.81418457059,\"timeoutSeconds\":120,\"volumeM3\":0.000055027236254393104,\"volumeMm3\":55027.2362543931}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 683s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.02201181418457059,+ "surfaceAreaMm2": 22011.81418457059,+ "timeoutSeconds": 120,+ "volumeM3": 5.5027236254393104e-05,+ "volumeMm3": 55027.2362543931+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 432.58,+ "measured": 434.71516640970555,+ "offPct": 0.49358879506809417,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 87.2+ },+ {+ "id": "cswa-09-community-stepped-shaft",+ "title": "Community: a stepped hollow shaft - revolved, a groove revolve-cut, a half-depth flat revolve-cut mid-plane",+ "official": false,+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "expected": {+ "massG": 103.568885,+ "volumeMm3": 38358.8463,+ "centerOfMassMm": [+ 46.831491,+ -0.114185,+ 0.0+ ],+ "tolerancePct": 0.1+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 43843,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":39.1,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 8 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 685s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":8,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch25\",\"Boss-Extrude12\",\"Plane8\",\"Sketch26\",\"Cut-Extrude14\",\"Sketch27\",\"Cut-Extrude15\",\"Sketch28\",\"Cut-Extrude16\",\"Plane9\",\"Sketch29\",\"Cut-Extrude17\",\"Sketch30\",\"Cut-Extrude18\",\"Sketch31\",\"Cut-Extrude19\"],\"featuresDeleted\":16,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,3.0],\"toMm\":[0.0,10.0]}},{\"line\":{\"fromMm\":[0.0,10.0],\"toMm\":[30.0,10.0]}},{\"line\":{\"fromMm\":[30.0,10.0],\"toMm\":[30.0,15.0]}},{\"line\":{\"fromMm\":[30.0,15.0],\"toMm\":[70.0,15.0]}},{\"line\":{\"fromMm\":[70.0,15.0],\"toMm\":[70.0,8.0]}},{\"line\":{\"fromMm\":[70.0,8.0],\"toMm\":[95.0,8.0]}},{\"line\":{\"fromMm\":[95.0,8.0],\"toMm\":[95.0,3.0]}},{\"line\":{\"fromMm\":[95.0,3.0],\"toMm\":[0.0,3.0]}},{\"line\":{\"construction\":true,\"fromMm\":[-1.0,0.0],\"toMm\":[96.0,0.0]}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"sketch.construction\",\"what\":\"construction geometry (CreateCenterLine; arcs with ConstructionGeometry)\"}],\"variants\":[\"sketch.plane.front\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.construction\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"resolvedPlane\":null,\"sketch\":\"Sketch32\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"revolve\",\"result\":{\"angleDeg\":360.0,\"axis\":{\"entity\":8,\"mark\":4,\"segment\":\"Line9\",\"selectedVia\":\"SelectByID2 EXTSKETCHSEGMENT\"},\"feature\":\"Revolve1\",\"midPlane\":false,\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"revolve.360\",\"what\":\"a full revolve about a line of the sketch (FeatureRevolve2)\"}],\"variants\":[\"revolve.360\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"reverse\":false,\"route\":\"FeatureRevolve2\",\"sketch\":\"Sketch32\"},\"step\":3},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[45.0,13.0],[49.99999999999999,15.0]]}},{\"line\":{\"construction\":true,\"fromMm\":[44.0,0.0],\"toMm\":[50.99999999999999,0.0]}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"sketch.construction\",\"what\":\"construction geometry (CreateCenterLine; arcs with ConstructionGeometry)\"}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\",\"sketch.multiProfile\",\"sketch.construction\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"resolvedPlane\":null,\"sketch\":\"Sketch33\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":4},{\"op\":\"revolve_cut\",\"result\":{\"angleDeg\":360.0,\"axis\":{\"entity\":1,\"mark\":4,\"segment\":\"Line5\",\"selectedVia\":\"SelectByID2 EXTSKETCHSEGMENT\"},\"feature\":\"Cut-Revolve1\",\"midPlane\":false,\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"revolve_cut.360\",\"what\":\"a full revolve-cut (FeatureRevolve2 with IsCut)\"}],\"variants\":[\"revolve_cut.360\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"reverse\":false,\"route\":\"FeatureRevolve2\",\"sketch\":\"Sketch33\"},\"step\":5},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,7.0],[10.0,10.0]]}},{\"line\":{\"construction\":true,\"fromMm\":[-1.0,0.0],\"toMm\":[11.0,0.0]}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"sketch.construction\",\"what\":\"construction geometry (CreateCenterLine; arcs with ConstructionGeometry)\"}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\",\"sketch.multiProfile\",\"sketch.construction\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"resolvedPlane\":null,\"sketch\":\"Sketch34\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":6},{\"op\":\"revolve_cut\",\"result\":{\"angleDeg\":180.0,\"axis\":{\"entity\":1,\"mark\":4,\"segment\":\"Line5\",\"selectedVia\":\"SelectByID2 EXTSKETCHSEGMENT\"},\"feature\":\"Cut-Revolve2\",\"midPlane\":true,\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"revolve_cut.midPlane\",\"what\":\"a revolve-cut symmetric about the sketch plane\"}],\"variants\":[\"revolve_cut.midPlane\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"reverse\":false,\"route\":\"FeatureRevolve2\",\"sketch\":\"Sketch34\"},\"step\":7},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":8}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 39.1,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 8 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 685s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 8,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch25",+ "Boss-Extrude12",+ "Plane8",+ "Sketch26",+ "Cut-Extrude14",+ "Sketch27",+ "Cut-Extrude15",+ "Sketch28",+ "Cut-Extrude16",+ "Plane9",+ "Sketch29",+ "Cut-Extrude17",+ "Sketch30",+ "Cut-Extrude18",+ "Sketch31",+ "Cut-Extrude19"+ ],+ "featuresDeleted": 16,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 3.0+ ],+ "toMm": [+ 0.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 0.0,+ 10.0+ ],+ "toMm": [+ 30.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 30.0,+ 10.0+ ],+ "toMm": [+ 30.0,+ 15.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 30.0,+ 15.0+ ],+ "toMm": [+ 70.0,+ 15.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 70.0,+ 15.0+ ],+ "toMm": [+ 70.0,+ 8.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 70.0,+ 8.0+ ],+ "toMm": [+ 95.0,+ 8.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 95.0,+ 8.0+ ],+ "toMm": [+ 95.0,+ 3.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 95.0,+ 3.0+ ],+ "toMm": [+ 0.0,+ 3.0+ ]+ }+ },+ {+ "line": {+ "construction": true,+ "fromMm": [+ -1.0,+ 0.0+ ],+ "toMm": [+ 96.0,+ 0.0+ ]+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "sketch.construction",+ "what": "construction geometry (CreateCenterLine; arcs with ConstructionGeometry)"+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.construction"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "resolvedPlane": null,+ "sketch": "Sketch32",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "revolve",+ "result": {+ "angleDeg": 360.0,+ "axis": {+ "entity": 8,+ "mark": 4,+ "segment": "Line9",+ "selectedVia": "SelectByID2 EXTSKETCHSEGMENT"+ },+ "feature": "Revolve1",+ "midPlane": false,+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "revolve.360",+ "what": "a full revolve about a line of the sketch (FeatureRevolve2)"+ }+ ],+ "variants": [+ "revolve.360"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "reverse": false,+ "route": "FeatureRevolve2",+ "sketch": "Sketch32"+ },+ "step": 3+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 45.0,+ 13.0+ ],+ [+ 49.99999999999999,+ 15.0+ ]+ ]+ }+ },+ {+ "line": {+ "construction": true,+ "fromMm": [+ 44.0,+ 0.0+ ],+ "toMm": [+ 50.99999999999999,+ 0.0+ ]+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "sketch.construction",+ "what": "construction geometry (CreateCenterLine; arcs with ConstructionGeometry)"+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect",+ "sketch.multiProfile",+ "sketch.construction"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "resolvedPlane": null,+ "sketch": "Sketch33",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 4+ },+ {+ "op": "revolve_cut",+ "result": {+ "angleDeg": 360.0,+ "axis": {+ "entity": 1,+ "mark": 4,+ "segment": "Line5",+ "selectedVia": "SelectByID2 EXTSKETCHSEGMENT"+ },+ "feature": "Cut-Revolve1",+ "midPlane": false,+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "revolve_cut.360",+ "what": "a full revolve-cut (FeatureRevolve2 with IsCut)"+ }+ ],+ "variants": [+ "revolve_cut.360"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "reverse": false,+ "route": "FeatureRevolve2",+ "sketch": "Sketch33"+ },+ "step": 5+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 7.0+ ],+ [+ 10.0,+ 10.0+ ]+ ]+ }+ },+ {+ "line": {+ "construction": true,+ "fromMm": [+ -1.0,+ 0.0+ ],+ "toMm": [+ 11.0,+ 0.0+ ]+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "sketch.construction",+ "what": "construction geometry (CreateCenterLine; arcs with ConstructionGeometry)"+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect",+ "sketch.multiProfile",+ "sketch.construction"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "resolvedPlane": null,+ "sketch": "Sketch34",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 6+ },+ {+ "op": "revolve_cut",+ "result": {+ "angleDeg": 180.0,+ "axis": {+ "entity": 1,+ "mark": 4,+ "segment": "Line5",+ "selectedVia": "SelectByID2 EXTSKETCHSEGMENT"+ },+ "feature": "Cut-Revolve2",+ "midPlane": true,+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "revolve_cut.midPlane",+ "what": "a revolve-cut symmetric about the sketch plane"+ }+ ],+ "variants": [+ "revolve_cut.midPlane"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "reverse": false,+ "route": "FeatureRevolve2",+ "sketch": "Sketch34"+ },+ "step": 7+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 8+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ -0.015,+ -0.015,+ 0.095,+ 0.015,+ 0.015+ ],+ "centerOfMass": [+ 0.04683149058149059,+ -0.00011418487317649497,+ 4.322366645210338e-19+ ],+ "centerOfMassMm": [+ 46.831491,+ -0.114185,+ 0.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2831,+ "error": "",+ "massG": 103.5688850108947,+ "massKg": 0.1035688850108947,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,-0.015,-0.015,0.095,0.015,0.015],\"centerOfMass\":[0.04683149058149059,-0.00011418487317649497,4.322366645210338e-19],\"centerOfMassMm\":[46.831491,-0.114185,0.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":103.5688850108947,\"massKg\":0.1035688850108947,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 729s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.010314158421317086,\"surfaceAreaMm2\":10314.158421317086,\"timeoutSeconds\":120,\"volumeM3\":0.00003835884630033137,\"volumeMm3\":38358.84630033137}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 729s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.010314158421317086,+ "surfaceAreaMm2": 10314.158421317086,+ "timeoutSeconds": 120,+ "volumeM3": 3.835884630033137e-05,+ "volumeMm3": 38358.84630033137+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 103.568885,+ "measured": 103.5688850108947,+ "offPct": 1.0519287848706173e-08,+ "pass": true+ },+ {+ "quantity": "volumeMm3",+ "expected": 38358.8463,+ "measured": 38358.84630033137,+ "offPct": 8.638657561052762e-10,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 46.831491,+ -0.114185,+ 0.0+ ],+ "measured": [+ 46.831491,+ -0.114185,+ 0.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 46.7+ },+ {+ "id": "cswa-10-community-mirrored-block",+ "title": "Community: a stepped block - one quarter, mirrored about Front Plane (features) and Right Plane (bodies); a boss mirrored about an offset plane",+ "official": false,+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "expected": {+ "massG": 722.912919,+ "volumeMm3": 91507.964474,+ "centerOfMassMm": [+ -0.082395,+ 16.02733,+ 0.0+ ],+ "tolerancePct": 0.1+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 53392,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":47.6,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 9 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 732s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":9,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch32\",\"Revolve1\",\"Cut-Revolve1\",\"Cut-Revolve2\",\"Sketch33\",\"Sketch34\"],\"featuresDeleted\":6,\"passes\":2,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,0.0],\"toMm\":[60.0,0.0]}},{\"line\":{\"fromMm\":[60.0,0.0],\"toMm\":[60.0,10.0]}},{\"line\":{\"fromMm\":[60.0,10.0],\"toMm\":[40.0,10.0]}},{\"line\":{\"fromMm\":[40.0,10.0],\"toMm\":[40.0,25.0]}},{\"line\":{\"fromMm\":[40.0,25.0],\"toMm\":[20.0,25.0]}},{\"line\":{\"fromMm\":[20.0,25.0],\"toMm\":[20.0,40.0]}},{\"line\":{\"fromMm\":[20.0,40.0],\"toMm\":[0.0,40.0]}},{\"line\":{\"fromMm\":[0.0,40.0],\"toMm\":[0.0,0.0]}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.multiProfile\",\"sketch.line\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch35\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":15.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude13\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch35\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"mirror\",\"result\":{\"feature\":\"Mirror1\",\"mirrorBody\":false,\"mirrored\":[\"Boss-Extrude13\"],\"plane\":\"Front Plane\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"mirror.features.plane\",\"what\":\"features mirrored about a named plane (InsertMirrorFeature2, features mark 1, plane mark 2)\"}],\"variants\":[\"mirror.features.plane\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"route\":\"InsertMirrorFeature2\",\"scope\":{\"id\":0,\"member\":\"swFeatureScope_AllBodies\"}},\"step\":4},{\"op\":\"mirror\",\"result\":{\"feature\":\"Mirror2\",\"mirrorBody\":true,\"mirrored\":[\"Mirror1\"],\"plane\":\"Right Plane\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"mirror.bodies.plane\",\"what\":\"every body mirrored about a named plane (BMirrorBody, bodies mark 256)\"}],\"variants\":[\"mirror.bodies.plane\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"route\":\"InsertMirrorFeature2\",\"scope\":{\"id\":0,\"member\":\"swFeatureScope_AllBodies\"}},\"step\":5},{\"op\":\"sketch_circle\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[-15.0,0.0],\"radiusMm\":4.0}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[0.0,40.0,0.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.top.positive\",\"sketch.circle\",\"select.multiSelectTyped\"]},\"radiusMm\":4.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,1.0,-0.0],\"offsetFrom\":\"Top Plane\",\"offsetMm\":40.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch36\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":6},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":15.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[-0.0,1.0,-0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude14\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch36\",\"throughAll\":false,\"upToFace\":null},\"step\":7},{\"op\":\"mirror\",\"result\":{\"feature\":\"Mirror3\",\"mirrorBody\":false,\"mirrored\":[\"Boss-Extrude14\"],\"plane\":{\"createdPlane\":\"Plane10\",\"offsetFrom\":\"Right Plane\",\"offsetMm\":-5.0,\"plane\":\"Plane10\",\"verified\":true},\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"mirror.features.offset\",\"what\":\"features mirrored about an offset plane\"}],\"variants\":[\"mirror.features.offset\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"route\":\"InsertMirrorFeature2\",\"scope\":{\"id\":0,\"member\":\"swFeatureScope_AllBodies\"}},\"step\":8},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":9}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 47.6,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 9 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 732s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 9,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch32",+ "Revolve1",+ "Cut-Revolve1",+ "Cut-Revolve2",+ "Sketch33",+ "Sketch34"+ ],+ "featuresDeleted": 6,+ "passes": 2,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 0.0+ ],+ "toMm": [+ 60.0,+ 0.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 60.0,+ 0.0+ ],+ "toMm": [+ 60.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 60.0,+ 10.0+ ],+ "toMm": [+ 40.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 40.0,+ 10.0+ ],+ "toMm": [+ 40.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 40.0,+ 25.0+ ],+ "toMm": [+ 20.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 20.0,+ 25.0+ ],+ "toMm": [+ 20.0,+ 40.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 20.0,+ 40.0+ ],+ "toMm": [+ 0.0,+ 40.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 0.0,+ 40.0+ ],+ "toMm": [+ 0.0,+ 0.0+ ]+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.multiProfile",+ "sketch.line"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch35",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 15.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude13",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch35",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "mirror",+ "result": {+ "feature": "Mirror1",+ "mirrorBody": false,+ "mirrored": [+ "Boss-Extrude13"+ ],+ "plane": "Front Plane",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "mirror.features.plane",+ "what": "features mirrored about a named plane (InsertMirrorFeature2, features mark 1, plane mark 2)"+ }+ ],+ "variants": [+ "mirror.features.plane"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "route": "InsertMirrorFeature2",+ "scope": {+ "id": 0,+ "member": "swFeatureScope_AllBodies"+ }+ },+ "step": 4+ },+ {+ "op": "mirror",+ "result": {+ "feature": "Mirror2",+ "mirrorBody": true,+ "mirrored": [+ "Mirror1"+ ],+ "plane": "Right Plane",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "mirror.bodies.plane",+ "what": "every body mirrored about a named plane (BMirrorBody, bodies mark 256)"+ }+ ],+ "variants": [+ "mirror.bodies.plane"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "route": "InsertMirrorFeature2",+ "scope": {+ "id": 0,+ "member": "swFeatureScope_AllBodies"+ }+ },+ "step": 5+ },+ {+ "op": "sketch_circle",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ -15.0,+ 0.0+ ],+ "radiusMm": 4.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 0.0,+ 40.0,+ 0.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.top.positive",+ "sketch.circle",+ "select.multiSelectTyped"+ ]+ },+ "radiusMm": 4.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "offsetFrom": "Top Plane",+ "offsetMm": 40.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch36",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 6+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 15.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ -0.0,+ 1.0,+ -0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude14",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch36",+ "throughAll": false,+ "upToFace": null+ },+ "step": 7+ },+ {+ "op": "mirror",+ "result": {+ "feature": "Mirror3",+ "mirrorBody": false,+ "mirrored": [+ "Boss-Extrude14"+ ],+ "plane": {+ "createdPlane": "Plane10",+ "offsetFrom": "Right Plane",+ "offsetMm": -5.0,+ "plane": "Plane10",+ "verified": true+ },+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "mirror.features.offset",+ "what": "features mirrored about an offset plane"+ }+ ],+ "variants": [+ "mirror.features.offset"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "route": "InsertMirrorFeature2",+ "scope": {+ "id": 0,+ "member": "swFeatureScope_AllBodies"+ }+ },+ "step": 8+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 9+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.06,+ 0.0,+ -0.015,+ 0.06,+ 0.055,+ 0.015+ ],+ "centerOfMass": [+ -8.239525829230276e-05,+ 0.01602732965307076,+ 1.2215704700278249e-18+ ],+ "centerOfMassMm": [+ -0.082395,+ 16.02733,+ 0.0+ ],+ "density": 7899.999999999999,+ "densityKgM3": 7899.999999999999,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 3608,+ "error": "",+ "massG": 722.9129193424126,+ "massKg": 0.7229129193424125,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.06,0.0,-0.015,0.06,0.055,0.015],\"centerOfMass\":[-0.00008239525829230276,0.01602732965307076,1.2215704700278249e-18],\"centerOfMassMm\":[-0.082395,16.02733,0.0],\"density\":7899.999999999999,\"densityKgM3\":7899.999999999999,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":722.9129193424126,\"massKg\":0.7229129193424125,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 786s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.016353982236861547,\"surfaceAreaMm2\":16353.982236861548,\"timeoutSeconds\":120,\"volumeM3\":0.00009150796447372313,\"volumeMm3\":91507.96447372311}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 786s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.016353982236861547,+ "surfaceAreaMm2": 16353.982236861548,+ "timeoutSeconds": 120,+ "volumeM3": 9.150796447372313e-05,+ "volumeMm3": 91507.96447372311+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 722.912919,+ "measured": 722.9129193424126,+ "offPct": 4.736567596544381e-08,+ "pass": true+ },+ {+ "quantity": "volumeMm3",+ "expected": 91507.964474,+ "measured": 91507.96447372311,+ "offPct": 3.02573981009932e-10,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ -0.082395,+ 16.02733,+ 0.0+ ],+ "measured": [+ -0.082395,+ 16.02733,+ 0.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 57.0+ },+ {+ "id": "cswa-11-community-slotted-plate",+ "title": "Community: a plate with two straight slots, a hexagon pocket, a counterbored and a countersunk hole",+ "official": false,+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "expected": {+ "massG": 276.35927,+ "volumeMm3": 102355.285153,+ "centerOfMassMm": [+ 1.375325,+ 5.907388,+ 0.035809+ ],+ "tolerancePct": 0.1+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 83954,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":78.0,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 10 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 789s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":10,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch35\",\"Boss-Extrude13\",\"Mirror1\",\"Mirror2\",\"Sketch36\",\"Boss-Extrude14\",\"Plane10\",\"Mirror3\"],\"featuresDeleted\":8,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-60.0,-40.0],[60.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch37\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false,\"widthMm\":120.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":12.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude15\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch37\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[-45.0,15.0],\"toMm\":[-15.0,15.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[-15.0,20.0],\"endMm\":[-15.0,25.0],\"radiusMm\":5.000000000000001,\"startMm\":[-15.0,15.0]}},{\"line\":{\"fromMm\":[-15.0,25.0],\"toMm\":[-45.0,25.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[-45.0,20.0],\"endMm\":[-45.0,15.0],\"radiusMm\":5.000000000000001,\"startMm\":[-45.0,25.0]}},{\"line\":{\"fromMm\":[-45.0,-25.0],\"toMm\":[-15.0,-25.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[-15.0,-20.0],\"endMm\":[-15.0,-15.0],\"radiusMm\":5.000000000000001,\"startMm\":[-15.0,-25.0]}},{\"line\":{\"fromMm\":[-15.0,-15.0],\"toMm\":[-45.0,-15.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[-45.0,-20.0],\"endMm\":[-45.0,-25.0],\"radiusMm\":5.000000000000001,\"startMm\":[-45.0,-15.0]}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[0.0,12.0,0.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.top.positive\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[-0.0,1.0,-0.0],\"offsetFrom\":\"Top Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch38\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":4},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[-0.0,1.0,-0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude20\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"cut.one.throughAll\",\"what\":\"a cut through all, the default direction (into a face)\"}],\"variants\":[\"cut.one.throughAll\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch38\",\"throughAll\":true,\"upToFace\":null},\"step\":5},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[37.00000000000001,0.0],\"toMm\":[31.000000000000004,10.392304845413264]}},{\"line\":{\"fromMm\":[31.000000000000004,10.392304845413264],\"toMm\":[19.000000000000004,10.392304845413266]}},{\"line\":{\"fromMm\":[19.000000000000004,10.392304845413266],\"toMm\":[13.0,1.469527624586853e-15]}},{\"line\":{\"fromMm\":[13.0,1.469527624586853e-15],\"toMm\":[18.999999999999996,-10.39230484541326]}},{\"line\":{\"fromMm\":[18.999999999999996,-10.39230484541326],\"toMm\":[31.000000000000004,-10.392304845413264]}},{\"line\":{\"fromMm\":[31.000000000000004,-10.392304845413264],\"toMm\":[37.00000000000001,-2.939055249173706e-15]}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[0.0,12.0,0.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.top.positive\",\"sketch.multiProfile\",\"sketch.line\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[-0.0,1.0,-0.0],\"offsetFrom\":\"Top Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch39\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":6},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":5.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[-0.0,1.0,-0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude21\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch39\",\"throughAll\":false,\"upToFace\":null},\"step\":7},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":8.0,\"face\":{\"atPointMm\":[45.0,12.0,-25.0],\"heightMm\":12.0,\"normal\":[-0.0,1.0,-0.0],\"pickedBy\":\"geometry\",\"plane\":\"Top Plane\"},\"feature\":\"Cut-Extrude23\",\"features\":[\"Cut-Extrude22\",\"Cut-Extrude23\"],\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"hole.counterbore\",\"what\":\"a counterbored hole (two cuts)\"}],\"variants\":[\"hole.counterbore\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane11\",\"entities\":[{\"circle\":{\"centerMm\":[45.0,25.0],\"radiusMm\":7.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":7.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":12.0,\"plane\":\"Plane11\",\"verified\":true},\"sketch\":\"Sketch40\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane11\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":4.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude22\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch40\",\"throughAll\":false,\"upToFace\":null}},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane12\",\"entities\":[{\"circle\":{\"centerMm\":[45.0,25.0],\"radiusMm\":4.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":8.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":4.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":8.0,\"plane\":\"Plane12\",\"verified\":true},\"sketch\":\"Sketch41\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane12\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude23\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch41\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":8},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":8.0,\"face\":{\"atPointMm\":[45.0,12.0,25.0],\"heightMm\":12.0,\"normal\":[-0.0,1.0,-0.0],\"pickedBy\":\"geometry\",\"plane\":\"Top Plane\"},\"feature\":\"Cut-Extrude25\",\"features\":[\"Cut-Extrude24\",\"Cut-Extrude25\"],\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"hole.countersink\",\"what\":\"a countersunk hole (a drafted cut, then the hole)\"}],\"variants\":[\"hole.countersink\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[45.0,-25.0],\"radiusMm\":8.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":8.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":12.0,\"plane\":\"Plane11\",\"verified\":true},\"sketch\":\"Sketch42\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane11\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":4.000000000000001,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":45.0,\"draftInward\":true,\"endCondition\":0,\"feature\":\"Cut-Extrude24\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch42\",\"throughAll\":false,\"upToFace\":null}},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[45.0,-25.0],\"radiusMm\":4.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":8.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":4.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":8.0,\"plane\":\"Plane12\",\"verified\":true},\"sketch\":\"Sketch43\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane12\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude25\",\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch43\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":9},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":10}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 78.0,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 10 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 789s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 10,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch35",+ "Boss-Extrude13",+ "Mirror1",+ "Mirror2",+ "Sketch36",+ "Boss-Extrude14",+ "Plane10",+ "Mirror3"+ ],+ "featuresDeleted": 8,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -60.0,+ -40.0+ ],+ [+ 60.0,+ 40.0+ ]+ ]+ }+ }+ ],+ "heightMm": 80.0,+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch37",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false,+ "widthMm": 120.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 12.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude15",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch37",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ -45.0,+ 15.0+ ],+ "toMm": [+ -15.0,+ 15.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ -15.0,+ 20.0+ ],+ "endMm": [+ -15.0,+ 25.0+ ],+ "radiusMm": 5.000000000000001,+ "startMm": [+ -15.0,+ 15.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -15.0,+ 25.0+ ],+ "toMm": [+ -45.0,+ 25.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ -45.0,+ 20.0+ ],+ "endMm": [+ -45.0,+ 15.0+ ],+ "radiusMm": 5.000000000000001,+ "startMm": [+ -45.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -45.0,+ -25.0+ ],+ "toMm": [+ -15.0,+ -25.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ -15.0,+ -20.0+ ],+ "endMm": [+ -15.0,+ -15.0+ ],+ "radiusMm": 5.000000000000001,+ "startMm": [+ -15.0,+ -25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -15.0,+ -15.0+ ],+ "toMm": [+ -45.0,+ -15.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ -45.0,+ -20.0+ ],+ "endMm": [+ -45.0,+ -25.0+ ],+ "radiusMm": 5.000000000000001,+ "startMm": [+ -45.0,+ -15.0+ ]+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 0.0,+ 12.0,+ 0.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.top.positive",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "offsetFrom": "Top Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch38",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 4+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ -0.0,+ 1.0,+ -0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude20",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "cut.one.throughAll",+ "what": "a cut through all, the default direction (into a face)"+ }+ ],+ "variants": [+ "cut.one.throughAll"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch38",+ "throughAll": true,+ "upToFace": null+ },+ "step": 5+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 37.00000000000001,+ 0.0+ ],+ "toMm": [+ 31.000000000000004,+ 10.392304845413264+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 31.000000000000004,+ 10.392304845413264+ ],+ "toMm": [+ 19.000000000000004,+ 10.392304845413266+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 19.000000000000004,+ 10.392304845413266+ ],+ "toMm": [+ 13.0,+ 1.469527624586853e-15+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 13.0,+ 1.469527624586853e-15+ ],+ "toMm": [+ 18.999999999999996,+ -10.39230484541326+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 18.999999999999996,+ -10.39230484541326+ ],+ "toMm": [+ 31.000000000000004,+ -10.392304845413264+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 31.000000000000004,+ -10.392304845413264+ ],+ "toMm": [+ 37.00000000000001,+ -2.939055249173706e-15+ ]+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 0.0,+ 12.0,+ 0.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.top.positive",+ "sketch.multiProfile",+ "sketch.line",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "offsetFrom": "Top Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch39",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 6+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 5.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ -0.0,+ 1.0,+ -0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude21",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch39",+ "throughAll": false,+ "upToFace": null+ },+ "step": 7+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 8.0,+ "face": {+ "atPointMm": [+ 45.0,+ 12.0,+ -25.0+ ],+ "heightMm": 12.0,+ "normal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "pickedBy": "geometry",+ "plane": "Top Plane"+ },+ "feature": "Cut-Extrude23",+ "features": [+ "Cut-Extrude22",+ "Cut-Extrude23"+ ],+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "hole.counterbore",+ "what": "a counterbored hole (two cuts)"+ }+ ],+ "variants": [+ "hole.counterbore"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane11",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 45.0,+ 25.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 7.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 12.0,+ "plane": "Plane11",+ "verified": true+ },+ "sketch": "Sketch40",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane11",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 4.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude22",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch40",+ "throughAll": false,+ "upToFace": null+ }+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane12",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 45.0,+ 25.0+ ],+ "radiusMm": 4.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 8.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 4.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 8.0,+ "plane": "Plane12",+ "verified": true+ },+ "sketch": "Sketch41",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane12",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude23",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch41",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 8+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 8.0,+ "face": {+ "atPointMm": [+ 45.0,+ 12.0,+ 25.0+ ],+ "heightMm": 12.0,+ "normal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "pickedBy": "geometry",+ "plane": "Top Plane"+ },+ "feature": "Cut-Extrude25",+ "features": [+ "Cut-Extrude24",+ "Cut-Extrude25"+ ],+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "hole.countersink",+ "what": "a countersunk hole (a drafted cut, then the hole)"+ }+ ],+ "variants": [+ "hole.countersink"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 45.0,+ -25.0+ ],+ "radiusMm": 8.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 8.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 12.0,+ "plane": "Plane11",+ "verified": true+ },+ "sketch": "Sketch42",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane11",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 4.000000000000001,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": 45.0,+ "draftInward": true,+ "endCondition": 0,+ "feature": "Cut-Extrude24",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch42",+ "throughAll": false,+ "upToFace": null+ }+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 45.0,+ -25.0+ ],+ "radiusMm": 4.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 8.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 4.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 8.0,+ "plane": "Plane12",+ "verified": true+ },+ "sketch": "Sketch43",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane12",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude25",+ "regions": null,+ "reverse": false,+ "sketch": "Sketch43",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 9+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 10+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.06,+ 0.0,+ -0.04,+ 0.06,+ 0.012,+ 0.04+ ],+ "centerOfMass": [+ 0.001029833412117897,+ 0.005880255965529374,+ -0.00016189890294791875+ ],+ "centerOfMassMm": [+ 1.029833,+ 5.880256,+ -0.161899+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 3402,+ "error": "",+ "massG": 274.1878010717839,+ "massKg": 0.2741878010717839,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.06,0.0,-0.04,0.06,0.012,0.04],\"centerOfMass\":[0.001029833412117897,0.005880255965529374,-0.00016189890294791875],\"centerOfMassMm\":[1.029833,5.880256,-0.161899],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":274.1878010717839,\"massKg\":0.2741878010717839,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 873s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.026023572137273195,\"surfaceAreaMm2\":26023.572137273193,\"timeoutSeconds\":120,\"volumeM3\":0.00010155103743399405,\"volumeMm3\":101551.03743399405}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 873s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.026023572137273195,+ "surfaceAreaMm2": 26023.572137273193,+ "timeoutSeconds": 120,+ "volumeM3": 0.00010155103743399405,+ "volumeMm3": 101551.03743399405+ },+ "pass": false,+ "checks": [+ {+ "quantity": "massG",+ "expected": 276.35927,+ "measured": 274.1878010717839,+ "offPct": 0.7857413026948893,+ "pass": false+ },+ {+ "quantity": "volumeMm3",+ "expected": 102355.285153,+ "measured": 101551.03743399405,+ "offPct": 0.7857412714973866,+ "pass": false+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 1.375325,+ 5.907388,+ 0.035809+ ],+ "measured": [+ 1.029833,+ 5.880256,+ -0.161899+ ],+ "pass": false+ }+ ],+ "fails": [+ "massG: 274.1878010717839 vs 276.35927 (0.7857413026948893 % off)",+ "volumeMm3: 101551.03743399405 vs 102355.285153 (0.7857412714973866 % off)",+ "centerOfMassMm: [1.029833, 5.880256, -0.161899] vs [1.375325, 5.907388, 0.035809] (None % off)"+ ],+ "seconds": 87.4+ },+ {+ "id": "cswa-12-community-up-to-plates",+ "title": "Community: three plates joined by pillars ending up to next, up to a face and 8 short of a face; a drafted boss, a cut up to a face, a drafted pocket",+ "official": false,+ "source": "community: built for the bridge's benchmark (no exam publishes it); the key is derived analytically in `derivation`",+ "expected": {+ "massG": 369.687533,+ "volumeMm3": 136921.308673,+ "centerOfMassMm": [+ 40.525243,+ 24.723219,+ 45.869733+ ],+ "tolerancePct": 0.1+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792190208004.SLDPRT",+ "durationMs": 217369,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792190208004.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":93.1,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 20 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 877s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":20,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792190208004.SLDPRT\",\"deleted\":[\"Sketch37\",\"Boss-Extrude15\",\"Sketch38\",\"Cut-Extrude20\",\"Sketch39\",\"Cut-Extrude21\",\"Plane11\",\"Sketch40\",\"Cut-Extrude22\",\"Plane12\",\"Sketch41\",\"Cut-Extrude23\",\"Sketch42\",\"Cut-Extrude24\",\"Sketch43\",\"Cut-Extrude25\"],\"featuresDeleted\":16,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[80.0,50.0]]}}],\"heightMm\":50.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch44\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":80.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":10.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude16\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch44\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":\"Plane13\",\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[80.0,50.0]]}}],\"heightMm\":50.0,\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":40.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.4\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.front.positive\",\"sketch.rect\"]},\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":40.0,\"plane\":\"Plane13\",\"verified\":true},\"sketch\":\"Sketch45\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane13\",\"transformInverted\":false,\"widthMm\":80.0},\"step\":4},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":10.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude17\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch45\",\"throughAll\":false,\"upToFace\":null},\"step\":5},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":\"Plane14\",\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[80.0,50.0]]}}],\"heightMm\":50.0,\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":80.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.4\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.front.positive\",\"sketch.rect\"]},\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":80.0,\"plane\":\"Plane14\",\"verified\":true},\"sketch\":\"Sketch46\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane14\",\"transformInverted\":false,\"widthMm\":80.0},\"step\":6},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":10.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude18\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch46\",\"throughAll\":false,\"upToFace\":null},\"step\":7},{\"op\":\"sketch_circle\",\"result\":{\"createdPlane\":\"Plane15\",\"entities\":[{\"circle\":{\"centerMm\":[12.0,25.0],\"radiusMm\":6.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":10.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.4\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.front.positive\",\"sketch.circle\"]},\"radiusMm\":6.0,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":10.0,\"plane\":\"Plane15\",\"verified\":true},\"sketch\":\"Sketch47\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane15\",\"transformInverted\":false},\"step\":8},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":11,\"feature\":\"Boss-Extrude19\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"extrude.upToNext\",\"what\":\"a boss up to the next face (swEndCondUpToNext 11)\"}],\"variants\":[\"extrude.upToNext\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch47\",\"throughAll\":false,\"upToFace\":null},\"step\":9},{\"op\":\"sketch_circle\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[68.0,25.0],\"radiusMm\":6.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":10.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.4\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.front.positive\",\"sketch.circle\"]},\"radiusMm\":6.0,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":10.0,\"plane\":\"Plane15\",\"verified\":true},\"sketch\":\"Sketch48\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane15\",\"transformInverted\":false},\"step\":10},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":8.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":5,\"feature\":\"Boss-Extrude20\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"extrude.offsetFromSurface\",\"what\":\"a boss to a distance from a picked face (swEndCondOffsetFromSurface 5)\"}],\"variants\":[\"extrude.offsetFromSurface\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch48\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":11},{\"op\":\"sketch_circle\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[40.0,25.0],\"radiusMm\":6.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":10.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.4\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.front.positive\",\"sketch.circle\"]},\"radiusMm\":6.0,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":10.0,\"plane\":\"Plane15\",\"verified\":true},\"sketch\":\"Sketch49\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane15\",\"transformInverted\":false},\"step\":12},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":10,\"feature\":\"Boss-Extrude21\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"extrude.upToSurface\",\"what\":\"a boss up to a picked face (swEndCondUpToSelection 10, the face at mark 1)\"}],\"variants\":[\"extrude.upToSurface\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch49\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":13},{\"op\":\"sketch_circle\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[25.0,40.0],\"radiusMm\":4.0}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[25.0,40.0,90.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.circle\",\"select.multiSelectTyped\"]},\"radiusMm\":4.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":90.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch50\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":14},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[-0.0,-0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":10,\"feature\":\"Cut-Extrude26\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"cut.upToSurface\",\"what\":\"a cut up to a picked face\"}],\"variants\":[\"cut.upToSurface\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch50\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":15},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[49.99999999999999,35.0],[69.99999999999999,45.00000000000001]]}}],\"heightMm\":10.000000000000002,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[60.0,40.0,0.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.4\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.negative\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,-1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":0.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch51\",\"sketchNormal\":[0.0,0.0,-1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":19.999999999999996},\"step\":16},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":6.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,-1.0],\"sketchNormal\":[0.0,0.0,-1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":10.0,\"draftInward\":true,\"endCondition\":0,\"feature\":\"Cut-Extrude27\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"cut.draft\",\"what\":\"a cut with draft (a countersink is one)\"}],\"variants\":[\"cut.one\",\"cut.draft\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch51\",\"throughAll\":false,\"upToFace\":null},\"step\":17},{\"op\":\"sketch_circle\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[40.0,25.0],\"radiusMm\":10.0}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[40.0,25.0,90.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.circle\",\"select.multiSelectTyped\"]},\"radiusMm\":10.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":90.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch52\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":18},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":12.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[-0.0,-0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":5.0,\"draftInward\":true,\"endCondition\":0,\"feature\":\"Boss-Extrude22\",\"proven\":{\"live\":false,\"measuredOn\":[],\"unmeasured\":[{\"variant\":\"extrude.draft\",\"what\":\"a boss with draft (Dchk1/Ddir1/Dang1)\"}],\"variants\":[\"extrude.one\",\"extrude.draft\"],\"why\":\"not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies\"},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch52\",\"throughAll\":false,\"upToFace\":null},\"step\":19},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":20}],\"success\":true,\"targetDocument\":\"Part1-1792190208004.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 93.1,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 20 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 877s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 20,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792190208004.SLDPRT",+ "deleted": [+ "Sketch37",+ "Boss-Extrude15",+ "Sketch38",+ "Cut-Extrude20",+ "Sketch39",+ "Cut-Extrude21",+ "Plane11",+ "Sketch40",+ "Cut-Extrude22",+ "Plane12",+ "Sketch41",+ "Cut-Extrude23",+ "Sketch42",+ "Cut-Extrude24",+ "Sketch43",+ "Cut-Extrude25"+ ],+ "featuresDeleted": 16,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 80.0,+ 50.0+ ]+ ]+ }+ }+ ],+ "heightMm": 50.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch44",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 80.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 10.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude16",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch44",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": "Plane13",+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 80.0,+ 50.0+ ]+ ]+ }+ }+ ],+ "heightMm": 50.0,+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 40.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.4",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.front.positive",+ "sketch.rect"+ ]+ },+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 40.0,+ "plane": "Plane13",+ "verified": true+ },+ "sketch": "Sketch45",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane13",+ "transformInverted": false,+ "widthMm": 80.0+ },+ "step": 4+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 10.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude17",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch45",+ "throughAll": false,+ "upToFace": null+ },+ "step": 5+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": "Plane14",+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 80.0,+ 50.0+ ]+ ]+ }+ }+ ],+ "heightMm": 50.0,+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 80.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.4",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.front.positive",+ "sketch.rect"+ ]+ },+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 80.0,+ "plane": "Plane14",+ "verified": true+ },+ "sketch": "Sketch46",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane14",+ "transformInverted": false,+ "widthMm": 80.0+ },+ "step": 6+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 10.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude18",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch46",+ "throughAll": false,+ "upToFace": null+ },+ "step": 7+ },+ {+ "op": "sketch_circle",+ "result": {+ "createdPlane": "Plane15",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 12.0,+ 25.0+ ],+ "radiusMm": 6.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.4",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.front.positive",+ "sketch.circle"+ ]+ },+ "radiusMm": 6.0,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10.0,+ "plane": "Plane15",+ "verified": true+ },+ "sketch": "Sketch47",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane15",+ "transformInverted": false+ },+ "step": 8+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 11,+ "feature": "Boss-Extrude19",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "extrude.upToNext",+ "what": "a boss up to the next face (swEndCondUpToNext 11)"+ }+ ],+ "variants": [+ "extrude.upToNext"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch47",+ "throughAll": false,+ "upToFace": null+ },+ "step": 9+ },+ {+ "op": "sketch_circle",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 68.0,+ 25.0+ ],+ "radiusMm": 6.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.4",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.front.positive",+ "sketch.circle"+ ]+ },+ "radiusMm": 6.0,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10.0,+ "plane": "Plane15",+ "verified": true+ },+ "sketch": "Sketch48",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane15",+ "transformInverted": false+ },+ "step": 10+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 8.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 5,+ "feature": "Boss-Extrude20",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "extrude.offsetFromSurface",+ "what": "a boss to a distance from a picked face (swEndCondOffsetFromSurface 5)"+ }+ ],+ "variants": [+ "extrude.offsetFromSurface"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch48",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 11+ },+ {+ "op": "sketch_circle",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 40.0,+ 25.0+ ],+ "radiusMm": 6.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.4",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.front.positive",+ "sketch.circle"+ ]+ },+ "radiusMm": 6.0,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 10.0,+ "plane": "Plane15",+ "verified": true+ },+ "sketch": "Sketch49",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane15",+ "transformInverted": false+ },+ "step": 12+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 10,+ "feature": "Boss-Extrude21",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "extrude.upToSurface",+ "what": "a boss up to a picked face (swEndCondUpToSelection 10, the face at mark 1)"+ }+ ],+ "variants": [+ "extrude.upToSurface"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch49",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 13+ },+ {+ "op": "sketch_circle",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 25.0,+ 40.0+ ],+ "radiusMm": 4.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 25.0,+ 40.0,+ 90.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.circle",+ "select.multiSelectTyped"+ ]+ },+ "radiusMm": 4.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 90.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch50",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 14+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ -0.0,+ -0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 10,+ "feature": "Cut-Extrude26",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "cut.upToSurface",+ "what": "a cut up to a picked face"+ }+ ],+ "variants": [+ "cut.upToSurface"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch50",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 15+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 49.99999999999999,+ 35.0+ ],+ [+ 69.99999999999999,+ 45.00000000000001+ ]+ ]+ }+ }+ ],+ "heightMm": 10.000000000000002,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 60.0,+ 40.0,+ 0.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.4",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.negative",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ -1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 0.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch51",+ "sketchNormal": [+ 0.0,+ 0.0,+ -1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 19.999999999999996+ },+ "step": 16+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 6.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ -1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ -1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": 10.0,+ "draftInward": true,+ "endCondition": 0,+ "feature": "Cut-Extrude27",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "cut.draft",+ "what": "a cut with draft (a countersink is one)"+ }+ ],+ "variants": [+ "cut.one",+ "cut.draft"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch51",+ "throughAll": false,+ "upToFace": null+ },+ "step": 17+ },+ {+ "op": "sketch_circle",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 40.0,+ 25.0+ ],+ "radiusMm": 10.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ 40.0,+ 25.0,+ 90.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.circle",+ "select.multiSelectTyped"+ ]+ },+ "radiusMm": 10.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 90.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch52",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 18+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 12.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ -0.0,+ -0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": 5.0,+ "draftInward": true,+ "endCondition": 0,+ "feature": "Boss-Extrude22",+ "proven": {+ "live": false,+ "measuredOn": [],+ "unmeasured": [+ {+ "variant": "extrude.draft",+ "what": "a boss with draft (Dchk1/Ddir1/Dang1)"+ }+ ],+ "variants": [+ "extrude.one",+ "extrude.draft"+ ],+ "why": "not measured live: see `unmeasured` \u2014 verify this step's geometry with swx_inspect_bodies"+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch52",+ "throughAll": false,+ "upToFace": null+ },+ "step": 19+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 20+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792190208004.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.08,+ 0.05,+ 0.102+ ],+ "centerOfMass": [+ 0.04036474302758968,+ 0.024788574915418752,+ 0.04565723007162324+ ],+ "centerOfMassMm": [+ 40.364743,+ 24.788575,+ 45.65723+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792190208004.SLDPRT",+ "title": "Part1-1792190208004.SLDPRT",+ "type": "part"+ },+ "durationMs": 2457,+ "error": "",+ "massG": 364.34990904198503,+ "massKg": 0.36434990904198505,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.08,0.05,0.102],\"centerOfMass\":[0.04036474302758968,0.024788574915418752,0.04565723007162324],\"centerOfMassMm\":[40.364743,24.788575,45.65723],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792190208004.SLDPRT\",\"title\":\"Part1-1792190208004.SLDPRT\",\"type\":\"part\"},\"massG\":364.34990904198503,\"massKg\":0.36434990904198505,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 1094s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.03681982422825422,\"surfaceAreaMm2\":36819.82422825422,\"timeoutSeconds\":120,\"volumeM3\":0.00013494441075629076,\"volumeMm3\":134944.41075629074}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 1094s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.03681982422825422,+ "surfaceAreaMm2": 36819.82422825422,+ "timeoutSeconds": 120,+ "volumeM3": 0.00013494441075629076,+ "volumeMm3": 134944.41075629074+ },+ "pass": false,+ "checks": [+ {+ "quantity": "massG",+ "expected": 369.687533,+ "measured": 364.34990904198503,+ "offPct": 1.4438203838523667,+ "pass": false+ },+ {+ "quantity": "volumeMm3",+ "expected": 136921.308673,+ "measured": 134944.41075629074,+ "offPct": 1.4438204950483935,+ "pass": false+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 40.525243,+ 24.723219,+ 45.869733+ ],+ "measured": [+ 40.364743,+ 24.788575,+ 45.65723+ ],+ "pass": false+ }+ ],+ "fails": [+ "massG: 364.34990904198503 vs 369.687533 (1.4438203838523667 % off)",+ "volumeMm3: 134944.41075629074 vs 136921.308673 (1.4438204950483935 % off)",+ "centerOfMassMm: [40.364743, 24.788575, 45.65723] vs [40.525243, 24.723219, 45.869733] (None % off)"+ ],+ "seconds": 219.8+ }+ ]+}
tools/cswa/reports/cswa-2026-10-20-sw2026-0.11.4.jsonadded+6739@@ -0,0 +1,12377 @@+{+ "tool": "cswa-check",+ "when": "2026-10-20T13:20:00Z",+ "whenEpoch": 1792502400,+ "target": "adom_drew2",+ "bridgeVersion": "0.11.4",+ "bridge": {+ "source": "ab bridge_info + read_file (read-only)",+ "version": "0.11.4",+ "installPath": "C:/Users/drew/AppData/Local/Adom Bridge/bridges-cache/solidworks",+ "manifestUrl": "https://wiki.adom.inc/api/v1/pages/solidworks-bridge/files/adom-bridge-solidworks-manifest.json",+ "installSource": "cache",+ "exeSha256": "1f812642e2d0d4f99571db670f1c391e00c3663926684d1b1a2ec9e12dc26bff",+ "bridgeJsonSha256": "af4d848ed8676c05b8bdcec089b1af3698c789b8977d3128f5332d859af98243",+ "installedFrom": "https://wiki.adom.inc/api/v1/pages/adom/solidworks-bridge/files/manifests/canary.json"+ },+ "solidworks": {+ "majorVersion": 34,+ "edition": "connected",+ "versionSupport": {+ "lacks": [],+ "majorVersion": 34,+ "revision": "34.3.0",+ "supported": true,+ "supportedFrom": 2021,+ "tested": true,+ "testedOn": [+ 2026,+ 2021+ ],+ "year": 2026+ }+ },+ "summary": "14 of 14 CSWA parts within tolerance",+ "passed": 14,+ "ran": 14,+ "skipped": 0,+ "stopped": null,+ "allPassed": true,+ "parts": [+ {+ "id": "cswa-00-lego-2x4",+ "title": "LEGO 2x4 brick (spec 0: the acceptance brick, not an exam part)",+ "official": false,+ "source": "adom/solidworks-bridge issue #1 (Michael, SOLIDWORKS 2021: volumeM3 2.0733615208e-6 from swx_mass_properties); examples/lego-2x4.json",+ "expected": {+ "massG": 2.114829,+ "volumeMm3": 2073.3615208,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "ABS",+ "densityKgM3": 1020+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 19242,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":17.7,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 10 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 4s ago\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":10,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[],\"featuresDeleted\":0,\"passes\":0,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-15.9,-7.9],[15.9,7.9]]}}],\"heightMm\":15.8,\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch1\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false,\"widthMm\":31.8},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":9.6,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude1\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":9.6,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch1\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-14.7,-6.7],[14.7,6.7]]}}],\"heightMm\":13.4,\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch2\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false,\"widthMm\":29.4},\"step\":4},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":8.6,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude1\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"readBack\":{\"depthMm\":8.6,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":true,\"sketch\":\"Sketch2\",\"throughAll\":false,\"upToFace\":null},\"step\":5},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[-8.0,0.0],\"radiusMm\":3.255}},{\"circle\":{\"centerMm\":[-8.0,0.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":3.255}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[8.0,0.0],\"radiusMm\":3.255}},{\"circle\":{\"centerMm\":[8.0,0.0],\"radiusMm\":2.4}}],\"mapped\":false,\"plane\":\"Top Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.top\",\"sketch.circle\",\"sketch.multiProfile\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch3\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Top Plane\",\"transformInverted\":false},\"step\":6},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":8.6,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude2\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":8.6,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch3\",\"throughAll\":false,\"upToFace\":null},\"step\":7},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane1\",\"entities\":[{\"circle\":{\"centerMm\":[-12.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[-12.0,4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[-4.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[-4.0,4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[4.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[4.0,4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[12.0,-4.0],\"radiusMm\":2.4}},{\"circle\":{\"centerMm\":[12.0,4.0],\"radiusMm\":2.4}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":9.6},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.offset.top.positive\",\"sketch.circle\",\"sketch.multiProfile\"]},\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":9.6,\"plane\":\"Plane1\",\"verified\":true},\"sketch\":\"Sketch4\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane1\",\"transformInverted\":false},\"step\":8},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":1.7,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude3\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":1.7,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch4\",\"throughAll\":false,\"upToFace\":null},\"step\":9},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"ABS\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":1020.0,\"densityRequested\":1020.0,\"material\":\"ABS\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":10}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 17.7,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 10 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 4s ago"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 10,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [],+ "featuresDeleted": 0,+ "passes": 0,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -15.9,+ -7.9+ ],+ [+ 15.9,+ 7.9+ ]+ ]+ }+ }+ ],+ "heightMm": 15.8,+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch1",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false,+ "widthMm": 31.8+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 9.6,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude1",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 9.6,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch1",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -14.7,+ -6.7+ ],+ [+ 14.7,+ 6.7+ ]+ ]+ }+ }+ ],+ "heightMm": 13.4,+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch2",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false,+ "widthMm": 29.4+ },+ "step": 4+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 8.6,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude1",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "readBack": {+ "depthMm": 8.6,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": true,+ "sketch": "Sketch2",+ "throughAll": false,+ "upToFace": null+ },+ "step": 5+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ -8.0,+ 0.0+ ],+ "radiusMm": 3.255+ }+ },+ {+ "circle": {+ "centerMm": [+ -8.0,+ 0.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 3.255+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 8.0,+ 0.0+ ],+ "radiusMm": 3.255+ }+ },+ {+ "circle": {+ "centerMm": [+ 8.0,+ 0.0+ ],+ "radiusMm": 2.4+ }+ }+ ],+ "mapped": false,+ "plane": "Top Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.top",+ "sketch.circle",+ "sketch.multiProfile"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch3",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Top Plane",+ "transformInverted": false+ },+ "step": 6+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 8.6,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude2",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 8.6,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch3",+ "throughAll": false,+ "upToFace": null+ },+ "step": 7+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane1",+ "entities": [+ {+ "circle": {+ "centerMm": [+ -12.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ -12.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ -4.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ -4.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 4.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 4.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 12.0,+ -4.0+ ],+ "radiusMm": 2.4+ }+ },+ {+ "circle": {+ "centerMm": [+ 12.0,+ 4.0+ ],+ "radiusMm": 2.4+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 9.6+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.offset.top.positive",+ "sketch.circle",+ "sketch.multiProfile"+ ]+ },+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 9.6,+ "plane": "Plane1",+ "verified": true+ },+ "sketch": "Sketch4",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane1",+ "transformInverted": false+ },+ "step": 8+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 1.7,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude3",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 1.7,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch4",+ "throughAll": false,+ "upToFace": null+ },+ "step": 9+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "ABS"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 1020.0,+ "densityRequested": 1020.0,+ "material": "ABS",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 10+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.0159,+ 0.0,+ -0.0079,+ 0.0159,+ 0.0113,+ 0.0079+ ],+ "centerOfMass": [+ 2.493476789517029e-19,+ 0.006193169977140961,+ -1.1906351669943813e-18+ ],+ "centerOfMassMm": [+ 0.0,+ 6.19317,+ -0.0+ ],+ "density": 1020.0,+ "densityKgM3": 1020.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 868,+ "error": "",+ "massG": 2.1148287512421375,+ "massKg": 0.0021148287512421375,+ "materialName": "ABS",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.0159,0.0,-0.0079,0.0159,0.0113,0.0079],\"centerOfMass\":[2.493476789517029e-19,0.006193169977140961,-1.1906351669943813e-18],\"centerOfMassMm\":[0.0,6.19317,-0.0],\"density\":1020.0,\"densityKgM3\":1020.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":2.1148287512421375,\"massKg\":0.0021148287512421375,\"materialName\":\"ABS\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 23s ago\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.003776753621558533,\"surfaceAreaMm2\":3776.753621558533,\"timeoutSeconds\":120,\"volumeM3\":2.073361520825625e-6,\"volumeMm3\":2073.361520825625}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 23s ago"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.003776753621558533,+ "surfaceAreaMm2": 3776.753621558533,+ "timeoutSeconds": 120,+ "volumeM3": 2.073361520825625e-06,+ "volumeMm3": 2073.361520825625+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 2.114829,+ "measured": 2.1148287512421375,+ "offPct": 1.1762552069644157e-05,+ "pass": true+ },+ {+ "quantity": "volumeMm3",+ "expected": 2073.3615208,+ "measured": 2073.361520825625,+ "offPct": 1.2359163110427998e-09,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 20.1+ },+ {+ "id": "cswa-01-3dengr-q5-block",+ "title": "3dengr Q5: a 100 x 20 x 60 block in 6061",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 324.0,+ "volumeMm3": 120000.0,+ "centerOfMassMm": [+ 50.0,+ 10.0,+ 30.0+ ],+ "tolerancePct": 1.0+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 11126,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":9.5,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 24s ago\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch1\",\"Boss-Extrude1\",\"Cut-Extrude1\",\"Boss-Extrude2\",\"Plane1\",\"Sketch4\",\"Boss-Extrude3\",\"Sketch2\",\"Sketch3\"],\"featuresDeleted\":9,\"passes\":2,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[100.0,20.0]]}}],\"heightMm\":20.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch5\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":100.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":60.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude4\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":60.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch5\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 9.5,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 24s ago"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch1",+ "Boss-Extrude1",+ "Cut-Extrude1",+ "Boss-Extrude2",+ "Plane1",+ "Sketch4",+ "Boss-Extrude3",+ "Sketch2",+ "Sketch3"+ ],+ "featuresDeleted": 9,+ "passes": 2,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 100.0,+ 20.0+ ]+ ]+ }+ }+ ],+ "heightMm": 20.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch5",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 100.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 60.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude4",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 60.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch5",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.1,+ 0.02,+ 0.06+ ],+ "centerOfMass": [+ 0.05,+ 0.01,+ 0.03+ ],+ "centerOfMassMm": [+ 50.0,+ 10.0,+ 30.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 957,+ "error": "",+ "massG": 323.99999999999994,+ "massKg": 0.32399999999999995,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.1,0.02,0.06],\"centerOfMass\":[0.05,0.01,0.03],\"centerOfMassMm\":[50.0,10.0,30.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":323.99999999999994,\"massKg\":0.32399999999999995,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 35s ago\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.0184,\"surfaceAreaMm2\":18400.0,\"timeoutSeconds\":120,\"volumeM3\":0.00012,\"volumeMm3\":120000.0}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 35s ago"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.0184,+ "surfaceAreaMm2": 18400.0,+ "timeoutSeconds": 120,+ "volumeM3": 0.00012,+ "volumeMm3": 120000.0+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 324.0,+ "measured": 323.99999999999994,+ "offPct": 1.75442650804963e-14,+ "pass": true+ },+ {+ "quantity": "volumeMm3",+ "expected": 120000.0,+ "measured": 120000.0,+ "offPct": 0.0,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 50.0,+ 10.0,+ 30.0+ ],+ "measured": [+ 50.0,+ 10.0,+ 30.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 12.1+ },+ {+ "id": "cswa-02-3dengr-q6-hole",+ "title": "3dengr Q6/Q7: the block with a \u00d820 hole through it along Y at X 25, Z 30",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 307.04,+ "centerOfMassMm": [+ 51.38,+ 10.0,+ 30.0+ ],+ "tolerancePct": 1.0+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 21695,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":19.5,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 5 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 36s ago\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":5,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch5\",\"Boss-Extrude4\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[100.0,20.0]]}}],\"heightMm\":20.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch6\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":100.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":60.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude5\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":60.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch6\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":20.0,\"face\":{\"atPointMm\":[25.0,20.0,30.0],\"heightMm\":20.0,\"normal\":[-0.0,1.0,-0.0],\"pickedBy\":\"geometry\",\"plane\":\"Top Plane\"},\"feature\":\"Cut-Extrude2\",\"features\":[\"Cut-Extrude2\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane2\",\"entities\":[{\"circle\":{\"centerMm\":[25.0,-30.0],\"radiusMm\":10.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":10.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0,\"plane\":\"Plane2\",\"verified\":true},\"sketch\":\"Sketch7\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane2\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude2\",\"readBack\":{\"depthMm\":0.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":1},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch7\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":4},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":5}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 19.5,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 5 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 36s ago"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 5,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch5",+ "Boss-Extrude4"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 100.0,+ 20.0+ ]+ ]+ }+ }+ ],+ "heightMm": 20.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch6",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 100.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 60.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude5",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 60.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch6",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 20.0,+ "face": {+ "atPointMm": [+ 25.0,+ 20.0,+ 30.0+ ],+ "heightMm": 20.0,+ "normal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "pickedBy": "geometry",+ "plane": "Top Plane"+ },+ "feature": "Cut-Extrude2",+ "features": [+ "Cut-Extrude2"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane2",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 25.0,+ -30.0+ ],+ "radiusMm": 10.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 10.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0,+ "plane": "Plane2",+ "verified": true+ },+ "sketch": "Sketch7",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane2",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude2",+ "readBack": {+ "depthMm": 0.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 1+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch7",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 4+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 5+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.1,+ 0.02,+ 0.06+ ],+ "centerOfMass": [+ 0.05138132283342444,+ 0.009999999999999998,+ 0.029999999999999995+ ],+ "centerOfMassMm": [+ 51.381323,+ 10.0,+ 30.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 1401,+ "error": "",+ "massG": 307.0353996706151,+ "massKg": 0.3070353996706151,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.1,0.02,0.06],\"centerOfMass\":[0.05138132283342444,0.009999999999999998,0.029999999999999995],\"centerOfMassMm\":[51.381323,10.0,30.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":307.0353996706151,\"massKg\":0.3070353996706151,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 58s ago\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01902831853071796,\"surfaceAreaMm2\":19028.31853071796,\"timeoutSeconds\":120,\"volumeM3\":0.0001137168146928204,\"volumeMm3\":113716.8146928204}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 58s ago"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01902831853071796,+ "surfaceAreaMm2": 19028.31853071796,+ "timeoutSeconds": 120,+ "volumeM3": 0.0001137168146928204,+ "volumeMm3": 113716.8146928204+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 307.04,+ "measured": 307.0353996706151,+ "offPct": 0.0014982834109282007,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 51.38,+ 10.0,+ 30.0+ ],+ "measured": [+ 51.381323,+ 10.0,+ 30.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 23.1+ },+ {+ "id": "cswa-03-3dengr-q8-hole30",+ "title": "3dengr Q8: the hole changed to \u00d830",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 285.83,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "6061 Alloy",+ "densityKgM3": 2700+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 19506,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":17.0,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 5 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 59s ago\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":5,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch6\",\"Boss-Extrude5\",\"Plane2\",\"Sketch7\",\"Cut-Extrude2\"],\"featuresDeleted\":5,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch_rect\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[0.0,0.0],[100.0,20.0]]}}],\"heightMm\":20.0,\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.rect\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch8\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false,\"widthMm\":100.0},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":60.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude6\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":60.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch8\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":30.0,\"face\":{\"atPointMm\":[25.0,20.0,30.0],\"heightMm\":20.0,\"normal\":[-0.0,1.0,-0.0],\"pickedBy\":\"geometry\",\"plane\":\"Top Plane\"},\"feature\":\"Cut-Extrude3\",\"features\":[\"Cut-Extrude3\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane3\",\"entities\":[{\"circle\":{\"centerMm\":[25.0,-30.0],\"radiusMm\":15.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":15.0,\"resolvedPlane\":{\"offsetFrom\":\"Top Plane\",\"offsetMm\":20.0,\"plane\":\"Plane3\",\"verified\":true},\"sketch\":\"Sketch9\",\"sketchNormal\":[0.0,1.0,0.0],\"sketchedOn\":\"Plane3\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,1.0,0.0],\"sketchNormal\":[0.0,1.0,0.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude3\",\"readBack\":{\"depthMm\":0.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":1},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch9\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":4},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"6061 Alloy\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":2700.0,\"densityRequested\":2700.0,\"material\":\"6061 Alloy\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":5}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 17.0,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 5 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "add-ins are still loading: the last LOAD_ADDIN is newer than the last <3DXLOAD_TIME>, and the startup lines last changed 59s ago"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 5,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch6",+ "Boss-Extrude5",+ "Plane2",+ "Sketch7",+ "Cut-Extrude2"+ ],+ "featuresDeleted": 5,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch_rect",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ 0.0,+ 0.0+ ],+ [+ 100.0,+ 20.0+ ]+ ]+ }+ }+ ],+ "heightMm": 20.0,+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.rect"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch8",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false,+ "widthMm": 100.0+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 60.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude6",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 60.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch8",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 30.0,+ "face": {+ "atPointMm": [+ 25.0,+ 20.0,+ 30.0+ ],+ "heightMm": 20.0,+ "normal": [+ -0.0,+ 1.0,+ -0.0+ ],+ "pickedBy": "geometry",+ "plane": "Top Plane"+ },+ "feature": "Cut-Extrude3",+ "features": [+ "Cut-Extrude3"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane3",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 25.0,+ -30.0+ ],+ "radiusMm": 15.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 15.0,+ "resolvedPlane": {+ "offsetFrom": "Top Plane",+ "offsetMm": 20.0,+ "plane": "Plane3",+ "verified": true+ },+ "sketch": "Sketch9",+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchedOn": "Plane3",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 1.0,+ 0.0+ ],+ "sketchNormal": [+ 0.0,+ 1.0,+ 0.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude3",+ "readBack": {+ "depthMm": 0.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 1+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch9",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 4+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "6061 Alloy"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 2700.0,+ "densityRequested": 2700.0,+ "material": "6061 Alloy",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 5+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.1,+ 0.02,+ 0.06+ ],+ "centerOfMass": [+ 0.05333855767238339,+ 0.009999999999999998,+ 0.03+ ],+ "centerOfMassMm": [+ 53.338558,+ 10.0,+ 30.0+ ],+ "density": 2700.0,+ "densityKgM3": 2700.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 1098,+ "error": "",+ "massG": 285.829649258884,+ "massKg": 0.285829649258884,+ "materialName": "6061 Alloy",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.1,0.02,0.06],\"centerOfMass\":[0.05333855767238339,0.009999999999999998,0.03],\"centerOfMassMm\":[53.338558,10.0,30.0],\"density\":2700.0,\"densityKgM3\":2700.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":285.829649258884,\"massKg\":0.285829649258884,\"materialName\":\"6061 Alloy\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 79s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01887123889803847,\"surfaceAreaMm2\":18871.238898038468,\"timeoutSeconds\":120,\"volumeM3\":0.00010586283305884592,\"volumeMm3\":105862.83305884592}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 79s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01887123889803847,+ "surfaceAreaMm2": 18871.238898038468,+ "timeoutSeconds": 120,+ "volumeM3": 0.00010586283305884592,+ "volumeMm3": 105862.83305884592+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 285.83,+ "measured": 285.829649258884,+ "offPct": 0.00012270969317231364,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 20.6+ },+ {+ "id": "cswa-04-3dengr-q9-l-bracket",+ "title": "3dengr Q9: an L-bracket in AISI 1020, ONE polyline sketch",+ "official": false,+ "source": "https://www.3dengr.com/cswa-practice-questions.html",+ "expected": {+ "massG": 410.8,+ "centerOfMassMm": [+ 26.54,+ 16.54,+ 20.0+ ],+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 10055,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":8.2,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 80s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch8\",\"Boss-Extrude6\",\"Plane3\",\"Sketch9\",\"Cut-Extrude3\"],\"featuresDeleted\":5,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,0.0],\"toMm\":[80.0,0.0]}},{\"line\":{\"fromMm\":[80.0,0.0],\"toMm\":[80.0,10.0]}},{\"line\":{\"fromMm\":[80.0,10.0],\"toMm\":[10.0,10.0]}},{\"line\":{\"fromMm\":[10.0,10.0],\"toMm\":[10.0,60.0]}},{\"line\":{\"fromMm\":[10.0,60.0],\"toMm\":[0.0,60.0]}},{\"line\":{\"fromMm\":[0.0,60.0],\"toMm\":[0.0,0.0]}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.multiProfile\",\"sketch.line\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch10\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":40.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude7\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":40.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch10\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7900.000000000001,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 8.2,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 80s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch8",+ "Boss-Extrude6",+ "Plane3",+ "Sketch9",+ "Cut-Extrude3"+ ],+ "featuresDeleted": 5,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 0.0+ ],+ "toMm": [+ 80.0,+ 0.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 80.0,+ 0.0+ ],+ "toMm": [+ 80.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 80.0,+ 10.0+ ],+ "toMm": [+ 10.0,+ 10.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 10.0,+ 10.0+ ],+ "toMm": [+ 10.0,+ 60.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 10.0,+ 60.0+ ],+ "toMm": [+ 0.0,+ 60.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 0.0,+ 60.0+ ],+ "toMm": [+ 0.0,+ 0.0+ ]+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.multiProfile",+ "sketch.line"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch10",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 40.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude7",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 40.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch10",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7900.000000000001,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ 0.0,+ 0.0,+ 0.0,+ 0.08,+ 0.06,+ 0.04+ ],+ "centerOfMass": [+ 0.02653846153846153,+ 0.016538461538461537,+ 0.019999999999999997+ ],+ "centerOfMassMm": [+ 26.538462,+ 16.538462,+ 20.0+ ],+ "density": 7900.000000000001,+ "densityKgM3": 7900.000000000001,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 1002,+ "error": "",+ "massG": 410.80000000000007,+ "massKg": 0.41080000000000005,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[0.0,0.0,0.0,0.08,0.06,0.04],\"centerOfMass\":[0.02653846153846153,0.016538461538461537,0.019999999999999997],\"centerOfMassMm\":[26.538462,16.538462,20.0],\"density\":7900.000000000001,\"densityKgM3\":7900.000000000001,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":410.80000000000007,\"massKg\":0.41080000000000005,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 90s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.0138,\"surfaceAreaMm2\":13800.0,\"timeoutSeconds\":120,\"volumeM3\":0.000052,\"volumeMm3\":52000.0}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 90s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.0138,+ "surfaceAreaMm2": 13800.0,+ "timeoutSeconds": 120,+ "volumeM3": 5.2e-05,+ "volumeMm3": 52000.0+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 410.8,+ "measured": 410.80000000000007,+ "offPct": 1.3837248992407013e-14,+ "pass": true+ },+ {+ "quantity": "centerOfMassMm",+ "expected": [+ 26.54,+ 16.54,+ 20.0+ ],+ "measured": [+ 26.538462,+ 16.538462,+ 20.0+ ],+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 11.1+ },+ {+ "id": "cswa-05-tool-block-step1",+ "title": "Official Tool Block, Step 1 (Q3): A 81, B 57, C 43",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 939.54,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 16321,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":14.3,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 91s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch10\",\"Boss-Extrude7\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[18.243084987875623,14.783251905279968]}},{\"arc\":{\"ccw\":true,\"centerMm\":[21.5424003635473,33.494599212511915],\"endMm\":[38.0,24.0],\"radiusMm\":19.0,\"startMm\":[18.243084987875623,14.783251905279968]}},{\"line\":{\"fromMm\":[38.0,24.0],\"toMm\":[62.00000000000001,24.0]}},{\"line\":{\"fromMm\":[67.0,19.0],\"toMm\":[67.0,0.0]}},{\"line\":{\"fromMm\":[67.0,0.0],\"toMm\":[38.0,-33.0]}},{\"line\":{\"fromMm\":[38.0,-33.0],\"toMm\":[32.788067396763054,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[54.69696969696975,-13.999999999999972],\"endMm\":[26.012264996781063,-18.264705882352946],\"radiusMm\":29.000000000000053,\"startMm\":[32.788067396763054,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[21.066626255369176,-18.999999999999964],\"endMm\":[21.06662625536923,-14.0],\"radiusMm\":5.000000000000048,\"startMm\":[26.012264996781063,-18.264705882352946]}},{\"line\":{\"fromMm\":[21.06662625536923,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[62.00000000000001,24.0],\"toMm\":[67.0,19.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch11\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":43.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude8\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":43.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch11\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7900.0,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 14.3,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 91s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch10",+ "Boss-Extrude7"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 18.243084987875623,+ 14.783251905279968+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 21.5424003635473,+ 33.494599212511915+ ],+ "endMm": [+ 38.0,+ 24.0+ ],+ "radiusMm": 19.0,+ "startMm": [+ 18.243084987875623,+ 14.783251905279968+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 38.0,+ 24.0+ ],+ "toMm": [+ 62.00000000000001,+ 24.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 19.0+ ],+ "toMm": [+ 67.0,+ 0.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 0.0+ ],+ "toMm": [+ 38.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 38.0,+ -33.0+ ],+ "toMm": [+ 32.788067396763054,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 54.69696969696975,+ -13.999999999999972+ ],+ "endMm": [+ 26.012264996781063,+ -18.264705882352946+ ],+ "radiusMm": 29.000000000000053,+ "startMm": [+ 32.788067396763054,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 21.066626255369176,+ -18.999999999999964+ ],+ "endMm": [+ 21.06662625536923,+ -14.0+ ],+ "radiusMm": 5.000000000000048,+ "startMm": [+ 26.012264996781063,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 21.06662625536923,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 62.00000000000001,+ 24.0+ ],+ "toMm": [+ 67.0,+ 19.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch11",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 43.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude8",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 43.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch11",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7900.0,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.067,+ 0.024,+ 0.043+ ],+ "centerOfMass": [+ 0.03062236692252704,+ 0.000307646864646839,+ 0.0215+ ],+ "centerOfMassMm": [+ 30.622367,+ 0.307647,+ 21.5+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 1630,+ "error": "",+ "massG": 939.5395682014018,+ "massKg": 0.9395395682014018,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.067,0.024,0.043],\"centerOfMass\":[0.03062236692252704,0.000307646864646839,0.0215],\"centerOfMassMm\":[30.622367,0.307647,21.5],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":939.5395682014018,\"massKg\":0.9395395682014018,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 107s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01763006429786853,\"surfaceAreaMm2\":17630.06429786853,\"timeoutSeconds\":120,\"volumeM3\":0.00011892905926600024,\"volumeMm3\":118929.05926600024}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 107s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01763006429786853,+ "surfaceAreaMm2": 17630.06429786853,+ "timeoutSeconds": 120,+ "volumeM3": 0.00011892905926600024,+ "volumeMm3": 118929.05926600024+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 939.54,+ "measured": 939.5395682014018,+ "offPct": 4.595851141290499e-05,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 18.0+ },+ {+ "id": "cswa-06-tool-block-step2",+ "title": "Official Tool Block, Step 2 (Q4): A 84, B 59, C 45, all other dimensions the same",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 1032.32,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 13940,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":11.4,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 4 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 109s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":4,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch11\",\"Boss-Extrude8\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[20.10404235201319,14.455114912034407]}},{\"arc\":{\"ccw\":true,\"centerMm\":[23.40335772768487,33.166462219266364],\"endMm\":[41.0,26.0],\"radiusMm\":19.0,\"startMm\":[20.10404235201319,14.455114912034407]}},{\"line\":{\"fromMm\":[41.0,26.0],\"toMm\":[65.0,26.0]}},{\"line\":{\"fromMm\":[70.0,21.0],\"toMm\":[70.0,2.0]}},{\"line\":{\"fromMm\":[70.0,2.0],\"toMm\":[41.0,-33.0]}},{\"line\":{\"fromMm\":[41.0,-33.0],\"toMm\":[34.8339548426505,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[56.74285714285731,-14.000000000000036],\"endMm\":[28.0581524426685,-18.264705882352946],\"radiusMm\":29.000000000000107,\"startMm\":[34.8339548426505,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[23.112513701256617,-18.999999999999982],\"endMm\":[23.112513701256667,-14.0],\"radiusMm\":5.0000000000000515,\"startMm\":[28.0581524426685,-18.264705882352946]}},{\"line\":{\"fromMm\":[23.112513701256667,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[65.0,26.0],\"toMm\":[70.0,21.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch12\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":45.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude9\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":45.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch12\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 11.4,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 4 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 109s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 4,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch11",+ "Boss-Extrude8"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 20.10404235201319,+ 14.455114912034407+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 23.40335772768487,+ 33.166462219266364+ ],+ "endMm": [+ 41.0,+ 26.0+ ],+ "radiusMm": 19.0,+ "startMm": [+ 20.10404235201319,+ 14.455114912034407+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 41.0,+ 26.0+ ],+ "toMm": [+ 65.0,+ 26.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 70.0,+ 21.0+ ],+ "toMm": [+ 70.0,+ 2.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 70.0,+ 2.0+ ],+ "toMm": [+ 41.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 41.0,+ -33.0+ ],+ "toMm": [+ 34.8339548426505,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 56.74285714285731,+ -14.000000000000036+ ],+ "endMm": [+ 28.0581524426685,+ -18.264705882352946+ ],+ "radiusMm": 29.000000000000107,+ "startMm": [+ 34.8339548426505,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 23.112513701256617,+ -18.999999999999982+ ],+ "endMm": [+ 23.112513701256667,+ -14.0+ ],+ "radiusMm": 5.0000000000000515,+ "startMm": [+ 28.0581524426685,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 23.112513701256667,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 65.0,+ 26.0+ ],+ "toMm": [+ 70.0,+ 21.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch12",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 45.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude9",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 45.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch12",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.07,+ 0.026,+ 0.045+ ],+ "centerOfMass": [+ 0.03255336787850931,+ 0.0007907183444125464,+ 0.0225+ ],+ "centerOfMassMm": [+ 32.553368,+ 0.790718,+ 22.5+ ],+ "density": 7899.999999999999,+ "densityKgM3": 7899.999999999999,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 1426,+ "error": "",+ "massG": 1032.3206766712835,+ "massKg": 1.0323206766712836,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.07,0.026,0.045],\"centerOfMass\":[0.03255336787850931,0.0007907183444125464,0.0225],\"centerOfMassMm\":[32.553368,0.790718,22.5],\"density\":7899.999999999999,\"densityKgM3\":7899.999999999999,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":1032.3206766712835,\"massKg\":1.0323206766712836,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 123s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.0188741376700506,\"surfaceAreaMm2\":18874.137670050597,\"timeoutSeconds\":120,\"volumeM3\":0.00013067350337611186,\"volumeMm3\":130673.50337611184}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 123s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.0188741376700506,+ "surfaceAreaMm2": 18874.137670050597,+ "timeoutSeconds": 120,+ "volumeM3": 0.00013067350337611186,+ "volumeMm3": 130673.50337611184+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 1032.32,+ "measured": 1032.3206766712835,+ "offPct": 6.55485976828616e-05,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 15.4+ },+ {+ "id": "cswa-07-tool-block-step3",+ "title": "Official Tool Block, Step 3 (Q5): A 86, B 58, C 44, then remove material",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 628.18,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 33621,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":31.4,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 11 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 124s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":11,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch12\",\"Boss-Extrude9\"],\"featuresDeleted\":2,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[22.3613808357771,14.057085232755291]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.66069621144878,32.768432539987224],\"endMm\":[43.0,25.0],\"radiusMm\":18.99999999999998,\"startMm\":[22.3613808357771,14.057085232755291]}},{\"line\":{\"fromMm\":[43.0,25.0],\"toMm\":[67.0,25.0]}},{\"line\":{\"fromMm\":[72.0,20.0],\"toMm\":[72.0,1.0]}},{\"line\":{\"fromMm\":[72.0,1.0],\"toMm\":[43.0,-33.0]}},{\"line\":{\"fromMm\":[43.0,-33.0],\"toMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[59.20588235294099,-13.99999999999998],\"endMm\":[30.521177652752534,-18.264705882352946],\"radiusMm\":28.999999999999883,\"startMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.575538911340765,-18.99999999999997],\"endMm\":[25.5755389113407,-14.0],\"radiusMm\":4.9999999999999325,\"startMm\":[30.521177652752534,-18.264705882352946]}},{\"line\":{\"fromMm\":[25.5755389113407,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[67.0,25.0],\"toMm\":[72.0,20.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch13\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":44.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude10\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":44.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch13\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane4\",\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":{\"face\":{\"atPointMm\":[-10.0,0.0,0.0]}},\"offsetMm\":-12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.faceOffset\",\"sketch.circle\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,-1.0],\"faceOffsetMm\":-12.0,\"fromFace\":true,\"offsetFrom\":\"Front Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"plane\":\"Plane4\",\"verified\":true},\"sketch\":\"Sketch14\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane4\",\"transformInverted\":false},\"step\":5},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":24.0,\"dir\":{\"flippedToFollowTheReference\":true,\"reference\":[-0.0,-0.0,-1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude4\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"readBack\":{\"depthMm\":24.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch14\",\"throughAll\":false,\"upToFace\":null},\"step\":6},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[85.99999999999999,-13.999999999999998]]}}],\"heightMm\":26.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch15\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":106.0},\"step\":7},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude5\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":19.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch15\",\"throughAll\":false,\"upToFace\":null},\"step\":8},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[20.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch16\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":40.0},\"step\":9},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude6\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":19.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch16\",\"throughAll\":false,\"upToFace\":null},\"step\":10},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":11.0,\"face\":{\"atPointMm\":[58.0,11.0,44.0],\"heightMm\":44.0,\"normal\":[0.0,0.0,1.0],\"pickedBy\":\"geometry\",\"plane\":\"Front Plane\"},\"feature\":\"Cut-Extrude7\",\"features\":[\"Cut-Extrude7\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane5\",\"entities\":[{\"circle\":{\"centerMm\":[58.0,11.0],\"radiusMm\":5.5}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":5.5,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"plane\":\"Plane5\",\"verified\":true},\"sketch\":\"Sketch17\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane5\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude7\",\"readBack\":{\"depthMm\":0.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":1},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch17\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":11}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 31.4,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 11 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 124s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 11,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch12",+ "Boss-Extrude9"+ ],+ "featuresDeleted": 2,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.66069621144878,+ 32.768432539987224+ ],+ "endMm": [+ 43.0,+ 25.0+ ],+ "radiusMm": 18.99999999999998,+ "startMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ 25.0+ ],+ "toMm": [+ 67.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 20.0+ ],+ "toMm": [+ 72.0,+ 1.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 1.0+ ],+ "toMm": [+ 43.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ -33.0+ ],+ "toMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 59.20588235294099,+ -13.99999999999998+ ],+ "endMm": [+ 30.521177652752534,+ -18.264705882352946+ ],+ "radiusMm": 28.999999999999883,+ "startMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.575538911340765,+ -18.99999999999997+ ],+ "endMm": [+ 25.5755389113407,+ -14.0+ ],+ "radiusMm": 4.9999999999999325,+ "startMm": [+ 30.521177652752534,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 25.5755389113407,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 25.0+ ],+ "toMm": [+ 72.0,+ 20.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch13",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 44.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude10",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 44.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch13",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7899.999999999999,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane4",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 0.0+ ]+ }+ },+ "offsetMm": -12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.faceOffset",+ "sketch.circle"+ ]+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ -1.0+ ],+ "faceOffsetMm": -12.0,+ "fromFace": true,+ "offsetFrom": "Front Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "plane": "Plane4",+ "verified": true+ },+ "sketch": "Sketch14",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane4",+ "transformInverted": false+ },+ "step": 5+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 24.0,+ "dir": {+ "flippedToFollowTheReference": true,+ "reference": [+ -0.0,+ -0.0,+ -1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude4",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "readBack": {+ "depthMm": 24.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch14",+ "throughAll": false,+ "upToFace": null+ },+ "step": 6+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 85.99999999999999,+ -13.999999999999998+ ]+ ]+ }+ }+ ],+ "heightMm": 26.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch15",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 106.0+ },+ "step": 7+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude5",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "readBack": {+ "depthMm": 19.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch15",+ "throughAll": false,+ "upToFace": null+ },+ "step": 8+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 20.0,+ 40.0+ ]+ ]+ }+ }+ ],+ "heightMm": 80.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch16",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 40.0+ },+ "step": 9+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude6",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "readBack": {+ "depthMm": 19.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch16",+ "throughAll": false,+ "upToFace": null+ },+ "step": 10+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 11.0,+ "face": {+ "atPointMm": [+ 58.0,+ 11.0,+ 44.0+ ],+ "heightMm": 44.0,+ "normal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "pickedBy": "geometry",+ "plane": "Front Plane"+ },+ "feature": "Cut-Extrude7",+ "features": [+ "Cut-Extrude7"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane5",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 58.0,+ 11.0+ ],+ "radiusMm": 5.5+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 5.5,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "plane": "Plane5",+ "verified": true+ },+ "sketch": "Sketch17",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane5",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude7",+ "readBack": {+ "depthMm": 0.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 1+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch17",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 11+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.07200000000000001,+ 0.025,+ 0.044+ ],+ "centerOfMass": [+ 0.0317427963969883,+ -0.0008683174573996883,+ 0.017834837095750275+ ],+ "centerOfMassMm": [+ 31.742796,+ -0.868317,+ 17.834837+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 1190,+ "error": "",+ "massG": 628.1833833399141,+ "massKg": 0.6281833833399142,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.07200000000000001,0.025,0.044],\"centerOfMass\":[0.0317427963969883,-0.0008683174573996883,0.017834837095750275],\"centerOfMassMm\":[31.742796,-0.868317,17.834837],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":628.1833833399141,\"massKg\":0.6281833833399142,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 158s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.01771252880409412,\"surfaceAreaMm2\":17712.52880409412,\"timeoutSeconds\":120,\"volumeM3\":0.00007951688396707775,\"volumeMm3\":79516.88396707775}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 158s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.01771252880409412,+ "surfaceAreaMm2": 17712.52880409412,+ "timeoutSeconds": 120,+ "volumeM3": 7.951688396707775e-05,+ "volumeMm3": 79516.88396707775+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 628.18,+ "measured": 628.1833833399141,+ "offPct": 0.0005385940198978062,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 34.8+ },+ {+ "id": "cswa-08-tool-block-step4",+ "title": "Official Tool Block, Step 4 (Q6): a pocket 1 mm inside the front face's outline (Offset Entities, sketch regions)",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 432.58,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 48330,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":46.7,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 15 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 159s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":15,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch13\",\"Boss-Extrude10\",\"Plane4\",\"Sketch14\",\"Cut-Extrude4\",\"Sketch15\",\"Cut-Extrude5\",\"Sketch16\",\"Cut-Extrude6\",\"Plane5\",\"Sketch17\",\"Cut-Extrude7\"],\"featuresDeleted\":12,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[22.3613808357771,14.057085232755291]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.66069621144878,32.768432539987224],\"endMm\":[43.0,25.0],\"radiusMm\":18.99999999999998,\"startMm\":[22.3613808357771,14.057085232755291]}},{\"line\":{\"fromMm\":[43.0,25.0],\"toMm\":[67.0,25.0]}},{\"line\":{\"fromMm\":[72.0,20.0],\"toMm\":[72.0,1.0]}},{\"line\":{\"fromMm\":[72.0,1.0],\"toMm\":[43.0,-33.0]}},{\"line\":{\"fromMm\":[43.0,-33.0],\"toMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[59.20588235294099,-13.99999999999998],\"endMm\":[30.521177652752534,-18.264705882352946],\"radiusMm\":28.999999999999883,\"startMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.575538911340765,-18.99999999999997],\"endMm\":[25.5755389113407,-14.0],\"radiusMm\":4.9999999999999325,\"startMm\":[30.521177652752534,-18.264705882352946]}},{\"line\":{\"fromMm\":[25.5755389113407,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[67.0,25.0],\"toMm\":[72.0,20.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch18\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":44.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude11\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":44.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch18\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7900.000000000001,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane6\",\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":{\"face\":{\"atPointMm\":[-10.0,0.0,0.0]}},\"offsetMm\":-12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.faceOffset\",\"sketch.circle\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,-1.0],\"faceOffsetMm\":-12.0,\"fromFace\":true,\"offsetFrom\":\"Front Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"plane\":\"Plane6\",\"verified\":true},\"sketch\":\"Sketch19\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane6\",\"transformInverted\":false},\"step\":5},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":24.0,\"dir\":{\"flippedToFollowTheReference\":true,\"reference\":[-0.0,-0.0,-1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude8\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"readBack\":{\"depthMm\":24.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch19\",\"throughAll\":false,\"upToFace\":null},\"step\":6},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[85.99999999999999,-13.999999999999998]]}}],\"heightMm\":26.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch20\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":106.0},\"step\":7},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude9\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":19.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch20\",\"throughAll\":false,\"upToFace\":null},\"step\":8},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[20.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch21\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":40.0},\"step\":9},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude10\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":19.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch21\",\"throughAll\":false,\"upToFace\":null},\"step\":10},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":11.0,\"face\":{\"atPointMm\":[58.0,11.0,44.0],\"heightMm\":44.0,\"normal\":[0.0,0.0,1.0],\"pickedBy\":\"geometry\",\"plane\":\"Front Plane\"},\"feature\":\"Cut-Extrude11\",\"features\":[\"Cut-Extrude11\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane7\",\"entities\":[{\"circle\":{\"centerMm\":[58.0,11.0],\"radiusMm\":5.5}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":5.5,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"plane\":\"Plane7\",\"verified\":true},\"sketch\":\"Sketch22\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane7\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude11\",\"readBack\":{\"depthMm\":0.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":1},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch22\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":11},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":42.0}}],\"mapped\":true,\"offsets\":[{\"offsetEntities\":{\"chain\":true,\"fromFace\":{\"atPointMm\":[70.0,10.0,44.0]},\"loops\":\"outer\",\"offsetMm\":-1.0,\"side\":\"inward\"},\"route\":\"IModelDoc2::SketchOffsetEntities2\",\"segments\":8,\"selected\":\"the face's outer loop (8 edges)\",\"side\":\"inward\",\"sideVerified\":true,\"tries\":[{\"farthestFromTheFaceMm\":0.0,\"landed\":\"inward\",\"offsetMm\":-1.0,\"segments\":8}],\"why\":null}],\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.4-rc1\",\"by\":\"adom\",\"date\":\"2026-10-16\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.offsetEntities.outer\",\"select.multiSelectTyped\"]},\"radiusMm\":42.0,\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch23\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":12},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":12.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":5,\"feature\":\"Cut-Extrude12\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.4-rc1\",\"by\":\"adom\",\"date\":\"2026-10-16\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.offsetFromSurface\",\"cut.regions\"]},\"readBack\":{\"depthMm\":12.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":5},\"regions\":{\"selected\":[{\"atMm\":[25.0,0.0],\"modelMm\":[25.0,0.0,44.0]}],\"via\":\"SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on\"},\"reverse\":false,\"sketch\":\"Sketch23\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":13},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"offsets\":[{\"offsetEntities\":{\"chain\":true,\"fromFace\":{\"atPointMm\":[70.0,10.0,44.0]},\"loops\":\"outer\",\"offsetMm\":-1.0,\"side\":\"inward\"},\"route\":\"IModelDoc2::SketchOffsetEntities2\",\"segments\":8,\"selected\":\"the face's outer loop (8 edges)\",\"side\":\"inward\",\"sideVerified\":true,\"tries\":[{\"farthestFromTheFaceMm\":3.4694469519536138e-15,\"landed\":\"inward\",\"offsetMm\":-1.0,\"segments\":8}],\"why\":null}],\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.4-rc1\",\"by\":\"adom\",\"date\":\"2026-10-16\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.offsetEntities.outer\",\"select.multiSelectTyped\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch24\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":14},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":1.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":5,\"feature\":\"Cut-Extrude13\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.4-rc1\",\"by\":\"adom\",\"date\":\"2026-10-16\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.offsetFromSurface\",\"cut.regions\"]},\"readBack\":{\"depthMm\":1.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":5},\"regions\":{\"selected\":[{\"atMm\":[65.0,15.0],\"modelMm\":[65.0,15.0,44.0]}],\"via\":\"SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on\"},\"reverse\":false,\"sketch\":\"Sketch24\",\"throughAll\":false,\"upToFace\":{\"mark\":1,\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false}},\"step\":15}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 46.7,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 15 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 159s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 15,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch13",+ "Boss-Extrude10",+ "Plane4",+ "Sketch14",+ "Cut-Extrude4",+ "Sketch15",+ "Cut-Extrude5",+ "Sketch16",+ "Cut-Extrude6",+ "Plane5",+ "Sketch17",+ "Cut-Extrude7"+ ],+ "featuresDeleted": 12,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.66069621144878,+ 32.768432539987224+ ],+ "endMm": [+ 43.0,+ 25.0+ ],+ "radiusMm": 18.99999999999998,+ "startMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ 25.0+ ],+ "toMm": [+ 67.0,+ 25.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 20.0+ ],+ "toMm": [+ 72.0,+ 1.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 72.0,+ 1.0+ ],+ "toMm": [+ 43.0,+ -33.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 43.0,+ -33.0+ ],+ "toMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": false,+ "centerMm": [+ 59.20588235294099,+ -13.99999999999998+ ],+ "endMm": [+ 30.521177652752534,+ -18.264705882352946+ ],+ "radiusMm": 28.999999999999883,+ "startMm": [+ 37.296980052734526,+ -33.0+ ]+ }+ },+ {+ "arc": {+ "ccw": true,+ "centerMm": [+ 25.575538911340765,+ -18.99999999999997+ ],+ "endMm": [+ 25.5755389113407,+ -14.0+ ],+ "radiusMm": 4.9999999999999325,+ "startMm": [+ 30.521177652752534,+ -18.264705882352946+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 25.5755389113407,+ -14.0+ ],+ "toMm": [+ -7.0,+ -14.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ -7.0+ ],+ "toMm": [+ -14.0,+ 11.000000000000002+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ 18.0+ ],+ "toMm": [+ 0.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -14.0,+ 11.000000000000002+ ],+ "toMm": [+ -7.0,+ 18.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ -7.0,+ -14.0+ ],+ "toMm": [+ -14.0,+ -7.0+ ]+ }+ },+ {+ "line": {+ "fromMm": [+ 67.0,+ 25.0+ ],+ "toMm": [+ 72.0,+ 20.0+ ]+ }+ },+ {+ "circle": {+ "centerMm": [+ 0.0,+ 0.0+ ],+ "radiusMm": 7.0+ }+ }+ ],+ "mapped": false,+ "plane": "Front Plane",+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.plane.front",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.line",+ "sketch.arc"+ ]+ },+ "resolvedPlane": null,+ "sketch": "Sketch18",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Front Plane",+ "transformInverted": false+ },+ "step": 2+ },+ {+ "op": "extrude",+ "result": {+ "depth2Mm": null,+ "depthMm": 44.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": null,+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Boss-Extrude11",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "extrude.one"+ ]+ },+ "readBack": {+ "depthMm": 44.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch18",+ "throughAll": false,+ "upToFace": null+ },+ "step": 3+ },+ {+ "op": "set_material",+ "result": {+ "appearanceReapplied": [],+ "current": {+ "database": "SOLIDWORKS Materials",+ "name": "AISI 1020"+ },+ "database": "SOLIDWORKS Materials.sldmat",+ "densityKgM3": 7900.000000000001,+ "densityRequested": 7900.0,+ "material": "AISI 1020",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "set_material",+ "set_material.density"+ ]+ }+ },+ "step": 4+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane6",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 0.0+ ]+ }+ },+ "offsetMm": -12.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.faceOffset",+ "sketch.circle"+ ]+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ -0.0,+ -0.0,+ -1.0+ ],+ "faceOffsetMm": -12.0,+ "fromFace": true,+ "offsetFrom": "Front Plane",+ "offsetMm": 12.0,+ "pickedBy": "geometry",+ "plane": "Plane6",+ "verified": true+ },+ "sketch": "Sketch19",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane6",+ "transformInverted": false+ },+ "step": 5+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 24.0,+ "dir": {+ "flippedToFollowTheReference": true,+ "reference": [+ -0.0,+ -0.0,+ -1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": true+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude8",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one.reversed"+ ]+ },+ "readBack": {+ "depthMm": 24.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch19",+ "throughAll": false,+ "upToFace": null+ },+ "step": 6+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 85.99999999999999,+ -13.999999999999998+ ]+ ]+ }+ }+ ],+ "heightMm": 26.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch20",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 106.0+ },+ "step": 7+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude9",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "readBack": {+ "depthMm": 19.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch20",+ "throughAll": false,+ "upToFace": null+ },+ "step": 8+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "rect": {+ "cornersMm": [+ [+ -20.0,+ -40.0+ ],+ [+ 20.0,+ 40.0+ ]+ ]+ }+ }+ ],+ "heightMm": 80.0,+ "mapped": true,+ "plane": {+ "face": {+ "atPointMm": [+ -10.0,+ 0.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.rect",+ "select.multiSelectTyped"+ ]+ },+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch21",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false,+ "widthMm": 40.0+ },+ "step": 9+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 19.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 0,+ "feature": "Cut-Extrude10",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.one"+ ]+ },+ "readBack": {+ "depthMm": 19.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 0+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch21",+ "throughAll": false,+ "upToFace": null+ },+ "step": 10+ },+ {+ "op": "hole",+ "result": {+ "depthMm": null,+ "diameterMm": 11.0,+ "face": {+ "atPointMm": [+ 58.0,+ 11.0,+ 44.0+ ],+ "heightMm": 44.0,+ "normal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "pickedBy": "geometry",+ "plane": "Front Plane"+ },+ "feature": "Cut-Extrude11",+ "features": [+ "Cut-Extrude11"+ ],+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "hole.simple"+ ]+ },+ "steps": [+ {+ "op": "sketch",+ "result": {+ "createdPlane": "Plane7",+ "entities": [+ {+ "circle": {+ "centerMm": [+ 58.0,+ 11.0+ ],+ "radiusMm": 5.5+ }+ }+ ],+ "mapped": true,+ "plane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "radiusMm": 5.5,+ "resolvedPlane": {+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "plane": "Plane7",+ "verified": true+ },+ "sketch": "Sketch22",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "Plane7",+ "transformInverted": false+ }+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 0.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 1,+ "feature": "Cut-Extrude11",+ "readBack": {+ "depthMm": 0.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 1+ },+ "regions": null,+ "reverse": false,+ "sketch": "Sketch22",+ "throughAll": true,+ "upToFace": null+ }+ }+ ],+ "throughAll": true+ },+ "step": 11+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 42.0+ }+ }+ ],+ "mapped": true,+ "offsets": [+ {+ "offsetEntities": {+ "chain": true,+ "fromFace": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ },+ "loops": "outer",+ "offsetMm": -1.0,+ "side": "inward"+ },+ "route": "IModelDoc2::SketchOffsetEntities2",+ "segments": 8,+ "selected": "the face's outer loop (8 edges)",+ "side": "inward",+ "sideVerified": true,+ "tries": [+ {+ "farthestFromTheFaceMm": 0.0,+ "landed": "inward",+ "offsetMm": -1.0,+ "segments": 8+ }+ ],+ "why": null+ }+ ],+ "plane": {+ "face": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.4-rc1",+ "by": "adom",+ "date": "2026-10-16",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.offsetEntities.outer",+ "select.multiSelectTyped"+ ]+ },+ "radiusMm": 42.0,+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch23",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 12+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 12.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 5,+ "feature": "Cut-Extrude12",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.4-rc1",+ "by": "adom",+ "date": "2026-10-16",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.offsetFromSurface",+ "cut.regions"+ ]+ },+ "readBack": {+ "depthMm": 12.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 5+ },+ "regions": {+ "selected": [+ {+ "atMm": [+ 25.0,+ 0.0+ ],+ "modelMm": [+ 25.0,+ 0.0,+ 44.0+ ]+ }+ ],+ "via": "SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on"+ },+ "reverse": false,+ "sketch": "Sketch23",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 13+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "circle": {+ "centerMm": [+ 72.0,+ 28.70187343596344+ ],+ "radiusMm": 41.0+ }+ }+ ],+ "mapped": true,+ "offsets": [+ {+ "offsetEntities": {+ "chain": true,+ "fromFace": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ },+ "loops": "outer",+ "offsetMm": -1.0,+ "side": "inward"+ },+ "route": "IModelDoc2::SketchOffsetEntities2",+ "segments": 8,+ "selected": "the face's outer loop (8 edges)",+ "side": "inward",+ "sideVerified": true,+ "tries": [+ {+ "farthestFromTheFaceMm": 3.4694469519536138e-15,+ "landed": "inward",+ "offsetMm": -1.0,+ "segments": 8+ }+ ],+ "why": null+ }+ ],+ "plane": {+ "face": {+ "atPointMm": [+ 70.0,+ 10.0,+ 44.0+ ]+ }+ },+ "planeFrames": "plane transforms (they match the measured Front/Top axes)",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.3",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.11.4-rc1",+ "by": "adom",+ "date": "2026-10-16",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "sketch.face.front.positive",+ "sketch.circle",+ "sketch.multiProfile",+ "sketch.offsetEntities.outer",+ "select.multiSelectTyped"+ ]+ },+ "radiusMm": 41.0,+ "resolvedPlane": {+ "faceNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "offsetFrom": "Front Plane",+ "offsetMm": 44.0,+ "pickedBy": "geometry",+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ },+ "sketch": "Sketch24",+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchedOn": "the picked face",+ "transformInverted": false+ },+ "step": 14+ },+ {+ "op": "cut",+ "result": {+ "depth2Mm": null,+ "depthMm": 1.0,+ "dir": {+ "flippedToFollowTheReference": false,+ "reference": [+ 0.0,+ 0.0,+ 1.0+ ],+ "sketchNormal": [+ 0.0,+ 0.0,+ 1.0+ ],+ "value": false+ },+ "direction": "one",+ "draftDeg": null,+ "draftInward": null,+ "endCondition": 5,+ "feature": "Cut-Extrude13",+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.11.4-rc1",+ "by": "adom",+ "date": "2026-10-16",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "cut.offsetFromSurface",+ "cut.regions"+ ]+ },+ "readBack": {+ "depthMm": 1.0,+ "draftAngleDeg": 0.0,+ "draftOutward": false,+ "endCondition": 5+ },+ "regions": {+ "selected": [+ {+ "atMm": [+ 65.0,+ 15.0+ ],+ "modelMm": [+ 65.0,+ 15.0,+ 44.0+ ]+ }+ ],+ "via": "SelectByID2 SKETCHREGION, mark 4, EnableContourSelection on"+ },+ "reverse": false,+ "sketch": "Sketch24",+ "throughAll": false,+ "upToFace": {+ "mark": 1,+ "selectedVia": "MultiSelect2(typed array)",+ "viewDependent": false+ }+ },+ "step": 15+ }+ ],+ "success": true,+ "targetDocument": "Part1-1792502024000.SLDPRT",+ "timeoutSeconds": 420+ },+ "massProperties": {+ "_hint": "SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.",+ "_timeoutHint": "ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "boundingBox": [+ -0.014,+ -0.033,+ 0.0,+ 0.11400000000000002,+ 0.07070187343596344,+ 0.044+ ],+ "centerOfMass": [+ 0.028679743560791063,+ -0.0013181364133994554,+ 0.01197320886446479+ ],+ "centerOfMassMm": [+ 28.679744,+ -1.318136,+ 11.973209+ ],+ "density": 7900.0,+ "densityKgM3": 7900.0,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "durationMs": 949,+ "error": "",+ "massG": 434.7151664097057,+ "massKg": 0.4347151664097057,+ "materialName": "AISI 1020",+ "output": "{\"_hint\":\"SI units: kg, m^3, m^2, m. Mass is only as good as the material assignment \u2014 a 0 or default density means no material is set on the model, so report the density alongside the mass.\",\"_timeoutHint\":\"ab waits up to 120s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"boundingBox\":[-0.014,-0.033,0.0,0.11400000000000002,0.07070187343596344,0.044],\"centerOfMass\":[0.028679743560791063,-0.0013181364133994554,0.01197320886446479],\"centerOfMassMm\":[28.679744,-1.318136,11.973209],\"density\":7900.0,\"densityKgM3\":7900.0,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"massG\":434.7151664097057,\"massKg\":0.4347151664097057,\"materialName\":\"AISI 1020\",\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 207s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"statusVerb\":\"swx_status\",\"success\":true,\"surfaceAreaM2\":0.022011814184570586,\"surfaceAreaMm2\":22011.814184570587,\"timeoutSeconds\":120,\"volumeM3\":0.00005502723625439312,\"volumeMm3\":55027.23625439312}",+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 207s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "status": "ok",+ "statusVerb": "swx_status",+ "success": true,+ "surfaceAreaM2": 0.022011814184570586,+ "surfaceAreaMm2": 22011.814184570587,+ "timeoutSeconds": 120,+ "volumeM3": 5.502723625439312e-05,+ "volumeMm3": 55027.23625439312+ },+ "pass": true,+ "checks": [+ {+ "quantity": "massG",+ "expected": 432.58,+ "measured": 434.7151664097057,+ "offPct": 0.49358879506813363,+ "pass": true+ }+ ],+ "fails": [],+ "seconds": 49.3+ },+ {+ "id": "cswa-08b-tool-block-step4-explicit",+ "title": "Official Tool Block, Step 4 (Q6), the explicit inset profile: the same pocket drawn line by line (the Offset Entities fallback)",+ "official": true,+ "source": "https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf (Dassault CSWA Sample Exam, 2017 edition; archive http://web.archive.org/web/20251230104817/https://www.solidworks.com/sites/default/files/2017-12/CSWASampleExam.pdf)",+ "expected": {+ "massG": 432.58,+ "tolerancePct": 1.0+ },+ "material": {+ "name": "AISI 1020",+ "densityKgM3": 7900+ },+ "runScript": {+ "_hint": "Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.",+ "_timeoutHint": "ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.",+ "bridgeCreatedDocument": true,+ "created": null,+ "doc": {+ "config": "Default",+ "dirty": true,+ "path": "C:/Users/drew/AppData/Local/adom-solidworks-bridge/exports/scratch/Part1-1792502024000.SLDPRT",+ "title": "Part1-1792502024000.SLDPRT",+ "type": "part"+ },+ "documentName": "Part1-1792502024000.SLDPRT",+ "durationMs": 36293,+ "error": "",+ "ops": [+ "new_part",+ "new_assembly",+ "clear_part",+ "sketch",+ "sketch_rect",+ "sketch_circle",+ "extrude",+ "cut",+ "set_material",+ "set_appearance",+ "fillet",+ "chamfer",+ "shell",+ "revolve",+ "revolve_cut",+ "mirror",+ "hole",+ "linear_pattern",+ "circular_pattern",+ "set_prop",+ "save_as",+ "rebuild",+ "zoom_fit"+ ],+ "output": "{\"_hint\":\"Each step reports what it built. Verify with swx_inspect_bodies (the geometry) or swx_mass_properties (the mass) rather than trusting the step list. This document was created by the bridge, so swx_close_doc {save:false} discards the whole thing safely; swx_save_as puts it on disk. A step that fails stops the script and says which one, leaving what was already built in place.\",\"_timeoutHint\":\"ab waits up to 420s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `swx_status` until it reports done.\",\"bridgeCreatedDocument\":true,\"created\":null,\"doc\":{\"config\":\"Default\",\"dirty\":true,\"path\":\"C:\\\\Users\\\\drew\\\\AppData\\\\Local\\\\adom-solidworks-bridge\\\\exports\\\\scratch\\\\Part1-1792502024000.SLDPRT\",\"title\":\"Part1-1792502024000.SLDPRT\",\"type\":\"part\"},\"documentName\":\"Part1-1792502024000.SLDPRT\",\"ops\":[\"new_part\",\"new_assembly\",\"clear_part\",\"sketch\",\"sketch_rect\",\"sketch_circle\",\"extrude\",\"cut\",\"set_material\",\"set_appearance\",\"fillet\",\"chamfer\",\"shell\",\"revolve\",\"revolve_cut\",\"mirror\",\"hole\",\"linear_pattern\",\"circular_pattern\",\"set_prop\",\"save_as\",\"rebuild\",\"zoom_fit\"],\"progress\":{\"confidence\":\"estimate\",\"elapsedSec\":34.9,\"estimatedSec\":30,\"etaSec\":0,\"percent\":100,\"phase\":\"run_script\",\"startKind\":\"warm\",\"stepLabel\":\"Running 15 modeling step(s)\"},\"readiness\":{\"basedOn\":[\"alreadyReadyThisSession\"],\"evaluatedAt\":\"gate\",\"readsAllowed\":true,\"ready\":true,\"running\":true,\"state\":\"ready\",\"why\":\"a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 208s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed\"},\"solidworksRevision\":\"34.3.0\",\"statusVerb\":\"swx_status\",\"stepCount\":15,\"steps\":[{\"op\":\"clear_part\",\"result\":{\"bodiesLeft\":0,\"cleared\":\"Part1-1792502024000.SLDPRT\",\"deleted\":[\"Sketch18\",\"Boss-Extrude11\",\"Plane6\",\"Sketch19\",\"Cut-Extrude8\",\"Sketch20\",\"Cut-Extrude9\",\"Sketch21\",\"Cut-Extrude10\",\"Plane7\",\"Sketch22\",\"Cut-Extrude11\",\"Sketch23\",\"Cut-Extrude12\",\"Sketch24\",\"Cut-Extrude13\"],\"featuresDeleted\":16,\"passes\":1,\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.6\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"clear_part\"]},\"route\":\"DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty\"},\"step\":1},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[0.0,18.0],\"toMm\":[22.3613808357771,14.057085232755291]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.66069621144878,32.768432539987224],\"endMm\":[43.0,25.0],\"radiusMm\":18.99999999999998,\"startMm\":[22.3613808357771,14.057085232755291]}},{\"line\":{\"fromMm\":[43.0,25.0],\"toMm\":[67.0,25.0]}},{\"line\":{\"fromMm\":[72.0,20.0],\"toMm\":[72.0,1.0]}},{\"line\":{\"fromMm\":[72.0,1.0],\"toMm\":[43.0,-33.0]}},{\"line\":{\"fromMm\":[43.0,-33.0],\"toMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[59.20588235294099,-13.99999999999998],\"endMm\":[30.521177652752534,-18.264705882352946],\"radiusMm\":28.999999999999883,\"startMm\":[37.296980052734526,-33.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[25.575538911340765,-18.99999999999997],\"endMm\":[25.5755389113407,-14.0],\"radiusMm\":4.9999999999999325,\"startMm\":[30.521177652752534,-18.264705882352946]}},{\"line\":{\"fromMm\":[25.5755389113407,-14.0],\"toMm\":[-7.0,-14.0]}},{\"line\":{\"fromMm\":[-14.0,-7.0],\"toMm\":[-14.0,11.000000000000002]}},{\"line\":{\"fromMm\":[-7.0,18.0],\"toMm\":[0.0,18.0]}},{\"line\":{\"fromMm\":[-14.0,11.000000000000002],\"toMm\":[-7.0,18.0]}},{\"line\":{\"fromMm\":[-7.0,-14.0],\"toMm\":[-14.0,-7.0]}},{\"line\":{\"fromMm\":[67.0,25.0],\"toMm\":[72.0,20.0]}},{\"circle\":{\"centerMm\":[0.0,0.0],\"radiusMm\":7.0}}],\"mapped\":false,\"plane\":\"Front Plane\",\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.plane.front\",\"sketch.circle\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\"]},\"resolvedPlane\":null,\"sketch\":\"Sketch25\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Front Plane\",\"transformInverted\":false},\"step\":2},{\"op\":\"extrude\",\"result\":{\"depth2Mm\":null,\"depthMm\":44.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":null,\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Boss-Extrude12\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"extrude.one\"]},\"readBack\":{\"depthMm\":44.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch25\",\"throughAll\":false,\"upToFace\":null},\"step\":3},{\"op\":\"set_material\",\"result\":{\"appearanceReapplied\":[],\"current\":{\"database\":\"SOLIDWORKS Materials\",\"name\":\"AISI 1020\"},\"database\":\"SOLIDWORKS Materials.sldmat\",\"densityKgM3\":7899.999999999999,\"densityRequested\":7900.0,\"material\":\"AISI 1020\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"set_material\",\"set_material.density\"]}},\"step\":4},{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane8\",\"entities\":[{\"circle\":{\"centerMm\":[72.0,28.70187343596344],\"radiusMm\":41.0}}],\"mapped\":true,\"plane\":{\"offsetFrom\":{\"face\":{\"atPointMm\":[-10.0,0.0,0.0]}},\"offsetMm\":-12.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.faceOffset\",\"sketch.circle\"]},\"radiusMm\":41.0,\"resolvedPlane\":{\"faceNormal\":[-0.0,-0.0,-1.0],\"faceOffsetMm\":-12.0,\"fromFace\":true,\"offsetFrom\":\"Front Plane\",\"offsetMm\":12.0,\"pickedBy\":\"geometry\",\"plane\":\"Plane8\",\"verified\":true},\"sketch\":\"Sketch26\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane8\",\"transformInverted\":false},\"step\":5},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":24.0,\"dir\":{\"flippedToFollowTheReference\":true,\"reference\":[-0.0,-0.0,-1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":true},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude14\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one.reversed\"]},\"readBack\":{\"depthMm\":24.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch26\",\"throughAll\":false,\"upToFace\":null},\"step\":6},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[85.99999999999999,-13.999999999999998]]}}],\"heightMm\":26.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch27\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":106.0},\"step\":7},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude15\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":19.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch27\",\"throughAll\":false,\"upToFace\":null},\"step\":8},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"rect\":{\"cornersMm\":[[-20.0,-40.0],[20.0,40.0]]}}],\"heightMm\":80.0,\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[-10.0,0.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.rect\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch28\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false,\"widthMm\":40.0},\"step\":9},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":19.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude16\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":19.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch28\",\"throughAll\":false,\"upToFace\":null},\"step\":10},{\"op\":\"hole\",\"result\":{\"depthMm\":null,\"diameterMm\":11.0,\"face\":{\"atPointMm\":[58.0,11.0,44.0],\"heightMm\":44.0,\"normal\":[0.0,0.0,1.0],\"pickedBy\":\"geometry\",\"plane\":\"Front Plane\"},\"feature\":\"Cut-Extrude17\",\"features\":[\"Cut-Extrude17\"],\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"hole.simple\"]},\"steps\":[{\"op\":\"sketch\",\"result\":{\"createdPlane\":\"Plane9\",\"entities\":[{\"circle\":{\"centerMm\":[58.0,11.0],\"radiusMm\":5.5}}],\"mapped\":true,\"plane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"radiusMm\":5.5,\"resolvedPlane\":{\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"plane\":\"Plane9\",\"verified\":true},\"sketch\":\"Sketch29\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"Plane9\",\"transformInverted\":false}},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":0.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":1,\"feature\":\"Cut-Extrude17\",\"readBack\":{\"depthMm\":0.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":1},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch29\",\"throughAll\":true,\"upToFace\":null}}],\"throughAll\":true},\"step\":11},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[21.0,-13.0],\"toMm\":[58.744476295793866,-13.0]}},{\"line\":{\"fromMm\":[58.744476295793866,-13.0],\"toMm\":[59.98684774684612,-11.543426574628398]}},{\"arc\":{\"ccw\":false,\"centerMm\":[72.00000000000006,28.70187343596347],\"endMm\":[32.6466829432945,14.028208705078669],\"radiusMm\":42.00000000000004,\"startMm\":[59.98684774684612,-11.543426574628398]}},{\"arc\":{\"ccw\":false,\"centerMm\":[25.660696211448773,32.76843253998723],\"endMm\":[22.18773265811017,13.072277479743086],\"radiusMm\":19.999999999999982,\"startMm\":[32.6466829432945,14.028208705078669]}},{\"line\":{\"fromMm\":[22.18773265811017,13.072277479743086],\"toMm\":[21.0,13.281706793236491]}},{\"line\":{\"fromMm\":[21.0,13.281706793236491],\"toMm\":[21.0,-13.0]}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch30\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":12},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":32.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude18\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":32.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch30\",\"throughAll\":false,\"upToFace\":null},\"step\":13},{\"op\":\"sketch\",\"result\":{\"createdPlane\":null,\"entities\":[{\"line\":{\"fromMm\":[60.69803754833394,-10.709617841849566],\"toMm\":[71.0,1.3685450325175337]}},{\"line\":{\"fromMm\":[71.0,1.3685450325175337],\"toMm\":[71.0,19.585786437626908]}},{\"line\":{\"fromMm\":[71.0,19.585786437626908],\"toMm\":[66.58578643762691,24.0]}},{\"line\":{\"fromMm\":[66.58578643762691,24.0],\"toMm\":[43.63608468546215,24.0]}},{\"arc\":{\"ccw\":false,\"centerMm\":[25.660696211448517,32.7684325399873],\"endMm\":[33.57496135565881,14.400950207692958],\"radiusMm\":20.000000000000256,\"startMm\":[43.63608468546215,24.0]}},{\"arc\":{\"ccw\":true,\"centerMm\":[72.0,28.70187343596347],\"endMm\":[60.69803754833394,-10.709617841849566],\"radiusMm\":41.000000000000014,\"startMm\":[33.57496135565881,14.400950207692958]}}],\"mapped\":true,\"plane\":{\"face\":{\"atPointMm\":[70.0,10.0,44.0]}},\"planeFrames\":\"plane transforms (they match the measured Front/Top axes)\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"sketch.face.front.positive\",\"sketch.multiProfile\",\"sketch.line\",\"sketch.arc\",\"select.multiSelectTyped\"]},\"resolvedPlane\":{\"faceNormal\":[0.0,0.0,1.0],\"offsetFrom\":\"Front Plane\",\"offsetMm\":44.0,\"pickedBy\":\"geometry\",\"selectedVia\":\"MultiSelect2(typed array)\",\"viewDependent\":false},\"sketch\":\"Sketch31\",\"sketchNormal\":[0.0,0.0,1.0],\"sketchedOn\":\"the picked face\",\"transformInverted\":false},\"step\":14},{\"op\":\"cut\",\"result\":{\"depth2Mm\":null,\"depthMm\":7.0,\"dir\":{\"flippedToFollowTheReference\":false,\"reference\":[0.0,0.0,1.0],\"sketchNormal\":[0.0,0.0,1.0],\"value\":false},\"direction\":\"one\",\"draftDeg\":null,\"draftInward\":null,\"endCondition\":0,\"feature\":\"Cut-Extrude19\",\"proven\":{\"live\":true,\"measuredOn\":[{\"bridge\":\"0.10.3\",\"by\":\"adom\",\"date\":\"2026-10-14\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026},{\"bridge\":\"0.10.9\",\"by\":\"community\",\"date\":\"2026-10-15\",\"edition\":\"desktop\",\"major\":29,\"solidworks\":2021},{\"bridge\":\"0.11.2\",\"by\":\"adom\",\"date\":\"2026-10-15\",\"edition\":\"connected\",\"major\":34,\"solidworks\":2026}],\"variants\":[\"cut.one\"]},\"readBack\":{\"depthMm\":7.0,\"draftAngleDeg\":0.0,\"draftOutward\":false,\"endCondition\":0},\"regions\":null,\"reverse\":false,\"sketch\":\"Sketch31\",\"throughAll\":false,\"upToFace\":null},\"step\":15}],\"success\":true,\"targetDocument\":\"Part1-1792502024000.SLDPRT\",\"timeoutSeconds\":420}",+ "progress": {+ "confidence": "estimate",+ "elapsedSec": 34.9,+ "estimatedSec": 30,+ "etaSec": 0,+ "percent": 100,+ "phase": "run_script",+ "startKind": "warm",+ "stepLabel": "Running 15 modeling step(s)"+ },+ "readiness": {+ "basedOn": [+ "alreadyReadyThisSession"+ ],+ "evaluatedAt": "gate",+ "readsAllowed": true,+ "ready": true,+ "running": true,+ "state": "ready",+ "why": "a <3DXLOAD_TIME> marker, then LOAD_ADDIN line(s) not naming the platform add-in (swk3dcompassaddin.dll), then no startup activity for 208s (>= 60s): an add-in loaded on demand after the start completed \u2014 ready only if COM also says the start completed"+ },+ "schemaVersion": 1,+ "solidworksRevision": "34.3.0",+ "status": "ok",+ "statusVerb": "swx_status",+ "stepCount": 15,+ "steps": [+ {+ "op": "clear_part",+ "result": {+ "bodiesLeft": 0,+ "cleared": "Part1-1792502024000.SLDPRT",+ "deleted": [+ "Sketch18",+ "Boss-Extrude11",+ "Plane6",+ "Sketch19",+ "Cut-Extrude8",+ "Sketch20",+ "Cut-Extrude9",+ "Sketch21",+ "Cut-Extrude10",+ "Plane7",+ "Sketch22",+ "Cut-Extrude11",+ "Sketch23",+ "Cut-Extrude12",+ "Sketch24",+ "Cut-Extrude13"+ ],+ "featuresDeleted": 16,+ "passes": 1,+ "proven": {+ "live": true,+ "measuredOn": [+ {+ "bridge": "0.10.6",+ "by": "adom",+ "date": "2026-10-14",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ },+ {+ "bridge": "0.10.9",+ "by": "community",+ "date": "2026-10-15",+ "edition": "desktop",+ "major": 29,+ "solidworks": 2021+ },+ {+ "bridge": "0.11.2",+ "by": "adom",+ "date": "2026-10-15",+ "edition": "connected",+ "major": 34,+ "solidworks": 2026+ }+ ],+ "variants": [+ "clear_part"+ ]+ },+ "route": "DeleteSelection2(swDelete_Children | swDelete_Absorbed), repeated until the tree is empty"+ },+ "step": 1+ },+ {+ "op": "sketch",+ "result": {+ "createdPlane": null,+ "entities": [+ {+ "line": {+ "fromMm": [+ 0.0,+ 18.0+ ],+ "toMm": [+ 22.3613808357771,+ 14.057085232755291+ ]+ }+ },+ {