forked from 1b-agent/opencadstudio-upstream
fix(dist): respect units settings in DIST measurement output
This commit is contained in:
1 parent
fcbab57627
commit
00e102607c
8 files changed
+172
-30
No files matched your search
@@ -2403,4 +2403,39 @@ mod find_replace_command_tests {
|
||||
let _ = app.dispatch_inquiry(cmd, i);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dist_command_respects_drawing_units_precision() {
|
||||
let mut app = OpenCADStudio::new_for_test();
|
||||
let i = app.active_tab;
|
||||
// Simulate changing linear precision to 0 via UNITS dialog apply
|
||||
app.drawing_units = Some(crate::ui::window::drawing_units::State {
|
||||
linear_format: 2,
|
||||
linear_precision: 0,
|
||||
angular_format: 0,
|
||||
angular_precision: 0,
|
||||
clockwise: false,
|
||||
base_angle: "0".into(),
|
||||
insertion_units: 4,
|
||||
});
|
||||
let _ = app.update(Message::DrawingUnitsApply);
|
||||
|
||||
// Run DIST command
|
||||
let _ = app.dispatch_inquiry("DIST", i);
|
||||
assert!(app.tabs[i].active_cmd.is_some());
|
||||
|
||||
// First point
|
||||
let _ = app.tabs[i].active_cmd.as_mut().unwrap().on_point(glam::DVec3::new(0.0, 0.0, 0.0));
|
||||
// Second point
|
||||
let res = app.tabs[i].active_cmd.as_mut().unwrap().on_point(glam::DVec3::new(10.0, 0.0, 0.0));
|
||||
match res {
|
||||
crate::command::CmdResult::Measurement(msg) => {
|
||||
assert!(msg.contains("Distance = 10"), "Expected 'Distance = 10', got: {msg}");
|
||||
assert!(msg.contains("Delta X = 10"), "Expected 'Delta X = 10', got: {msg}");
|
||||
assert!(msg.contains("Delta Y = 0"), "Expected 'Delta Y = 0', got: {msg}");
|
||||
assert!(msg.contains("Delta Z = 0"), "Expected 'Delta Z = 0', got: {msg}");
|
||||
}
|
||||
_ => panic!("Expected CmdResult::Measurement"),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2505,6 +2505,13 @@ impl OpenCADStudio {
|
||||
if name == "PDMODE" || name == "PDSIZE" {
|
||||
self.tabs[i].scene.invalidate_point_dependencies();
|
||||
}
|
||||
if matches!(name.as_str(), "LUNITS" | "LUPREC" | "AUNITS" | "AUPREC") {
|
||||
crate::entities::common::set_unit_context(
|
||||
crate::entities::common::UnitContext::from_header(
|
||||
&self.tabs[i].scene.document.header,
|
||||
),
|
||||
);
|
||||
}
|
||||
// ORTHOMODE / OSMODE set the header directly; mirror them into
|
||||
// the live Ortho / running OSNAP so the constraint + status
|
||||
// bar follow and the save-time stamp doesn't revert them.
|
||||
|
||||
@@ -283,6 +283,11 @@ impl OpenCADStudio {
|
||||
}
|
||||
|
||||
pub fn update(&mut self, msg: Message) -> Task<Message> {
|
||||
if let Some(tab) = self.tabs.get(self.active_tab) {
|
||||
crate::entities::common::set_unit_context(
|
||||
crate::entities::common::UnitContext::from_header(&tab.scene.document.header),
|
||||
);
|
||||
}
|
||||
self.control_observe_user_message(&msg);
|
||||
let perf_started = crate::perf::enabled().then(Instant::now);
|
||||
let perf_label = perf_message_label(&msg);
|
||||
@@ -4596,6 +4601,9 @@ impl OpenCADStudio {
|
||||
self.tabs[i].dirty = true;
|
||||
self.tabs[i].scene.bump_geometry();
|
||||
self.refresh_properties();
|
||||
crate::entities::common::set_unit_context(
|
||||
crate::entities::common::UnitContext::from_header(&self.tabs[i].scene.document.header),
|
||||
);
|
||||
Task::none()
|
||||
}
|
||||
Message::ToleranceDialogField(field) => {
|
||||
@@ -4646,6 +4654,9 @@ impl OpenCADStudio {
|
||||
self.tabs[i].dirty = true;
|
||||
self.tabs[i].scene.bump_geometry();
|
||||
self.refresh_properties();
|
||||
crate::entities::common::set_unit_context(
|
||||
crate::entities::common::UnitContext::from_header(&self.tabs[i].scene.document.header),
|
||||
);
|
||||
let label = crate::modules::draw::units::linear_format_label(code);
|
||||
self.command_line
|
||||
.push_output(crate::tf!("Length format is now {label}.").as_ref());
|
||||
|
||||
Reference in new issue
Block a user