Files
OneCAD-Draft/tests/presspull_curved_boundary.rs
T

44 lines
1.8 KiB
Rust

use acadrust::{entities::Circle, types::Vector3, EntityType};
use glam::DVec3;
use OpenCADStudio::command::WorkingPlane;
use OpenCADStudio::scene::{model::presspull_model, Scene};
#[test]
fn area_picks_follow_exact_curves_and_keep_holes() {
let mut scene = Scene::new();
for radius in [1000.0, 500.0] {
scene
.document
.add_entity(EntityType::Circle(Circle::from_center_radius(
Vector3::new(0.0, 0.0, 0.0),
radius,
)))
.unwrap();
}
// Halfway between display vertices, these points lie beyond the chords.
let angle = std::f64::consts::PI / 48.0;
for (radius, expected_loops) in [(999.0, 2), (499.0, 1)] {
let point = DVec3::new(radius * angle.cos(), radius * angle.sin(), 0.0);
let target =
presspull_model::resolve_target(&scene, None, point, WorkingPlane::default(), false)
.expect("point inside the exact circular boundary");
let presspull_model::PresspullTargetKind::Profile { entity, .. } = target.kind else {
panic!("expected a bounded profile");
};
let (_, loops, closed) = presspull_model::profile_geometry(&entity).unwrap();
assert!(closed);
assert_eq!(loops.len(), expected_loops);
assert!(loops
.iter()
.flatten()
.all(|curve| !matches!(curve, cadkernel::geom2d::Curve::Line(_))));
let body = presspull_model::extrusion_body(&entity, [0.0, 0.0, 10.0]).unwrap();
assert!(body.validate().is_empty());
}
let outside = DVec3::new(1001.0 * angle.cos(), 1001.0 * angle.sin(), 0.0);
assert!(
presspull_model::resolve_target(&scene, None, outside, WorkingPlane::default(), false,)
.is_err()
);
}