mod backend;
mod bridge;
mod error;
mod shape;
pub use backend::OcctBackend;
pub use error::OcctError;
pub use shape::{read_brep, write_brep, OcctShape};
#[cfg(test)]
mod tests {
use super::*;
use ferrocad_geom::GeometryBackend;
#[test]
fn make_box_has_six_faces() {
let backend = OcctBackend::new();
let cube = backend.make_box(10.0, 10.0, 10.0).unwrap();
assert!(backend.resolve(&cube, "Face1").is_some());
assert!(backend.resolve(&cube, "Face6").is_some());
assert!(backend.resolve(&cube, "Face7").is_none());
}
#[test]
fn fuse_reports_face_lineage() {
let backend = OcctBackend::new();
let a = backend.make_box(10.0, 10.0, 10.0).unwrap();
let b = backend.make_box(10.0, 10.0, 10.0).unwrap();
let out = backend.fuse(&a, &b).unwrap();
assert!(!out.history.is_empty());
assert!(out.history.deleted.is_empty());
}
#[test]
fn cut_removes_material() {
let backend = OcctBackend::new();
let a = backend.make_box(10.0, 10.0, 10.0).unwrap();
let b = backend.make_box(10.0, 10.0, 10.0).unwrap();
let out = backend.cut(&a, &b).unwrap();
assert!(!out.history.is_empty());
}
#[test]
fn place_and_resolve() {
use ferrocad_types::{Placement, Rotation, Vector3};
let backend = OcctBackend::new();
let cube = backend.make_box(1.0, 1.0, 1.0).unwrap();
let moved = backend
.place(
&cube,
&Placement {
base: Vector3::new(5.0, 0.0, 0.0),
rotation: Rotation::identity(),
},
)
.unwrap();
assert!(backend.resolve(&moved, "Face1").is_some());
assert!(!cube.is_same(&moved));
}
#[test]
fn rejects_a_foreign_shape() {
use ferrocad_geom::NullBackend;
let occt = OcctBackend::new();
let foreign = NullBackend.make_box(1.0, 1.0, 1.0).unwrap();
assert_eq!(occt.resolve(&foreign, "Face1"), None);
}
}