forked from 1b-agent/opencadstudio-upstream
feat(ucs): central WCS↔UCS converter; adopt file UCS, drive readout + icon
Introduce one bridge between WCS (how geometry and the file are stored) and the active UCS (the coordinate system the user works in), so every UCS-aware system routes through it instead of re-deriving axis math. - UcsXform (app/helpers.rs): the converter — to_wcs/to_ucs (points), vec_to_wcs/vec_to_ucs (directions), axes(), is_identity(). Orthonormal axes, so the inverse is the transpose. The old ucs_to_wcs / ucs_rotate_vec free fns now delegate to it (one implementation). - DocumentTab::ucs_xform() builds it from the tab's active_ucs (None = WCS). - DocumentTab::adopt_active_ucs_from_header() loads the document's saved current UCS (header model-space UCS) into active_ucs on open, so the file's coordinate system is live immediately; called from both load paths. - Status-bar coordinate readout reports the cursor in the active UCS. - UCS icon tripod projects the active UCS axes, so it rotates to the UCS instead of always showing world X/Y/Z. First slice of routing the app's coordinate systems through the converter; input/picking, grid, ViewCube, and the remaining readouts follow. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
44d2df9361
commit
4aa1e90dcf
6 files changed
+135
-44
No files matched your search
+8
-3
@@ -154,9 +154,11 @@ impl OpenCADStudio {
|
||||
|
||||
let ucs_icon = if self.show_ucs_icon && !is_paper {
|
||||
let cam = tab.scene.camera.borrow();
|
||||
let (_, ux, uy, uz) = tab.ucs_xform().axes();
|
||||
Some(overlay::UcsIconParams {
|
||||
view_proj: cam.view_proj(vp_bounds),
|
||||
bounds: vp_bounds,
|
||||
axes: (ux, uy, uz),
|
||||
})
|
||||
} else {
|
||||
None
|
||||
@@ -877,16 +879,19 @@ impl OpenCADStudio {
|
||||
|| tab.scene.has_selected_viewport();
|
||||
// The cursor is tracked in local render space; re-add the
|
||||
// model-space world offset so the readout shows true
|
||||
// drawing coordinates (paper space carries no offset).
|
||||
// drawing coordinates (paper space carries no offset), then
|
||||
// report it in the active UCS — the readout follows the
|
||||
// user's coordinate system, not raw WCS (no-op without UCS).
|
||||
let cursor_coord = {
|
||||
let lc = tab.last_cursor_world;
|
||||
if is_model {
|
||||
let wo = tab.scene.world_offset;
|
||||
glam::Vec3::new(
|
||||
let wcs = glam::Vec3::new(
|
||||
lc.x + wo[0] as f32,
|
||||
lc.y + wo[1] as f32,
|
||||
lc.z + wo[2] as f32,
|
||||
)
|
||||
);
|
||||
tab.ucs_xform().to_ucs(wcs)
|
||||
} else {
|
||||
lc
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user