// 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 ); }