- New "操作器" toggle: select a file in the tree and a 3-axis gizmo
appears at its center -- XYZ arrows (TranslateManipulator) to move
along an axis regardless of view angle, and rotation rings
(RotateManipulator) to rotate any angle about an axis
- Manipulators bind to a proxy ModelVisual3D; the proxy's transform
is mirrored to all target BodyVisuals during drag (GPU-side, temp)
- On release the accumulated transform is baked into B-rep via
TransformRoot (deferred with Dispatcher.BeginInvoke to avoid
reentrancy with the manipulator's own mouse-up handling); the
gizmo re-centers on the new bounds
- Temporary transforms are cleared with Transform3D.Identity, never
null (HelixToolkit GetTransform crashes on null child.Transform)
- Selecting another file retargets the gizmo; removing the target
hides it
- Docs updated (ARCHITECTURE Phase 10, CLAUDE.md, README)
Known limitation: gizmo handles are occluded inside solid parts
(WPF single depth buffer). Next: always-on-top overlay viewport.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drag mode set BodyVisual.Transform = null when clearing the temporary
offset on release. HelixToolkit Viewport3DHelper.GetTransform adds
child.Transform to a GeneralTransform3DGroup without a null check, so
the next FindHits after any drag threw ArgumentException and crashed.
Clear the temporary transform with Transform3D.Identity instead.
Root cause confirmed by decompiling HelixToolkit.Wpf GetTransform.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New Drag mode (hand cursor): left-press a part and drag to move
its whole file along the screen plane; release to commit
- During drag only a temporary TranslateTransform3D is applied
(GPU-side, smooth even on 430k-triangle assemblies); on release
the offset is baked into B-rep + meshes + edges via TranslateRoot,
so measurement accuracy is unaffected
- Merged-mesh hit-testing via _mergedMap (browse rendering active
in drag mode); edges suspended while dragging
- Mouse capture keeps drag alive outside the window; lost capture
commits at current position
- Right-button rotate / wheel zoom / Shift+left pan unchanged
- Rename small test model to test.stp; docs updated
(ARCHITECTURE Phase 9, CLAUDE.md conventions, README)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>