4.6 KiB
Part tolerance functional gap progress
Date: 2026-09-17 (Asia/Shanghai)
Requirement: Part:desktop:Part_ToleranceSet
Implemented Workflow
The current-document command now creates and edits the supplied BOPTools.ToleranceFeatures.FeatureToleranceSet proxy. It preserves native Objects, minTolerance, maxTolerance and Refine properties, rather than returning a detached BREP that cannot recompute.
- Executes the original shape-copy and
limitTolerancesequence, including the desktopfix/removeSplitter/fixsequence when Refine is enabled. - Supports multiple sources, replacement of source links, native naming, one-step history, source visibility and shape recomputation after source edits.
- Preserves OCCT sentinel behavior: maximum 0 is unbounded; maximum below minimum also means a lower limit; equal minimum/maximum forces the value; minimum 0 applies an upper cap.
- Rejects missing/nonshape/empty/foreign sources, dependency cycles and malformed settings before committing a feature. Failed changes roll back through the document owner.
- Reports measured vertex, edge and face minimum/maximum tolerances from the actual native shape.
- Mounted controls provide source selection, editing, limits, Refine, measured tolerances, undo/redo, read/cancel, FCStd save/open, OPFS persistence and geometry.
- Read/cancel preserve pending edits. FCStd restores the original Python proxy and source links, which remain functional after reopening.
Files: PartToleranceDocument.h, integration in DocumentProbe.cpp, part-document-facade.ts, part-desktop-adapter.ts, part-tolerance-task.tsx, and workbench-shell.tsx.
First Acceptance
Command: python3 tools/run_business_acceptance.py --module Part --ids Part:desktop:Part_ToleranceSet --reuse
Result: 1 requirement passed, 31 scenarios, 45.196 seconds.
Cases verify lower/upper/interval/fixed and reversed-limit semantics against native OCCT measurements, unchanged source tolerances, analytic volumes, real proxy dependencies, native refinement from split faces to 6 faces, multiple-solid output, source edits, history, cyclic links, error rollback, isolated documents, pending read/cancel, native persistence and mounted browser workflows.
The initial attempt exposed a mismatch between local Python type hints and the actual native getTolerance API. Native code requires type objects such as Part.Vertex, not strings such as "Vertex". Both the production query and reference assertions now use those type objects. The failed attempt remains recorded.
The suite shares one native document kernel and one browser workflow. Installed libraries were reused; only DocumentProbe was rebuilt. TypeScript checking, production Vite build and native-source whitespace checking passed. Previously verified requirements were not rerun.
Visual Inspection
Playwright covered desktop 1440x900 and mobile 390x844 viewports, visible model pixels, camera rotation and task overflow. Screenshots were visually inspected and showed readable measured tolerances and unobstructed geometry.
Boundaries
The implemented command uses abort/rollback on computation errors. The desktop option to retain a failed feature through Continue, and view-provider drag/drop/delete interactions, are not certified by these cases. No claim of every desktop interaction is made. These remaining behaviors must not be replaced by fabricated success results.
Coverage snapshot: 209/1508 requirements declare executable coverage; 1299 remain uncovered. This is case coverage, not a count of currently fresh full-project acceptance. The requirement universe remains unchanged and the overall migration is unfinished.
Unattended Continuation
The existing freecad-web-acceptance.service remained running during implementation and native compilation. It was frozen only for the formal evidence windows (the failed attempt and the final approximately 45-second run), then immediately thawed. The background advanced from Section Cut to Sweep while this work proceeded. No second scheduler was created.
The service runs watch_freecad_web_scheduler.py --interval 15 --timeout 3600 --idle-delay 45 under systemd with Restart=on-failure. The active/unfrozen state was verified. Further work remains authorized without repeated user confirmation; keep missing functionality first and historical validation deferred.