use lib3mf_core::model::{Mesh, MeshRepair, RepairOptions};
#[test]
fn test_vertex_stitching() {
let mut mesh = Mesh::new();
mesh.add_vertex(0.0, 0.0, 0.0); mesh.add_vertex(1.0, 0.0, 0.0); mesh.add_vertex(0.0, 1.0, 0.0); mesh.add_triangle(0, 1, 2);
mesh.add_vertex(1.0, 0.0, 0.00001); mesh.add_vertex(0.0, 1.0, 0.00001); mesh.add_vertex(1.0, 1.0, 0.0); mesh.add_triangle(3, 5, 4);
assert_eq!(mesh.vertices.len(), 6);
let stats = mesh.repair(RepairOptions::default());
assert_eq!(stats.vertices_removed, 2);
assert_eq!(mesh.vertices.len(), 4);
let t2 = mesh.triangles[1];
assert_eq!(t2.v1, 1); assert_eq!(t2.v2, 3); assert_eq!(t2.v3, 2); }
#[test]
fn test_degenerate_removal() {
let mut mesh = Mesh::new();
mesh.add_vertex(0.0, 0.0, 0.0);
mesh.add_vertex(1.0, 0.0, 0.0);
mesh.add_vertex(0.0, 1.0, 0.0);
mesh.add_triangle(0, 1, 2);
mesh.add_triangle(0, 1, 0);
mesh.add_vertex(2.0, 0.0, 0.0); mesh.add_triangle(0, 1, 3);
assert_eq!(mesh.triangles.len(), 3);
let stats = mesh.repair(RepairOptions::default());
assert_eq!(stats.triangles_removed, 2);
assert_eq!(mesh.triangles.len(), 1);
}
#[test]
fn test_orientation_harmonization() {
let mut mesh = Mesh::new();
mesh.add_vertex(0.0, 0.0, 0.0); mesh.add_vertex(1.0, 0.0, 0.0); mesh.add_vertex(0.0, 1.0, 0.0); mesh.add_vertex(1.0, 1.0, 0.0);
mesh.add_triangle(0, 1, 2);
mesh.add_triangle(1, 2, 3);
let stats = mesh.repair(RepairOptions {
stitch_epsilon: 0.0,
remove_degenerate: false,
remove_duplicate_faces: false,
harmonize_orientations: true,
remove_islands: false,
fill_holes: false,
});
assert_eq!(stats.triangles_flipped, 1);
let t2 = mesh.triangles[1];
assert_eq!(t2.v1, 1);
assert!(t2.v2 == 3 || t2.v3 == 3);
}
#[test]
fn test_island_removal() {
let mut mesh = Mesh::new();
mesh.add_vertex(0.0, 0.0, 0.0);
mesh.add_vertex(1.0, 0.0, 0.0);
mesh.add_vertex(0.0, 1.0, 0.0);
mesh.add_vertex(1.0, 1.0, 0.0);
mesh.add_triangle(0, 1, 2);
mesh.add_triangle(1, 3, 2);
mesh.add_vertex(10.0, 0.0, 0.0);
mesh.add_vertex(11.0, 0.0, 0.0);
mesh.add_vertex(10.0, 1.0, 0.0);
mesh.add_triangle(4, 5, 6);
assert_eq!(mesh.triangles.len(), 3);
let stats = mesh.repair(RepairOptions {
stitch_epsilon: 0.0,
remove_degenerate: false,
remove_duplicate_faces: false,
harmonize_orientations: false,
remove_islands: true,
fill_holes: false,
});
assert_eq!(stats.triangles_removed, 1);
assert_eq!(mesh.triangles.len(), 2);
}
#[test]
fn test_hole_filling() {
let mut mesh = Mesh::new();
mesh.add_vertex(0.0, 0.0, 0.0); mesh.add_vertex(1.0, 0.0, 0.0); mesh.add_vertex(0.0, 1.0, 0.0);
mesh.add_vertex(1.0, 1.0, 0.0); mesh.add_triangle(1, 3, 2);
assert_eq!(mesh.triangles.len(), 1);
let stats = mesh.repair(RepairOptions {
stitch_epsilon: 0.0,
remove_degenerate: false,
remove_duplicate_faces: false,
harmonize_orientations: false,
remove_islands: false,
fill_holes: true,
});
assert_eq!(stats.triangles_added, 1);
assert_eq!(mesh.triangles.len(), 2);
}