use super::*;
#[derive(Clone, Debug)]
pub(in crate::step_import) struct WrittenEdge {
pub(in crate::step_import) curve_ref: Option<usize>,
pub(in crate::step_import) curve: NurbsCurve,
pub(in crate::step_import) t0: f64,
pub(in crate::step_import) t1: f64,
}
#[derive(Clone, Debug, Default)]
pub(in crate::step_import) struct TrimCapture {
pub(in crate::step_import) written: HashMap<u64, WrittenEdge>,
pub(in crate::step_import) stages: HashMap<u64, Vec<String>>,
pub(in crate::step_import) faces: Vec<(u64, usize, usize)>,
}
#[derive(Clone, Debug)]
pub(in crate::step_import) struct BoundedTrim {
pub(in crate::step_import) face_ref: usize,
pub(in crate::step_import) surface_ref: usize,
pub(in crate::step_import) edge_id: u64,
pub(in crate::step_import) residual: f64,
pub(in crate::step_import) standoff: f64,
pub(in crate::step_import) fit_residual: f64,
pub(in crate::step_import) fit_standoff: f64,
pub(in crate::step_import) image_to_foot: f64,
pub(in crate::step_import) image_to_global_foot: f64,
pub(in crate::step_import) samples: usize,
pub(in crate::step_import) exit: String,
pub(in crate::step_import) fitter: bool,
pub(in crate::step_import) clamped_excursion: f64,
pub(in crate::step_import) clamped_distance: f64,
}
#[derive(Clone, Debug)]
pub(in crate::step_import) struct BodyReadings {
pub(in crate::step_import) bounded: Vec<BoundedTrim>,
pub(in crate::step_import) closure: super::ClosureNote,
}
impl<'a> SolidBuilder<'a> {
pub(super) fn capture_written(
&mut self,
edge_id: u64,
curve_ref: Option<usize>,
curve: &NurbsCurve,
) -> Result<(), String> {
if let Some(capture) = self.readings.as_mut() {
let [t0, t1] = curve.domain()?;
capture.written.insert(
edge_id,
WrittenEdge {
curve_ref,
curve: curve.clone(),
t0,
t1,
},
);
}
Ok(())
}
pub(super) fn capture_stage(&mut self, edge_id: u64, stage: impl FnOnce() -> String) {
if let Some(capture) = self.readings.as_mut() {
capture.stages.entry(edge_id).or_default().push(stage());
}
}
pub(super) fn capture_split(&mut self, parent: u64, t: f64, left: u64, right: u64) {
let Some(capture) = self.readings.as_mut() else {
return;
};
let history = capture.stages.get(&parent).cloned().unwrap_or_default();
let reparameterised = history
.iter()
.any(|stage| stage.starts_with("rim re-seated") || stage.starts_with("rotated"));
if let Some(written) = capture.written.get(&parent).cloned() {
if !reparameterised {
capture.written.insert(
left,
WrittenEdge {
t1: t,
..written.clone()
},
);
capture.written.insert(right, WrittenEdge { t0: t, ..written });
}
}
for piece in [left, right] {
let mut stages = history.clone();
stages.push(format!("split at the seam from edge {parent} (t = {t:.9})"));
capture.stages.insert(piece, stages);
}
}
pub(super) fn capture_face(&mut self, face_id: u64, face_ref: usize, surface_ref: usize) {
if let Some(capture) = self.readings.as_mut() {
capture.faces.push((face_id, face_ref, surface_ref));
}
}
}