- Offer table: user-facing strings carry the L() marker so xgettext
extracts them; DesignOffer.hpp, DesignSketchTool.cpp and
SketchInlineEditor.cpp are listed in localization/i18n/list.txt.
- Offer: model-mode Constrain sits in the same row as the sketch one;
Interference is wired; Rib shows its R key; a verb that accepts the
selection but is blocked by the document stays greyed with its reason
instead of vanishing from the submenu; one refusal wording per verb.
- Extrude infers Join when the profile touches a solid (new
CadDocument::body_touching_sketch) and on face push/pull; New body in
free space. Revolve/Sweep/Loft/Boolean use the same result words.
- Interference and volume/area reports go to the status line in mm3/mm2
instead of modal dialogs; Delete Body no longer asks (it is undoable).
- New feature names match the card header ("Extrude 3"), translated;
"Coordinate system", "Angle (°)", center/color spelling, translated
face and length readouts, slot hints say width.
- CAD gizmos in Prepare are selectable only with the CAD feature on; the
sketch auto-close setting is stored per design.
- Docs: confirm/cancel rules, enabling the feature and MCP in
design_tab.md; drift-only right-click in interaction-model.md; the
portability note rewritten to describe the integration as it is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QK4VgguuCAk2hZLWgcjJb9
3.6 KiB
Design (CAD) tab — upstream pull request
What this adds
A sketch-first parametric CAD tab inside the slicer. The workflow is direct: sketch → constrain → solid features → commit to plate. The whole feature recipe is persisted inside the 3MF, so reopening restores an editable model rather than a frozen mesh.
- Kernel: OCCT, which upstream already links for STEP import — see cad_dependency_weight.md
- Constraint solver: vendored SolveSpace
libslvssubset - Interaction model: object-driven — point at geometry, the geometry offers the verbs that apply to it; see cad_ux_guidelines.md
- Full user-facing documentation: design_tab.md
Why it belongs in the slicer
Every round trip through an external CAD tool costs a file export, a re-import, and the design intent that both steps discard. A part modified after slicing should return to its feature history, not to a mesh. Keeping the CAD model inside the slicer preserves that loop — the nozzle diameter, the build volume and the material are known at design time.
For the integration case in full: design_tab_upstream_portability.md.
How it is built
The SLIC3R_CAD CMake flag (default ON) gates the entire tab. With it OFF the tab is not
compiled and the deps prefix matches upstream exactly — the dependency diff is one line in
OCCT's CMake: BUILD_MODULE_ModelingAlgorithms=OFF → ON. At run time the tab is off until
Preferences → CAD feature (experimental) is enabled.
Measured cost table: cad_dependency_weight.md.
Diff shape
Against merge-base d6cb667b894f:
306 files changed, 83032 insertions(+), 777 deletions(-)
350 commits, of which 284 are new files and 37 modify upstream files. 99.3 % of the diff is new code. The negotiable surface is the 37 modified files.
Tests
205 TEST_CASE blocks across 6 new test source files. This counts assertions written, not
assertions passed — a run needs a build.
scripts/CAD/run-kernel-tests.sh is the headless verification contract: it builds only
libslic3r_tests (not the GUI app), needs no display, and exit 0 means the CAD suite
passed. It now runs with no exclusions — both cases that used to be quarantined (the
circle-line tangency solver abort and the internal-thread reference) are fixed.
Licensing
The vendored solver in src/libslic3r/slvs/ is GPL-3.0 (see src/libslic3r/slvs/LICENSE),
not LGPL. The combined work is distributable under AGPL-3.0. See the Licensing section of
design_tab_upstream_portability.md for the
AGPLv3/GPLv3 compatibility argument; this point should be confirmed with upstream explicitly.
Not verified
- Card wiring for 9 of the 16 late-wired tools was never click-tested.
- There is no automated GUI test in CI. A green kernel run says nothing about the GUI — synthetic clicks never drift, so the test suite and the viewport are two separate realities.
- The click-test defect rate has not converged: a second pass found no new defects, but four further days of work found five more. The earlier pass is not evidence of stability.
Reviewer's map
See the Where the code lives table in the user
doc for the file-to-role mapping, and docs/ux/tool_atlas.json as
the generated-from source of src/slic3r/GUI/CAD/DesignOffer.hpp.