use crate::fit::solve_small;
use crate::topology::{
BrepSolid, CoedgeRecord, EdgeRecord, FaceRecord, LoopRecord, ShellRecord, VertexRecord,
};
use crate::{
interpolate_curve, make_arc, make_extrusion, make_line, make_plane, make_revolution,
mesh_to_faceted_brep, solid_signed_volume, NurbsCurve, Vec3, Vec4,
};
use rustc_hash::FxHashMap as HashMap;
use serde::{Deserialize, Serialize};
pub const UNASSIGNED_REGION: u32 = u32::MAX;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(default)]
pub struct SegmentOptions {
pub deflection_angle_deg: f64,
pub min_region_triangles: usize,
pub fit_tolerance: f64,
pub normal_tolerance_deg: f64,
pub planar_extraction_angle_deg: f64,
pub planar_min_area_percent: f64,
pub weld_tolerance: f64,
}
impl Default for SegmentOptions {
fn default() -> Self {
Self {
deflection_angle_deg: 30.0,
min_region_triangles: 1,
fit_tolerance: 1e-3,
normal_tolerance_deg: 15.0,
planar_extraction_angle_deg: 1.0,
planar_min_area_percent: 1.0,
weld_tolerance: 0.0,
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "type")]
pub enum RegionCarrier {
Plane {
origin: Vec3,
normal: Vec3,
},
Cylinder {
axis_point: Vec3,
axis_dir: Vec3,
radius: f64,
sense: i8,
},
Cone {
apex: Vec3,
axis_dir: Vec3,
half_angle_rad: f64,
sense: i8,
},
Sphere {
center: Vec3,
radius: f64,
sense: i8,
},
Torus {
center: Vec3,
axis_dir: Vec3,
major_radius: f64,
minor_radius: f64,
sense: i8,
},
Freeform,
}
impl RegionCarrier {
pub fn kind(&self) -> &'static str {
match self {
RegionCarrier::Plane { .. } => "plane",
RegionCarrier::Cylinder { .. } => "cylinder",
RegionCarrier::Cone { .. } => "cone",
RegionCarrier::Sphere { .. } => "sphere",
RegionCarrier::Torus { .. } => "torus",
RegionCarrier::Freeform => "freeform",
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct MeshRegion {
pub id: u32,
pub triangle_count: usize,
pub area: f64,
pub bbox_min: Vec3,
pub bbox_max: Vec3,
pub carrier: RegionCarrier,
pub max_deviation: f64,
pub rms_deviation: f64,
pub max_normal_angle_deg: f64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct MeshSegmentation {
pub triangle_region_ids: Vec<u32>,
pub regions: Vec<MeshRegion>,
pub triangle_count: usize,
pub welded_vertex_count: usize,
}
#[path = "mesh_segment/mesh_data.rs"]
mod mesh_data;
#[path = "mesh_segment/carrier_fit.rs"]
mod carrier_fit;
#[path = "mesh_segment/segmentation.rs"]
mod segmentation;
#[path = "mesh_segment/brep_builder.rs"]
mod brep_builder;
#[path = "mesh_segment/face_build.rs"]
mod face_build;
use brep_builder::*;
use carrier_fit::*;
use face_build::*;
use mesh_data::*;
use segmentation::*;
pub use brep_builder::mesh_regions_to_brep;
pub use segmentation::segment_mesh_faces;