Files
FreeCADWasmDev/docs/current/web-edit-transform-checkpoint-20260916.md

5.0 KiB

Edit and transform business checkpoint

Batch: 7ed63c875d6fa074ba322b8b. Selected: Web:desktop:Std_Edit, Web:desktop:Std_Transform, Web:desktop:Std_TransformManip.

Attributable result

python3 tools/run_business_acceptance.py --module Web --ids Web:desktop:Std_Edit --reuse passed one selected record in 11.432 seconds. Evidence: docs/current/business-evidence/6097a992e376ebeaa624bd90-20260916T153819180454.json. This is a bounded PartBox browser workflow for native Part::Box editing, not proof of all ViewProvider editors or transform commands.

The original batch run is retained at docs/current/business-evidence/4b22f9043f0277e18ad190db-20260916T153106588126.json. Its first actual error was No module named 'FreeCADGui' for Edit; both transform records reported business route not implemented. An intermediate edit run reached all original selection/lifecycle assertions but exposed a new case-helper wait bug: docs/current/business-evidence/6097a992e376ebeaa624bd90-20260916T153743828334.json. The helper now waits for a non-null response with a new request ID. No acceptance statuses were edited.

Implementation and verification

  • freecad-source/src/WebAssembly/FreeCADCoreProbe/WebViewCommands.h: retains the GUI edit path and adds a headless Part::Box editor. Begin/read identify the native object; preview changes native dimensions and recomputes OCCT geometry in one open transaction; finish commits; cancel aborts and recomputes. Invalid dimensions, driven/read-only dimensions, wrong-document selection and unsupported object editors return errors. Session state belongs to the native App runtime and retains its owning document reference.
  • web/src/web-commanddoc-task.tsx: mounted Length/Width/Height inputs, Preview Edit, Finish Editing and Cancel Editing; displays command errors. Existing shell/adapter routing already reaches this task and native owner, so no shared dispatcher changes were needed.
  • web/src/web-commanddoc-contract.ts: adds optional typed edit properties to the application response shape. Acceptance contracts and IFC contract/verifiers were not modified.
  • tools/web-business-cases.mjs: selected Edit case checks mounted begin and preview controls, native object identity, valid OCCT volume, other-document isolation, exact BREP restoration on cancel, one committed undo transaction, exact BREP undo/redo restoration, and rejection of invalid selections/dimensions without geometry/history changes.
  • Focused FreeCADWebPartBoxProbe and FreeCADWebDocumentProbe builds completed; npm --prefix web run sync-kernel synchronized the new outputs; final web/node_modules/.bin/vite build web completed.
  • npm --prefix web run check:geometry-boundary, web/node_modules/.bin/tsc --noEmit -p web/tsconfig.json, and node --check tools/web-business-cases.mjs passed. Static geometry auditing does not certify a single native runtime.
  • Existing application server responded at http://127.0.0.1:5180/workbench.html. No new persistent server was started. All build and acceptance command sessions completed.

Remaining work and next action

  1. Implement Std_Transform and Std_TransformManip with executable native/browser cases. Neither has new passing evidence. Their names are present in native commanddoc membership, but there is no transform-specific handler in WebViewCommands.h, no dedicated mounted transform controls, and no transform case in tools/web-business-cases.mjs.
  2. Current adapter routes both through statefulCommandDoc to part.pythonFamilyBatch, and the fallback rewrites operation names to transform/transform-manip. Inspect and repair that path in web/src/web-desktop-adapter.ts; keep module-specific routing out of the shared dispatcher.
  3. Source decisions retained: CommandDoc.cpp:1714 opens TaskTransform and disallows an already-active task; :1799 resets current editing then enters native ViewProvider Transform mode; :1816 requires exactly one unfrozen GeoFeature; :1915 toggles edit and can finish with no selection. TransformManip needs actual interactive transform behavior and native placement/transaction assertions, not a success envelope or proxy geometry.
  4. Edit remains limited to Part::Box; other headless object types explicitly require their specialized native editor. DocumentProbe was rebuilt because the native header is shared, but this browser case exercised PartBox only. GUI-host behavior, cross-command task conflicts, document closure during preview, responsive screenshots, and broader specialized editors have not been certified by this case.
  5. Reuse the successful Edit evidence whenever inputs are unchanged. Run affected selected cases through tools/run_business_acceptance.py --module Web --ids ... --reuse; do not replay unchanged failures or unrelated IFC work. Preserve all original/supplemental requirements, semantic IFC contract, proof-area requirements, and acceptance machinery.

No deployment, pushes, external messages, full-parity/API gates, coverage-label additions, or manual status changes were performed.