cad-editor/tests/zoom_extents_xline.rs

71 lines
2.3 KiB
Rust
Raw Normal View History

// Regression for #284: ZOOM Extents must ignore the ±1e6 display segments
// that XLine/Ray tessellate into, instead of fitting the camera to them.
use acadrust::entities::{Line, XLine};
use acadrust::types::Vector3;
use acadrust::EntityType;
use OpenCADStudio::scene::Scene;
fn add_rect(scene: &mut Scene) {
let corners = [
(0.0, 0.0, 10.0, 0.0),
(10.0, 0.0, 10.0, 10.0),
(10.0, 10.0, 0.0, 10.0),
(0.0, 10.0, 0.0, 0.0),
];
for (x1, y1, x2, y2) in corners {
let mut line = Line::new();
line.start = Vector3::new(x1, y1, 0.0);
line.end = Vector3::new(x2, y2, 0.0);
scene.add_entity(EntityType::Line(line));
}
}
#[test]
fn fit_all_ignores_xline_display_extent() {
let mut scene = Scene::new();
add_rect(&mut scene);
// Construction line through the rectangle centre at 45° — its centroid
// sits inside the drawing cluster, and in a fresh document
// `local_extent_max` is still the 1e9 default, so before the fix both
// outlier rejects passed its ±1e6 display endpoints into the bounds.
let xl = XLine::new(Vector3::new(5.0, 5.0, 0.0), Vector3::new(1.0, 1.0, 0.0));
scene.add_entity(EntityType::XLine(xl));
scene.fit_all();
let cam = scene.camera.borrow();
assert!(
cam.distance.is_finite() && cam.distance < 1000.0,
"camera must fit the 10x10 rectangle, not the xline's 1e6 display \
segment (distance = {})",
cam.distance
);
assert!(
(cam.target.x - 5.0).abs() < 5.0 && (cam.target.y - 5.0).abs() < 5.0,
"camera target must stay on the rectangle (target = {:?})",
cam.target
);
}
#[test]
fn fit_all_with_only_xline_fits_base_point() {
let mut scene = Scene::new();
let xl = XLine::new(Vector3::new(100.0, 200.0, 0.0), Vector3::new(0.0, 1.0, 0.0));
scene.add_entity(EntityType::XLine(xl));
scene.fit_all();
let cam = scene.camera.borrow();
assert!(
cam.distance.is_finite() && cam.distance < 1000.0,
"xline-only drawing must fit near the base point, not ±1e6 \
(distance = {})",
cam.distance
);
assert!(
(cam.target.x - 100.0).abs() < 5.0 && (cam.target.y - 200.0).abs() < 5.0,
"camera target must be the xline base point (target = {:?})",
cam.target
);
}