Ports FreeCAD's planegcs 2D geometric constraint solver to Rust as a new crates/ocs_gcs workspace member, and wires it into the document/scene model as a persistent SketchConstraintSet: Coincident, Horizontal/Vertical, Parallel/Perpendicular, Equal, Tangent, Distance, Angle and Radius constraints that re-solve live (including mid-drag, not just on release), render glyphs and a DOF badge, flag conflicts with a one-click resolver pill, and round-trip through save/load via an XRecord blob. Also includes docs/command_reference.md (a statically generated reference of every registered command and its prompt sequence) and docs/named_parameters_design.md + docs/backlog.md, which hand off the next queued feature (a named-parameter/expression table) and consolidate every deliberate scope-down and open gap found along the way, so a fresh session has a complete starting point. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
8.9 KiB
Backlog — deferred items, known gaps, and scope-downs
A consolidated list of things noticed but deliberately not fixed/built, so
they aren't lost between sessions. Pulled from docs/ parametric_system_design.md's own "open questions" log, the ocs_gcs port
plan, and things found while doing unrelated work this session. Not a bug
tracker for the whole app — scoped to what surfaced during the parametric
constraint system project and its surrounding investigation.
Parametric constraint system — deliberate scope-downs (documented, not accidental)
- Stage 9 undo is two presses, not one. Adding a persistent constraint
and the geometry move it triggers are two separate undo/redo entries
(
HistorySnapshot::SketchConstraintspushed adjacent to, not merged into, the geometryDelta). The design doc's recommended §5.1(b) "live XRecord" approach would fix this but depends on stage 4 (save/load), which itself was scoped down (next item) — revisit both together if this is ever worth fixing. - Stage 4 does not resolve on load. Opening a file with saved
constraints restores them but does not immediately re-solve — the DOF
badge and any conflict state only appear after the next edit that touches
an affected scope. Deliberate: resolving on load risked desyncing from
the
DerivedCachesbundleon_file_openedinstalls right after, without budget this session to verify that's safe. - Stage 11's conflict resolver is a one-at-a-time pill, not the full SketchXpert-style panel. Clicking "⚠ n conflicting" removes one flagged constraint and re-solves; there's no named-candidate list or cyclable live preview before committing (design doc §6.4 Phase C). This is the single largest UX gap remaining in the constraint system relative to the original plan.
ocs_gcs solver — not ported
SlopeAtBSplineKnot(tangent continuity across a spline knot) — needs knot-multiplicity reconstruction for a narrower use case thanPointOnBSpline, which is ported. Deferred, not silently dropped.InternalAlignmentPoint2Ellipse/InternalAlignmentPoint2Hyperbola— FreeCAD-Sketcher-internal bookkeeping for creating conic geometry interactively, not for constraining existing geometry. Lower priority.EllipticalArcRangeToEndPoints— dead code upstream (aConstraintTypeenum value with no implementing class anywhere in current planegcs source), not a gap in this port.- Golden-fixture testing against the locally-installed FreeCAD.app
(testing-strategy "Oracle A") was never wired up. Everything in
ocs_gcsis verified only against Oracle B (closed-form + finite-difference). Still a real asset sitting unused if higher-confidence validation is ever wanted. - Performance at scale is untested. The "only touched scopes rebuild" locality argument (design doc §4.2) is architecturally sound but has no profiling behind it on a large, heavily-constrained drawing.
Constraint types not exposed in the app's UI (even though some primitives exist)
ConstraintKind (src/scene/sketch_constraints.rs) currently has:
Coincident, Horizontal, Vertical, Parallel, Perpendicular, Equal, Distance,
Angle, Radius, Tangent. AutoCAD's own Geometric Constraints panel additionally
has Fix, Concentric, Collinear, Symmetric, Smooth — none
of these have a ConstraintKind variant here. Some are buildable from
already-ported ocs_gcs primitives (e.g. Concentric ≈ C2CDistance at zero
distance) without new solver math; Fix would need a different mechanism
entirely (pinning a point's params non-free rather than adding a constraint
row) and doesn't fit the current ConstraintKind model at all.
Newly discovered this session (not previously tracked anywhere)
CCONSTRAINT,TCONSTRAINT, and their four siblings (HCONSTRAINT/VCONSTRAINT/PCONSTRAINT/QCONSTRAINT/ECONSTRAINT) have noinventory::submit!(CommandRegistration)registration. Found while generatingdocs/command_reference.md. All seven work correctly when invoked (ribbon button or exact typed name) but don't appear in the command-line's autocomplete or in the MCP server'scommandslisting, unlike almost every other command in the app. Pre-existing across the whole constraint-command family, not something this session's Tangent/ Coincident additions broke uniquely — just never noticed before. Cheap fix (oneinventory::submit!block) whenever someone wants to spend five minutes on it.- No live link from a sketch to 3D solid features.
SolidHistorySweep/Revolve/etc. (src/scene/model/solid_history.rs) holdsweep_entity: Option<EmbeddedEntity>— a geometry copy snapshotted at creation time, not aHandleback into the sketch. Dragging or re-solving a sketch that was previously extruded/revolved/swept does not update the resulting solid. This is the real "feature-history tree" gap discussed when scoping FreeCAD/AutoCAD parity — a substantially bigger project than the named-parameters work (seedocs/ named_parameters_design.md§3), not something to fold into it by accident. - No named-parameter/expression sheet (AutoCAD's Parameters Manager /
FreeCAD's Spreadsheet equivalent). This is the next feature queued up —
see
docs/named_parameters_design.mdfor the handoff context. - No end-user manual exists anywhere in the repo. Checked
docs/thoroughly — everything there is developer-facing (plugin architecture, this parametric design doc, tessellation notes, native-vs-web diffing, release notes, automation scripts) plus localized top-level README translations. No in-app Help link points anywhere either. Not started; would be a real, separate writing effort if wanted. - No theme install/import/export mechanism. Theming is entirely in-app:
pick one of iced's built-in themes, or hand-tune one "Custom" slot via six
hex-color inputs (
src/ui/window/options.rs,UiThemePaletteinsrc/app/config.rs). No theme file format, no way to author and share a theme, only one custom palette remembered at a time. - No touch/multi-touch input support, relevant to the wasm build running on a tablet (e.g. iPad). Grepped the whole codebase for touch/gesture handling — none exists; all input assumes mouse+keyboard, relying on the browser's synthetic mouse-event emulation for taps. No pinch-zoom, no two-finger pan, and OSNAP/grip-drag precision (already tight even with a mouse — see the Coincident epsilon note below) would be materially worse with a fingertip.
Testing/tooling notes for future live-verification sessions
- Coincident's success path could not be reliably live-verified via
synthetic mouse clicks — its resolver epsilon (
COINCIDENT_EPSILON_SQ = 1.0e-12, ~1e-6 world units, reused from stage 8'sinfer_coincident_refs) is tighter than this session'sleft_click/OSNAP automation could reliably hit, even with Endpoint snap enabled. Concluded to be an environment limitation, not a code defect — automated tests cover the resolver logic directly — but worth knowing before assuming a future automated click-through will succeed where this session's didn't. open_application/request_accessalways resolve to the/Applications-installed app bundle, regardless of which binary was most recently built. To live-test a code change, build a release binary and swap it into a scratch copy of the installed bundle (e.g./tmp/ocs_livetest/OpenCADStudio.app), keeping the original small launcher (CFBundleExecutable = "OpenCADStudio") intact, thencodesign --force --deep -s -to re-sign ad-hoc beforeopen-ing it. This reuses the real bundle identity (io.github.HakanSeven12.OpenCadStudio) so access requests correctly target it. A standalone bundle with a fresh bundle id gets silentlyuser_denied— not a viable shortcut. The debug binary run bare vianohupnever presented a controllable window either — use a release build.target/debugcan balloon fast from repeated live-testing rebuilds — hit 35GB and caused a real "No space left on device" build failure this session.cargo cleanreclaimed 64GB. Worth a proactivecargo clean(or checkingdf) before a long live-testing stretch, not just after it breaks.- Synthetic input reliability, generally: Escape frequently failed to cancel an active command (use Return instead); LINE clicks sometimes produced stray zero-length duplicate entities; selection clicks often missed thin line bodies or landed on a midpoint-edit-box zone (use a crossing-window drag-select instead of precise body clicks).
Legal / process
- LGPL-2.1-or-later review for
ocs_gcsis still open (original plan §6). Non-blocking for continued development, but must happen before any public release containing it — separate-relinkable-module posture vs. broader relicensing, notice/attribution obligations under GPLv3 distribution.