forked from 1b-agent/opencadstudio-upstream
feat(ucs): build axis-aligned shapes in the active UCS
Commands that construct geometry with implicit axis directions ignored the UCS, so a rectangle drawn under a rotated UCS came out world-aligned. Give commands the UCS and build square to it: - CadCommand::set_ucs(Mat4) (UCS→wire affine, default no-op); the host pushes the current UCS via App::push_ucs_to_cmd before each point / preview / text dispatch (DocumentTab::ucs_wire_affine, identity outside model space). New axis-aligned commands just override set_ucs. - RECT (two-corner) and RECT_CEN (center) place their derived corners on the UCS axes (ucs_box_corners / ucs_box_around_center). - ARRAYRECT row/column offsets run along the UCS axes. RECT_ROT, POLYGON, and ELLIPSE already take their orientation from picked points, so they need no change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
d63602161f
commit
0c2a97e17e
5 files changed
+128
-35
No files matched your search
@@ -195,6 +195,28 @@ impl DocumentTab {
|
||||
self.scene.viewcube_ucs = self.ucs_xform().rotation_mat();
|
||||
}
|
||||
|
||||
/// UCS→render(wire)-space affine for commands that build axis-aligned
|
||||
/// geometry. Columns are the UCS axes; translation is the UCS origin in wire
|
||||
/// space. Identity outside model space (no UCS there).
|
||||
pub(super) fn ucs_wire_affine(&self) -> glam::Mat4 {
|
||||
if self.scene.current_layout != "Model" {
|
||||
return glam::Mat4::IDENTITY;
|
||||
}
|
||||
let (o, x, y, z) = self.ucs_xform().axes();
|
||||
let wo = self.scene.world_offset;
|
||||
let origin = glam::Vec3::new(
|
||||
o.x - wo[0] as f32,
|
||||
o.y - wo[1] as f32,
|
||||
o.z - wo[2] as f32,
|
||||
);
|
||||
glam::Mat4::from_cols(
|
||||
x.extend(0.0),
|
||||
y.extend(0.0),
|
||||
z.extend(0.0),
|
||||
origin.extend(1.0),
|
||||
)
|
||||
}
|
||||
|
||||
/// Grid origin (render/wire space) and UCS→world rotation for grid snap and
|
||||
/// the grid overlay. Identity / origin-at-zero outside model space.
|
||||
pub(super) fn ucs_grid_basis(&self) -> (glam::Vec3, glam::Mat4) {
|
||||
|
||||
Reference in new issue
Block a user