From 07da7f8065cda54e2e9813bf50cb08abbce927f6 Mon Sep 17 00:00:00 2001 From: midasdf <205497066+midasdf@users.noreply.github.com> Date: Fri, 16 Oct 2026 16:26:20 +0900 Subject: [PATCH] Class-A surfacing 2/3: surface match, boundary patch and CV fairing (#1487) Thanks @midasdf. --- ATTRIBUTION.md | 1 + assets/locales/de.json | 2 + assets/locales/en.json | 2 + assets/locales/ja.json | 2 + assets/locales/ko.json | 2 + assets/locales/zh.json | 2 + crates/doc/src/document.rs | 82 + crates/doc/src/eval.rs | 3 + crates/doc/src/eval_surface.rs | 136 ++ crates/doc/src/feature_walk_tests/fixtures.rs | 5 + .../src/feature_walk_tests/golden_exprs.txt | 7 + .../feature_walk_tests/golden_geometry.txt | 9 + .../src/feature_walk_tests/golden_refs.txt | 9 + .../src/format/pending/class-a-surfaces.rs | 5 + crates/doc/src/walk.rs | 2 + crates/engine/src/cmd/mod.rs | 2 + crates/engine/src/cmd/surface.rs | 102 +- crates/engine/src/cmd/surface_boundary.rs | 197 +++ crates/engine/src/cmd/surface_match.rs | 160 ++ crates/kernel/src/boundary.rs | 123 ++ crates/kernel/src/boundary_tests.rs | 276 +++ crates/kernel/src/fair.rs | 1538 +++++++++++++++++ crates/kernel/src/lib.rs | 9 + crates/kernel/src/matchsurf.rs | 601 +++++++ crates/kernel/src/matchsurf_tests.rs | 225 +++ crates/sketch/src/model.rs | 22 +- docs/screenshots/class-a-boundary.png | Bin 0 -> 616830 bytes 27 files changed, 3513 insertions(+), 11 deletions(-) create mode 100644 crates/doc/src/format/pending/class-a-surfaces.rs create mode 100644 crates/engine/src/cmd/surface_boundary.rs create mode 100644 crates/engine/src/cmd/surface_match.rs create mode 100644 crates/kernel/src/boundary.rs create mode 100644 crates/kernel/src/boundary_tests.rs create mode 100644 crates/kernel/src/fair.rs create mode 100644 crates/kernel/src/matchsurf.rs create mode 100644 crates/kernel/src/matchsurf_tests.rs create mode 100644 docs/screenshots/class-a-boundary.png diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index b5b8c4d2..97dca7e5 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -36,6 +36,7 @@ Editable drawing code, native projects and shipped exports are collected under ` | assets/archive/icons/macos-v1/exports/icon.iconset/icon_256x256@2x.png | SolidCraft contributors | native sips export from assets/archive/icons/macos-v1/exports/icon.png | MIT OR Apache-2.0 | | assets/archive/icons/macos-v1/exports/icon.iconset/icon_512x512.png | SolidCraft contributors | native sips export from assets/archive/icons/macos-v1/exports/icon.png | MIT OR Apache-2.0 | | assets/archive/icons/macos-v1/exports/icon.iconset/icon_512x512@2x.png | SolidCraft contributors | native sips export from assets/archive/icons/macos-v1/exports/icon.png | MIT OR Apache-2.0 | +| docs/screenshots/class-a-boundary.png | SolidCraft contributors | screenshot of SolidCraft itself: a patch through two sketch lines built by `surface.boundary` with `crown: 0.4` (`solidcraft-cli snapshot`) | MIT OR Apache-2.0 | | docs/screenshots/sample-plate.png | SolidCraft contributors | screenshot of SolidCraft itself (`solidcraft --sample`) | MIT OR Apache-2.0 | | docs/screenshots/demo-0.8.gif | SolidCraft contributors | original screen recording of the actual SolidCraft 0.8 English desktop UI modelling an original Raspberry Pi 4 case (no logos or branding; the engraved text is set in the system's DejaVu Sans Bold), generated with examples/demo/record_ui.sh and its original animated pointer overlay (9× playback) | MIT OR Apache-2.0 | | docs/screenshots/demo-0.8.mp4 | SolidCraft contributors | original screen recording of the actual SolidCraft 0.8 English desktop UI modelling an original Raspberry Pi 4 case (no logos or branding; the engraved text is set in the system's DejaVu Sans Bold), generated with examples/demo/record_ui.sh and its original animated pointer overlay (9× playback) | MIT OR Apache-2.0 | diff --git a/assets/locales/de.json b/assets/locales/de.json index 69381095..c74bd78c 100644 --- a/assets/locales/de.json +++ b/assets/locales/de.json @@ -366,8 +366,10 @@ "cmd.surface_blend": "Verbindungsfläche", "cmd.surface_boundary": "Begrenzungsfläche", "cmd.surface_extrude": "Flächen-Extrusion", + "cmd.surface_fair": "Flächenbegradigung", "cmd.surface_fillet": "Flächenverrundung", "cmd.surface_loft": "Flächen-Loft", + "cmd.surface_match": "Flächenanpassung", "cmd.surface_offset": "Offsetfläche", "cmd.surface_patch": "Patch", "cmd.surface_reverse_normal": "Normale umkehren", diff --git a/assets/locales/en.json b/assets/locales/en.json index 5767b5dd..ffbe52a3 100644 --- a/assets/locales/en.json +++ b/assets/locales/en.json @@ -568,8 +568,10 @@ "cmd.surface_blend": "Blend Surface", "cmd.surface_boundary": "Boundary Surface", "cmd.surface_extrude": "Surface Extrude", + "cmd.surface_fair": "Fair Surface", "cmd.surface_fillet": "Surface Fillet", "cmd.surface_loft": "Surface Loft", + "cmd.surface_match": "Match Surface", "cmd.surface_offset": "Offset Surface", "cmd.surface_patch": "Patch", "cmd.surface_reverse_normal": "Reverse Normal", diff --git a/assets/locales/ja.json b/assets/locales/ja.json index 350dccc7..4bb4502f 100644 --- a/assets/locales/ja.json +++ b/assets/locales/ja.json @@ -568,8 +568,10 @@ "cmd.surface_blend": "ブレンドサーフェス", "cmd.surface_boundary": "境界サーフェス", "cmd.surface_extrude": "サーフェス押し出し", + "cmd.surface_fair": "サーフェスフェアリング", "cmd.surface_fillet": "サーフェスフィレット", "cmd.surface_loft": "サーフェスロフト", + "cmd.surface_match": "サーフェス一致", "cmd.surface_offset": "オフセットサーフェス", "cmd.surface_patch": "パッチ", "cmd.surface_reverse_normal": "法線を反転", diff --git a/assets/locales/ko.json b/assets/locales/ko.json index 09c175fb..a274a358 100644 --- a/assets/locales/ko.json +++ b/assets/locales/ko.json @@ -366,8 +366,10 @@ "cmd.surface_blend": "블렌드 서피스", "cmd.surface_boundary": "바운더리 서피스", "cmd.surface_extrude": "서피스 돌출", + "cmd.surface_fair": "서피스 페어링", "cmd.surface_fillet": "서피스 필렛", "cmd.surface_loft": "서피스 로프트", + "cmd.surface_match": "서피스 일치", "cmd.surface_offset": "오프셋 서피스", "cmd.surface_patch": "패치", "cmd.surface_reverse_normal": "법선 반전", diff --git a/assets/locales/zh.json b/assets/locales/zh.json index 264d61d7..b310f839 100644 --- a/assets/locales/zh.json +++ b/assets/locales/zh.json @@ -568,8 +568,10 @@ "cmd.surface_blend": "混合曲面", "cmd.surface_boundary": "边界曲面", "cmd.surface_extrude": "曲面拉伸", + "cmd.surface_fair": "曲面光顺", "cmd.surface_fillet": "曲面圆角", "cmd.surface_loft": "曲面放样", + "cmd.surface_match": "曲面匹配", "cmd.surface_offset": "偏移曲面", "cmd.surface_patch": "补面", "cmd.surface_reverse_normal": "反转法向", diff --git a/crates/doc/src/document.rs b/crates/doc/src/document.rs index 37062da1..21e4125c 100644 --- a/crates/doc/src/document.rs +++ b/crates/doc/src/document.rs @@ -1384,6 +1384,59 @@ pub enum FeatureKind { #[serde(default, skip_serializing_if = "std::ops::Not::not")] stitch: bool, }, + /// One surface patch through a network of two to four boundary curves of a sketch + /// (`surface.boundary`, issue #763): the patch runs through the curves in loop order and leaves + /// each boundary at its own `order` — a sketch curve's boundary is a plane, so G1 and up hold + /// exactly — with `crown` shaping the middle without touching a boundary. + SurfaceBoundary { + sketch: SketchId, + /// The curves in loop order: each one ends where the next begins, and the last where the + /// first does. + curves: Vec, + /// How much of the surface across each boundary the patch repeats, one per curve (none: a + /// tangent plane, `g1`, on every side). + #[serde(default, skip_serializing_if = "Vec::is_empty")] + orders: Vec, + /// How full the middle is: 0 the plain construction, up to 3 fuller, down to -0.9 flatter. + #[serde(default)] + crown: f64, + /// The stations every boundary carries. + #[serde(default = "boundary_samples")] + samples: usize, + }, + /// One face of a surface body rebuilt against another body (`surface.match`): the rebuilt + /// boundary nearest the chain of `edges` on `target` takes that chain's place and repeats the + /// target's own shape along the seam up to `order`, while the boundary opposite it, and the + /// body's name, stay where they were. `faces` picks the face to rebuild (its first, when none). + SurfaceMatch { + body: BodyName, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + faces: Vec, + target: BodyName, + edges: Vec, + #[serde(default = "match_order")] + order: Continuity, + }, + /// The B-spline faces at `faces` of `body` faired (`surface.fair`): each face's interior + /// control vertices move to flatten the thin-plate (curvature-variation) energy of the face, + /// `strength` of the full least-squares step at a time, for at most `iterations` steps. + /// `keep_edges` holds the row of control points next to each edge as well as the boundary row + /// itself, so the face keeps meeting its neighbours in position and in tangent. `tolerance` + /// is the farthest a control point may move, so the faired face stays within it of the one the + /// design asked for; an empty `faces` fairs every face of the body. + SurfaceFair { + body: BodyName, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + faces: Vec, + #[serde(default = "fair_strength")] + strength: f64, + #[serde(default = "fair_iterations")] + iterations: u32, + #[serde(default = "fair_keep_edges")] + keep_edges: bool, + #[walk(length = "Tolerance")] + tolerance: Expr, + }, /// A surface body trimmed by a plane, or by a face of a body (`tool`), keeping the side of /// `keep`. SurfaceTrim { @@ -1600,10 +1653,33 @@ fn is_g0(g: &Continuity) -> bool { } /// The continuity a blend repeats by default: the tangent plane on both sides. +/// The stations a boundary patch carries by default. +fn boundary_samples() -> usize { + 25 +} + fn blend_orders() -> [Continuity; 2] { [Continuity::G1, Continuity::G1] } +/// The continuity a match holds by default: position, tangent plane and curvature. +fn match_order() -> Continuity { + Continuity::G2 +} + +/// A fairing's defaults for a design that leaves them out: the whole least-squares step at a +/// time, and the boundary held (the row next to each edge too, so the face still meets its +/// neighbours in tangent). +fn fair_strength() -> f64 { + 1.0 +} +fn fair_iterations() -> u32 { + 1 +} +fn fair_keep_edges() -> bool { + true +} + /// Triangles of one imported mesh body (millimetres). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct MeshData { @@ -1896,6 +1972,9 @@ impl FeatureKind { FeatureKind::SurfaceSweep { .. } => "SurfaceSweepFeature", FeatureKind::SurfaceLoft { .. } => "SurfaceLoftFeature", FeatureKind::SurfaceBlend { .. } => "BlendFeature", + FeatureKind::SurfaceBoundary { .. } => "BoundaryFeature", + FeatureKind::SurfaceMatch { .. } => "MatchFeature", + FeatureKind::SurfaceFair { .. } => "FairFeature", FeatureKind::Stitch { .. } => "StitchFeature", FeatureKind::Thicken { .. } => "ThickenFeature", FeatureKind::SurfaceTrim { .. } => "TrimFeature", @@ -1973,6 +2052,9 @@ impl FeatureKind { FeatureKind::SurfaceSweep { .. } => "SurfaceSweep", FeatureKind::SurfaceLoft { .. } => "SurfaceLoft", FeatureKind::SurfaceBlend { .. } => "Blend", + FeatureKind::SurfaceBoundary { .. } => "Boundary", + FeatureKind::SurfaceMatch { .. } => "Match", + FeatureKind::SurfaceFair { .. } => "Fair", FeatureKind::Stitch { .. } => "Stitch", FeatureKind::Thicken { .. } => "Thicken", FeatureKind::SurfaceTrim { .. } => "Trim", diff --git a/crates/doc/src/eval.rs b/crates/doc/src/eval.rs index d2b52319..12003ecd 100644 --- a/crates/doc/src/eval.rs +++ b/crates/doc/src/eval.rs @@ -4133,6 +4133,9 @@ fn eval_feature(doc: &Document, vals: &BTreeMap, f: &Feature, st: | FeatureKind::SurfaceSweep { .. } | FeatureKind::SurfaceLoft { .. } | FeatureKind::SurfaceBlend { .. } + | FeatureKind::SurfaceBoundary { .. } + | FeatureKind::SurfaceMatch { .. } + | FeatureKind::SurfaceFair { .. } | FeatureKind::SurfaceOffset { .. } | FeatureKind::SurfaceRuled { .. } | FeatureKind::SurfaceUntrim { .. } => surface::eval(doc, vals, f, st, warning), diff --git a/crates/doc/src/eval_surface.rs b/crates/doc/src/eval_surface.rs index 19a1d35f..d6c8a573 100644 --- a/crates/doc/src/eval_surface.rs +++ b/crates/doc/src/eval_surface.rs @@ -145,6 +145,78 @@ pub(super) fn eval(doc: &Document, vals: &BTreeMap, f: &Feature, st.bodies.push(ModelBody::new(name, made, f.id)); Ok(()) } + FeatureKind::SurfaceBoundary { sketch, curves, orders, crown, samples } => { + let ss = sketch_in_feature_frame( + doc, + st.sketch(sketch.0).ok_or_else(|| DocError::Unknown(format!("sketch {sketch} (it must come earlier in the timeline)")))?, + f.component, + )?; + let boundaries = boundary_frames(&ss, curves, orders, *samples)?; + let body = kernel::boundary_patch(&boundaries, *crown, *samples)?; + let name = new_name(st, f, 0); + st.bodies.push(ModelBody::new(name, body, f.id)); + Ok(()) + } + FeatureKind::SurfaceMatch { body, faces, target, edges, order } => { + let i = st.bodies.iter().position(|b| &b.name == body).ok_or_else(|| DocError::Unknown(format!("body `{body}`")))?; + let Some(mb) = st.bodies.get(i).cloned() else { return Err(DocError::Invalid("body".into())) }; + let tb = st.body(target).ok_or_else(|| DocError::Unknown(format!("body `{target}`")))?.body.clone(); + if edges.is_empty() { + return Err(DocError::Invalid("a match needs a chain of the target's edges".into())); + } + // Picked by a point on the face; without picks, the body's first face. + let picked: Vec = if faces.is_empty() { + let faces = mb.body.faces(mb.body.size() * 1e-2)?; + vec![faces.first().ok_or_else(|| DocError::Invalid(format!("`{body}` has no face to match")))?.centroid] + } else { + crate::plain(faces) + }; + let made = kernel::match_surface(&mb.body, &picked, &tb, &crate::plain(edges), *order)?; + // A match rebuilds the face in place: the body keeps its name, and whatever meets it + // downstream still finds it. + if let Some(slot) = st.bodies.get_mut(i) { + *slot = ModelBody::new(mb.name, made, mb.feature); + } + Ok(()) + } + FeatureKind::SurfaceFair { body, faces, strength, iterations, keep_edges, tolerance } => { + let tol = val(vals, tolerance, Kind::Length)?; + let opts = kernel::FairOptions::new(*strength, *iterations as usize, *keep_edges, tol)?; + let i = st.bodies.iter().position(|b| &b.name == body).ok_or_else(|| DocError::Unknown(format!("body `{body}`")))?; + let Some(mb) = st.bodies.get(i).cloned() else { return Err(DocError::Invalid("body".into())) }; + // Picked by a point on the face; without picks, every face of the body. + let mut picked: Vec = Vec::new(); + if faces.is_empty() { + picked.extend(0..mb.body.face_count()); + } else { + for p in faces { + let fi = + crate::appearance::face_index_at(&mb, p.0).ok_or_else(|| DocError::Invalid(format!("Fair: no face of {body} at {p:?}")))?; + if !picked.contains(&fi) { + picked.push(fi); + } + } + } + if picked.is_empty() { + return Err(DocError::Invalid("the body has no faces to fair".into())); + } + // The face keeps every edge it had: only the surface between them is faired. The + // energy before and after goes into the feature's warning, so the reply can say how + // much the face moved. + let (faired, report) = kernel::fair_faces(&mb.body, &picked, &opts)?; + *warning = Some(format!( + "faired {} face(s): energy {:.6} → {:.6} in {} step(s), control points moved up to {:.4} mm", + picked.len(), + report.energy_before, + report.energy_after, + report.steps, + report.movement + )); + if let Some(slot) = st.bodies.get_mut(i) { + *slot = ModelBody::new(mb.name, faired, mb.feature); + } + Ok(()) + } FeatureKind::SurfaceExtrude { sketch, profiles, curves, extent } => { let ss = sketch_in_feature_frame( doc, @@ -349,6 +421,70 @@ fn push_sheet(st: &mut ModelState, f: &Feature, traced: crate::lineage::Traced) st.bodies.push(ModelBody::traced_new(name, traced, f.id)); } +/// The boundaries `surface.boundary` builds its patch from: each picked curve's own stations in +/// the sketch's frame, every one of them leaving the boundary square into the loop — the direction +/// from the curve towards the middle of the loop, taken across its tangent — over the plane the +/// curve lies in (so a chain of planar curves makes a flat patch, and a network that is not +/// coplanar is followed as the plane through the curve's own tangent). `orders` sets how much of +/// that plane each side repeats. +fn boundary_frames( + ss: &SolvedSketch, + curves: &[String], + orders: &[solidcraft_kernel::Continuity], + samples: usize, +) -> Result> { + use solidcraft_kernel::{Boundary, Frame}; + // The stations along each curve, evenly in its own arclength, so every side carries the same + // number of frames and the patch's net is square. + let mut sides: Vec> = Vec::with_capacity(curves.len()); + for id in curves { + let ci = ss.sketch.curve_index(id).ok_or_else(|| DocError::Unknown(format!("sketch curve `{id}`")))?; + let pieces = ss.sketch.exact_pieces(ci); + if pieces.is_empty() { + return Err(DocError::Invalid(format!("curve `{id}` has no exact geometry to build on"))); + } + let lengths: Vec = pieces.iter().map(Seg2::length).collect(); + let total: f64 = lengths.iter().sum(); + if !total.is_finite() || total <= 1e-9 { + return Err(DocError::Invalid(format!("curve `{id}` has no length"))); + } + let mut pts = Vec::with_capacity(samples); + let (mut used, mut at) = (0.0, 0usize); + for k in 0..samples { + let want = total * k as f64 / (samples.saturating_sub(1)).max(1) as f64; + while at + 1 < pieces.len() && used + lengths[at] < want { + used += lengths[at]; + at += 1; + } + let (Some(piece), Some(len)) = (pieces.get(at), lengths.get(at)) else { return Err(DocError::Invalid("boundary piece".into())) }; + let t = ((want - used) / len.max(1e-12)).clamp(0.0, 1.0); + pts.push(ss.plane.to_world(piece.point_at(t))); + } + sides.push(pts); + } + // The middle of the loop, so every side leaves towards the inside of the patch. + let count = sides.iter().map(Vec::len).sum::().max(1) as f64; + let centre = sides.iter().flatten().fold(solidcraft_geom::Vec3::ZERO, |a, p| a + *p) * (1.0 / count); + let mut out = Vec::with_capacity(sides.len()); + for (side, pts) in sides.iter().enumerate() { + let mut frames = Vec::with_capacity(pts.len()); + for (i, p) in pts.iter().enumerate() { + // The tangent from the stations on either side, one-sided at the ends (where the side + // only has one neighbour). + let before = if i == 0 { *p } else { pts[i - 1] }; + let after = if i + 1 == pts.len() { *p } else { pts[i + 1] }; + let tangent = (after - before).normalized().ok_or_else(|| DocError::Invalid("a boundary curve has a stationary station".into()))?; + let across = centre - *p; + let leave = (across - tangent * across.dot(tangent)) + .normalized() + .ok_or_else(|| DocError::Invalid("a boundary runs through the middle of the loop: no patch can leave it".into()))?; + frames.push(Frame { p: *p, leave, bend: Vec3::ZERO, bend_change: Vec3::ZERO }); + } + out.push(Boundary { frames, order: orders.get(side).copied().unwrap_or(solidcraft_kernel::Continuity::G1) }); + } + Ok(out) +} + /// What a surface builder sweeps: the boundary loops of the picked profiles, then the picked /// curves chained end to end. fn sheet_chains(ss: &SolvedSketch, profiles: Option<&ProfileSel>, curves: &[String]) -> Result>> { diff --git a/crates/doc/src/feature_walk_tests/fixtures.rs b/crates/doc/src/feature_walk_tests/fixtures.rs index 6a23ee71..2364cf6c 100644 --- a/crates/doc/src/feature_walk_tests/fixtures.rs +++ b/crates/doc/src/feature_walk_tests/fixtures.rs @@ -161,6 +161,11 @@ pub(super) fn fixtures() -> Vec<(&'static str, Value)> { ("surface_loft", json!({"type": "surface_loft", "sections": []})), ("surface_blend", json!({"type": "surface_blend", "from": {"body": "B", "edges": [o]}, "to": {"body": "C", "edges": [o]}, "align": [o, o]})), ("surface_offset", json!({"type": "surface_offset", "faces": [o], "distance": "soff.distance", "tolerance": "soff.tolerance"})), + // The Class-A surface family (surface.blend/boundary/match/fair). + ("surface_blend", json!({"type": "surface_blend", "from": {"body": "B", "edges": [o]}, "to": {"body": "C", "edges": [o]}, "align": [o, o]})), + ("surface_boundary", json!({"type": "surface_boundary", "sketch": 1, "curves": ["l1", "l2"]})), + ("surface_match", json!({"type": "surface_match", "body": "B", "faces": [o], "target": "C", "edges": [o]})), + ("surface_fair", json!({"type": "surface_fair", "body": "B", "faces": [o], "tolerance": "sfair.tolerance"})), ("unstitch", json!({"type": "unstitch", "body": "B"})), ("reverse_normal", json!({"type": "reverse_normal", "body": "B"})), ("surface_untrim", json!({"type": "surface_untrim", "face": {"body": "B", "point": o}, "holes": [o], "outer": true})), diff --git a/crates/doc/src/feature_walk_tests/golden_exprs.txt b/crates/doc/src/feature_walk_tests/golden_exprs.txt index 7a060857..5a887777 100644 --- a/crates/doc/src/feature_walk_tests/golden_exprs.txt +++ b/crates/doc/src/feature_walk_tests/golden_exprs.txt @@ -340,6 +340,13 @@ surface_offset Distance = soff.distance (Length) Tolerance = soff.tolerance (Length) expressions: soff.distance, soff.tolerance +surface_blend +surface_boundary +surface_match +surface_fair + inputs: + Tolerance = sfair.tolerance (Length) + expressions: sfair.tolerance unstitch reverse_normal surface_untrim diff --git a/crates/doc/src/feature_walk_tests/golden_geometry.txt b/crates/doc/src/feature_walk_tests/golden_geometry.txt index 32f8592e..767444fa 100644 --- a/crates/doc/src/feature_walk_tests/golden_geometry.txt +++ b/crates/doc/src/feature_walk_tests/golden_geometry.txt @@ -154,6 +154,15 @@ surface_blend surface_offset moves: faces[0][0], faces[0][1], faces[0][2] face points: [0, 0, 0] +surface_blend + moves: align[0][0], align[0][1], align[0][2], align[1][0], align[1][1], align[1][2], from.edges[0][0], from.edges[0][1], from.edges[0][2], to.edges[0][0], to.edges[0][1], to.edges[0][2] +surface_boundary +surface_match + moves: edges[0][0], edges[0][1], edges[0][2], faces[0][0], faces[0][1], faces[0][2] + face points: [0, 0, 0] +surface_fair + moves: faces[0][0], faces[0][1], faces[0][2] + face points: [0, 0, 0] unstitch moves: faces[0][0], faces[0][1], faces[0][2] reverse_normal diff --git a/crates/doc/src/feature_walk_tests/golden_refs.txt b/crates/doc/src/feature_walk_tests/golden_refs.txt index 9c56ab0b..0b621c6a 100644 --- a/crates/doc/src/feature_walk_tests/golden_refs.txt +++ b/crates/doc/src/feature_walk_tests/golden_refs.txt @@ -177,6 +177,15 @@ surface_blend remap_bodies: from.body surface_offset remap_bodies: body +surface_blend + remap_bodies: from.body +surface_boundary + sketches: [1] + remap_refs: sketch +surface_match + remap_bodies: body +surface_fair + remap_bodies: body unstitch remap_bodies: body reverse_normal diff --git a/crates/doc/src/format/pending/class-a-surfaces.rs b/crates/doc/src/format/pending/class-a-surfaces.rs new file mode 100644 index 00000000..ee4e5859 --- /dev/null +++ b/crates/doc/src/format/pending/class-a-surfaces.rs @@ -0,0 +1,5 @@ +//! The Class-A surface pass adds `SurfaceBoundary` (Boundary Surface: `sketch`, `curves`, +//! optional `orders`, `crown`, `samples`), `SurfaceMatch` (Match Surface: `body`, optional +//! `faces`, `target`, `edges`, optional `order`) and `SurfaceFair` (Fair Surface: `body`, optional +//! `faces`, `strength`, `iterations`, `keep_edges`, `tolerance`). Older designs need no +//! transformation; 0.13.x asks for an update instead of meeting a feature it can't read. diff --git a/crates/doc/src/walk.rs b/crates/doc/src/walk.rs index 64073b31..7c571a1b 100644 --- a/crates/doc/src/walk.rs +++ b/crates/doc/src/walk.rs @@ -40,6 +40,8 @@ impl Walk for bool {} impl Walk for u64 {} impl Walk for i8 {} impl Walk for f64 {} +impl Walk for usize {} +impl Walk for u32 {} impl Walk for ProfileSel {} impl Walk for solidcraft_sketch::Sketch {} impl Walk for solidcraft_sketch::PatternAlignment {} diff --git a/crates/engine/src/cmd/mod.rs b/crates/engine/src/cmd/mod.rs index db7fa5c3..a37f226a 100644 --- a/crates/engine/src/cmd/mod.rs +++ b/crates/engine/src/cmd/mod.rs @@ -74,6 +74,7 @@ mod sketch_modify; mod sketch_project; mod surface; mod surface_analysis; +mod surface_match; mod view_dxf; mod view_navigation; @@ -236,6 +237,7 @@ pub fn command_specs() -> Vec<&'static CommandSpec> { v.extend(sketch_3d::COMMANDS.iter()); v.extend(surface_analysis::COMMANDS.iter()); v.extend(surface::COMMANDS.iter()); + v.extend(surface_match::COMMANDS.iter()); v.extend(sketch_modify::COMMANDS.iter()); v.extend(sketch_project::COMMANDS.iter()); v.extend(features::COMMANDS.iter()); diff --git a/crates/engine/src/cmd/surface.rs b/crates/engine/src/cmd/surface.rs index 93d7a19a..4e76e0d4 100644 --- a/crates/engine/src/cmd/surface.rs +++ b/crates/engine/src/cmd/surface.rs @@ -3,7 +3,8 @@ use serde_json::Value; use solidcraft_doc::{ - BlendSide, EdgeContinuity, ExtendMode, ExtendTo, FaceAt, FeatureKind, PatchContinuity, PlaneRef, ProfileSel, RuledCorners, RuledMode, expr::Kind, + BlendSide, EdgeContinuity, Expr, ExtendMode, ExtendTo, FaceAt, FeatureKind, PatchContinuity, PlaneRef, ProfileSel, RuledCorners, RuledMode, + expr::Kind, }; use solidcraft_doc::{BodyName, SketchId}; use solidcraft_doc::{Dir, FacePick, Position}; @@ -11,7 +12,7 @@ use solidcraft_kernel::Continuity; use super::CommandSpec; use super::features::{add_feature, axis_param, check_expr, extent_param, feature_sketch, operation, plane_param, profiles, sketch_id}; -use crate::params::{bad, bool_, expr, str_, string_list, vec3}; +use crate::params::{bad, bool_, expr, num, str_, string_list, vec3}; use crate::{Result, Session}; pub static COMMANDS: &[CommandSpec] = &[ @@ -59,10 +60,6 @@ pub static COMMANDS: &[CommandSpec] = &[ .at("SURFACE", "CREATE") .icon("ruled") .params("body; edges: [[x,y,z]] (points on a chain of its edges, open or closed); distance: expr (how far the strip reaches); mode?: normal|tangent|angle|direction (default normal: along the normal of the face beside each edge; tangent: continuing it); angle?: expr (angle mode: from `direction`, else from the face's normal, turned away from the face; 90 deg from the normal is tangent); direction?: [x,y,z] (direction mode: the rulings; angle mode: the reference, e.g. a pull direction for a draft); face?: [x,y,z] (a point on the face the directions come from; default: the face beside the most picked edges); flip?: bool (the other side); corners?: mitre|round (sharp corners of the chain; inside corners are always cut back). Lines and arcs give exact planes, cylinders and cones, other edges a fitted ruled B-spline. A new surface body"), - planned!("surface.boundary", "Boundary Surface", "763") - .at("SURFACE", "CREATE") - .icon("boundary") - .params("planned: u: [curves], v?: [curves] (sketch curves, 3D sketch wires or {body, point} edges; 2–4 boundaries, more make a network); continuity?: [{curve, g: 0|1|2}] for edge boundaries; operation?: new|join"), CommandSpec::new("surface.blend", "Blend Surface", blend) .at("SURFACE", "CREATE") .icon("surface_blend") @@ -79,6 +76,10 @@ pub static COMMANDS: &[CommandSpec] = &[ .at("SURFACE", "MODIFY") .icon("reverse_normal") .params("body (a surface); faces?: [[x,y,z]] (points on the faces to turn over; default: all of them)"), + CommandSpec::new("surface.fair", "Fair Surface", fair) + .at("SURFACE", "MODIFY") + .icon("spline_cv") + .params("body: surface name; faces?: [[x,y,z]] points on the faces to fair (default: every face); strength?: number (0..1 of the full fairing step, default 1); iterations?: number (1..1000 steps, default 1); keep_edges?: bool (default true: hold the boundary row and the row next to it, so a face keeps meeting its neighbours in position and in tangent); tolerance?: expr mm (how far a control vertex may move, default 0.001 of the body's size). Moves the interior control vertices of each B-spline face to flatten its curvature variation while the boundary stays put: the face keeps its edges and the body its shape within the tolerance, and the warning in the reply carries the energy before and after; name?"), planned!("surface.fillet", "Surface Fillet", "769") .at("SURFACE", "MODIFY") .icon("surface_fillet") @@ -558,6 +559,39 @@ fn trim(s: &mut Session, p: &Value) -> Result { add_feature(s, p, FeatureKind::SurfaceTrim { body: BodyName(body), plane, tool, keep: Position(keep) }) } +/// `surface.fair`: the B-spline faces of a body faired in place. The tolerance a caller leaves +/// out is a thousandth of the body's own size, so a fairing run can never make a design jump by +/// more than a hair of itself. +fn fair(s: &mut Session, p: &Value) -> Result { + let cmd = "surface.fair"; + let (body, faces) = body_faces(s, p, cmd)?; + let size = { + let state = s.model.state(); + let Some(mb) = state.body(&body) else { return Err(bad(cmd, format!("no body `{body}`"))) }; + mb.body.size() + }; + let strength = num(p, "strength").unwrap_or(1.0); + if !(strength.is_finite() && strength > 0.0 && strength <= 1.0) { + return Err(bad(cmd, "`strength` must be greater than 0 and at most 1 (the whole fairing step)")); + } + let steps = num(p, "iterations").unwrap_or(1.0); + if !(steps.is_finite() && (1.0..=1000.0).contains(&steps)) { + return Err(bad(cmd, "`iterations` must be 1 to 1000")); + } + let keep_edges = bool_(p, "keep_edges").unwrap_or(true); + let tolerance = expr(p, "tolerance").unwrap_or_else(|| Expr::new(format!("{:.6}", (size * 1e-3).max(1e-6)))); + check_expr(s, tolerance.as_str(), Kind::Length, cmd, "tolerance")?; + let kind = FeatureKind::SurfaceFair { + body: BodyName::from(body), + faces: faces.into_iter().map(FacePick).collect(), + strength, + iterations: steps as u32, + keep_edges, + tolerance, + }; + add_feature(s, p, kind) +} + #[cfg(test)] mod tests { use super::*; @@ -1178,7 +1212,7 @@ mod tests { /// as it was. #[test] fn planned_commands_refuse_and_leave_the_design_alone() { - let planned = ["surface.boundary", "surface.fillet", "inspect.continuity"]; + let planned = ["surface.fillet", "inspect.continuity"]; let mut s = Session::default(); run(&mut s, "solid.box", json!({"length": 10, "width": 10, "height": 10, "body_name": "B"})); let before = s.doc.features.len(); @@ -1500,4 +1534,58 @@ mod tests { let sketch_patch = json!({"sketch": 1, "continuity": "g1"}); assert!(s.execute("surface.patch", &sketch_patch).is_err(), "continuity on a sketch patch"); } + /// The energies the reply's warning carries: the fairness energy before and after. + fn energies(reply: &Value) -> (f64, f64) { + let warning = reply["warning"].as_str().unwrap_or_else(|| panic!("no warning in {reply}")); + let after = warning.split("energy ").nth(1).unwrap_or_else(|| panic!("no energies in `{warning}`")); + let numbers: Vec = after + .split(|c: char| !(c.is_ascii_digit() || c == '.' || c == 'e' || c == '-' || c == '+')) + .filter_map(|w| w.parse::().ok()) + .collect(); + assert!(numbers.len() >= 2, "no energies in `{warning}`"); + (numbers[0], numbers[1]) + } + + /// Surface Fair on the fitted B-spline face of an offset sphere: the face is smoothed in + /// place, its edges do not move at all, the reply carries the energy before and after, undo, + /// redo and a cold reopen keep it, and hostile inputs are refused. + #[test] + fn fairing_a_b_spline_face_keeps_its_edges_and_reports_its_energy() { + let mut s = Session::default(); + run(&mut s, "solid.sphere", json!({"radius": 20, "body_name": "Ball"})); + // A sphere is neither a plane nor a cylinder, so its offset is a fitted B-spline face. + run(&mut s, "surface.offset", json!({"faces": [[0, 0, 20]], "body": "Ball", "distance": 2, "body_name": "Shell"})); + let st = s.world_state(); + assert!(st.body("Shell").unwrap().body.is_surface(), "an offset sphere face is a sheet"); + let before: Vec = st.body("Shell").unwrap().body.edges(0.1).unwrap().iter().flat_map(|e| e.points.clone()).collect(); + assert!(!before.is_empty()); + let area_before = area(&s, "Shell"); + // The fairing reports both energies, the second no larger than the first. + let reply = run(&mut s, "surface.fair", json!({"body": "Shell", "tolerance": 1.0, "iterations": 3})); + let (energy_before, energy_after) = energies(&reply); + let area_after = area(&s, "Shell"); + eprintln!("surface.fair: {reply}\nenergies {energy_before:e} → {energy_after:e}, area {area_before} → {area_after}"); + assert!(energy_before > 0.0 && energy_after <= energy_before, "{energy_before:e} → {energy_after:e}"); + // The face moved (the fit is not the flattest surface on its own rim), but not its edges: + // every boundary point of the body is where it was, bit for bit. + assert!((area_after - area_before).abs() > 0.0 || energy_after < energy_before); + let after: Vec = st.body("Shell").unwrap().body.edges(0.1).unwrap().iter().flat_map(|e| e.points.clone()).collect(); + assert_eq!(after, before, "fairing must not move the face's edges"); + assert_eq!(st.body("Shell").unwrap().body.face_count(), 1); + // Undo takes the fairing back, redo puts it back, and a cold reopen rebuilds the same. + run(&mut s, "edit.undo", json!({})); + assert!((area(&s, "Shell") - area_before).abs() < 1e-9, "undo did not take the fairing back"); + run(&mut s, "edit.redo", json!({})); + assert!((area(&s, "Shell") - area_after).abs() < 1e-9, "redo did not put the fairing back"); + let cold = Session::new(solidcraft_doc::Document::from_json(&s.doc.to_json()).unwrap()); + assert!((area(&cold, "Shell") - area_after).abs() < 1e-9, "a cold reopen did not rebuild the same sheet"); + // Refusals: an unknown body, a body whose faces are all planes, an out-of-range strength + // or step count, and a missing tolerance expression. + assert!(s.execute("surface.fair", &json!({"body": "Nope", "tolerance": 1.0})).is_err()); + run(&mut s, "solid.box", json!({"length": 10, "width": 10, "height": 10, "body_name": "Box"})); + assert!(s.execute("surface.fair", &json!({"body": "Box", "tolerance": 1.0})).is_err()); + assert!(s.execute("surface.fair", &json!({"body": "Shell", "strength": 2, "tolerance": 1.0})).is_err()); + assert!(s.execute("surface.fair", &json!({"body": "Shell", "iterations": 0, "tolerance": 1.0})).is_err()); + assert!(s.execute("surface.fair", &json!({"body": "Shell", "tolerance": 0})).is_err()); + } } diff --git a/crates/engine/src/cmd/surface_boundary.rs b/crates/engine/src/cmd/surface_boundary.rs new file mode 100644 index 00000000..6bbc3f1a --- /dev/null +++ b/crates/engine/src/cmd/surface_boundary.rs @@ -0,0 +1,197 @@ +//! Boundary surfaces: one patch through a network of two to four sketch curves (`surface.boundary`, +//! issue #763). The kernel builds the face from the curves' own frames; this is the command's +//! parameters and its checks, so that a loop it cannot hold is refused before anything is built. + +use serde_json::Value; +use solidcraft_doc::{FeatureKind, SketchId}; +use solidcraft_kernel::Continuity; + +use super::CommandSpec; +use super::features::{add_feature, feature_sketch}; +use crate::params::{bad, string_list}; +use crate::{Result, Session}; + +/// The stations a boundary carries by default (the patch's resolution along the loop). +const DEFAULT_SAMPLES: usize = 25; +/// The fewest stations a patch can hold the widest continuity pair with: a G3 side needs four rows +/// at each of two opposite sides, so eight. +const MIN_SAMPLES: usize = 8; +/// The most stations a boundary may carry (the kernel's own cap). +const MAX_SAMPLES: usize = 512; + +pub static COMMANDS: &[CommandSpec] = &[CommandSpec::new("surface.boundary", "Boundary Surface", boundary) + .at("SURFACE", "CREATE") + .icon("boundary") + .params( + "sketch?: id|name (default: the sketch being edited); curves: [2 to 4 sketch curve ids in loop order] (each one ends where the next begins and the last where the first does; the patch runs through them and leaves each boundary along the tangent across it); continuity?: g0|g1|g2|g3 | [one per curve] (default g1: how much of the surface across each boundary the patch repeats — a sketch curve's own plane, so g1 and up hold exactly and g0 lets the middle bow); crown?: number -0.9…3 (default 0: how full the middle is, without touching a boundary); samples?: 8…512 stations per boundary (default 25); name?, body_name? (a surface body)", + )]; + +/// `surface.boundary`: one patch through a network of two to four sketch curves. +fn boundary(s: &mut Session, p: &Value) -> Result { + let cmd = "surface.boundary"; + let sketch = feature_sketch(s, p, cmd)?; + let curves = string_list(p, "curves"); + if !(2..=4).contains(&curves.len()) { + return Err(bad(cmd, "`curves` must list 2 to 4 sketch curves in loop order")); + } + // The curves must be the sketch's own, and they must run on into one another: the last station + // of each is the first of the next, and the last boundary's end is the first one's start. + let state = s.model.state(); + let sk = state.sketch(sketch).ok_or_else(|| bad(cmd, "the sketch has not been solved"))?; + let mut ends: Vec<(solidcraft_geom::Vec2, solidcraft_geom::Vec2)> = Vec::with_capacity(curves.len()); + for id in &curves { + let ci = sk.sketch.curve_index(id).ok_or_else(|| bad(cmd, format!("no sketch curve `{id}`")))?; + let pieces = sk.sketch.exact_pieces(ci); + let (Some(first), Some(last)) = (pieces.first(), pieces.last()) else { + return Err(bad(cmd, format!("curve `{id}` has no exact geometry to build on"))); + }; + if last.end().dist(first.start()) < 1e-9 { + return Err(bad(cmd, format!("curve `{id}` is closed: a boundary must be one side of the loop"))); + } + ends.push((first.start(), last.end())); + } + // Two boundaries are the two sides of a bridge, which do not meet; three or four run round a + // loop, so each has to end where the next begins. + let scale = ends.iter().map(|(a, b)| a.dist(*b)).fold(1.0_f64, f64::max); + let tol = scale * 1e-4 + 1e-9; + for i in 0..if curves.len() >= 3 { ends.len() } else { 0 } { + let next = (i + 1) % ends.len(); + let (Some(end), Some(start)) = (ends.get(i).map(|e| e.1), ends.get(next).map(|e| e.0)) else { + return Err(bad(cmd, "a curve is missing its ends")); + }; + let gap = end.dist(start); + if gap > tol { + return Err(bad( + cmd, + format!("curve `{}` ends {gap:.4} mm from where `{}` starts: list the curves in loop order", curves[i], curves[next]), + )); + } + } + drop(state); + let orders = match p.get("continuity") { + None | Some(Value::Null) => vec![Continuity::G1; curves.len()], + Some(Value::String(w)) => { + let one = Continuity::parse(w).ok_or_else(|| bad(cmd, "`continuity` must be g0, g1, g2 or g3"))?; + vec![one; curves.len()] + } + Some(v) => { + let list = v.as_array().filter(|a| a.len() == curves.len()).ok_or_else(|| bad(cmd, "`continuity` must be one word, or one per curve"))?; + let mut out = Vec::with_capacity(list.len()); + for x in list { + out.push(x.as_str().and_then(Continuity::parse).ok_or_else(|| bad(cmd, "`continuity` entries must be g0, g1, g2 or g3"))?); + } + out + } + }; + let crown = match p.get("crown") { + None | Some(Value::Null) => 0.0, + Some(v) => v + .as_f64() + .filter(|x| x.is_finite() && (solidcraft_geom::fill::MIN_CROWN..=solidcraft_geom::fill::MAX_CROWN).contains(x)) + .ok_or_else(|| bad(cmd, "`crown` must be a number between -0.9 and 3"))?, + }; + let samples = match p.get("samples") { + None | Some(Value::Null) => DEFAULT_SAMPLES, + Some(v) => { + let n = v.as_f64().filter(|x| x.is_finite() && x.fract() == 0.0).map(|x| x as usize); + n.filter(|x| (MIN_SAMPLES..=MAX_SAMPLES).contains(x)) + .ok_or_else(|| bad(cmd, format!("`samples` must be a whole number of stations between {MIN_SAMPLES} and {MAX_SAMPLES}")))? + } + }; + add_feature(s, p, FeatureKind::SurfaceBoundary { sketch: SketchId(sketch), curves, orders, crown, samples }) +} + +#[cfg(test)] +mod tests { + use serde_json::{Value, json}; + + use crate::Session; + + fn run(s: &mut Session, id: &str, p: Value) -> Value { + match s.execute(id, &p) { + Ok(v) => v, + Err(e) => panic!("{id} {p}: {e}"), + } + } + + fn ids(v: &Value) -> Vec { + v.as_array().map(|a| a.iter().filter_map(|x| x.as_str().map(str::to_string)).collect()).unwrap_or_default() + } + + fn new_sketch() -> Session { + let mut s = Session::default(); + run(&mut s, "sketch.create", json!({"plane": "XY"})); + s + } + + /// Two parallel 20 mm lines 10 mm apart, and the patch between them. + fn two_walls(s: &mut Session) -> Vec { + let a = ids(&run(s, "sketch.line", json!({"points": [[0, 0], [20, 0]]}))["created"]["curves"])[0].clone(); + let b = ids(&run(s, "sketch.line", json!({"points": [[0, 10], [20, 10]]}))["created"]["curves"])[0].clone(); + vec![a, b] + } + + #[test] + fn a_boundary_patch_between_two_sketch_curves_is_the_sheet_they_span() { + for continuity in [json!("g0"), json!("g1"), json!("g2"), json!(["g1", "g2"])] { + let mut s = new_sketch(); + let curves = two_walls(&mut s); + let r = run(&mut s, "surface.boundary", json!({"curves": curves, "continuity": continuity})); + let body = ids(&r["created_bodies"])[0].clone(); + // It is one face, its boundary is the two lines themselves, and it covers exactly the + // 20 × 10 sheet between them — all four frames lie in the sketch's plane. + let f = run(&mut s, "model.faces", json!({"body": body})); + let faces = f["faces"].as_array().cloned().unwrap_or_default(); + assert_eq!(faces.len(), 1, "{continuity}: {f}"); + assert!((faces[0]["area"].as_f64().unwrap_or(f64::NAN) - 200.0).abs() < 1e-4, "{continuity}: {f}"); + let normal = faces[0]["plane_normal"].as_array().cloned().unwrap_or_default(); + assert_eq!(normal.len(), 3, "{continuity}: the patch is planar: {f}"); + assert!(normal[2].as_f64().unwrap_or(0.0).abs() > 1.0 - 1e-9, "{continuity}: it lies in the sketch's plane: {f}"); + let m = run(&mut s, "inspect.measure", json!({})); + let area = m["total"]["area_mm2"].as_f64().unwrap_or(f64::NAN); + assert!((area - 200.0).abs() < 1e-4, "{continuity}: {area}"); + } + } + + #[test] + fn a_boundary_patch_refuses_a_loop_and_values_it_cannot_hold() { + let mut s = new_sketch(); + let curves = two_walls(&mut s); + let extra = ids(&run(&mut s, "sketch.line", json!({"points": [[30, 30], [40, 40]]}))["created"]["curves"])[0].clone(); + // A loop of three or four: the kernel refuses it with its own reason (a tensor-product patch + // cannot hold two sides' data at a corner, issue #763) rather than building it approximately. + let triangle = ["l1", "l2", "l3"].map(|id| { + let _ = id; + String::new() + }); + let _ = triangle; + let a = ids(&run(&mut s, "sketch.line", json!({"points": [[0, 0], [20, 0]]}))["created"]["curves"])[0].clone(); + let b = ids(&run(&mut s, "sketch.line", json!({"points": [[20, 0], [10, 15]]}))["created"]["curves"])[0].clone(); + let c = ids(&run(&mut s, "sketch.line", json!({"points": [[10, 15], [0, 0]]}))["created"]["curves"])[0].clone(); + let e = s.execute("surface.boundary", &json!({"curves": [a, b, c], "continuity": "g2"})).unwrap_err().to_string(); + assert!(e.contains("not supported yet") && e.contains("#763"), "three boundaries: {e}"); + // A closed square of four lines, in loop order. + let sq = [[[0, 0], [10, 0]], [[10, 0], [10, 10]], [[10, 10], [0, 10]], [[0, 10], [0, 0]]]; + let square: Vec = sq.iter().map(|p| ids(&run(&mut s, "sketch.line", json!({"points": p}))["created"]["curves"])[0].clone()).collect(); + let e = s.execute("surface.boundary", &json!({"curves": square})).unwrap_err().to_string(); + assert!(e.contains("not supported yet") && e.contains("#763"), "four boundaries: {e}"); + // Parameters and curves that make no sense. + let cases: Vec<(Value, &str)> = vec![ + (json!({"curves": [curves[0]]}), "2 to 4"), + (json!({"curves": [curves[0], curves[1], extra.clone(), extra.clone(), extra.clone()]}), "2 to 4"), + (json!({"curves": [curves[0], "nope"]}), "no sketch curve"), + (json!({"curves": curves, "continuity": "g9"}), "continuity"), + (json!({"curves": curves, "continuity": ["g1", "g2", "g3"]}), "continuity"), + (json!({"curves": curves, "crown": 5}), "crown"), + (json!({"curves": curves, "crown": "full"}), "crown"), + (json!({"curves": curves, "samples": 3}), "samples"), + (json!({"curves": curves, "samples": 2.5}), "samples"), + ]; + for (params, want) in cases { + let e = s.execute("surface.boundary", ¶ms).unwrap_err().to_string(); + assert!(e.contains(want), "{params}: {e}"); + } + // Nothing was built by any of them. + assert!(s.model.state().bodies.is_empty(), "a refused patch left a body behind"); + } +} diff --git a/crates/engine/src/cmd/surface_match.rs b/crates/engine/src/cmd/surface_match.rs new file mode 100644 index 00000000..78f5b8ec --- /dev/null +++ b/crates/engine/src/cmd/surface_match.rs @@ -0,0 +1,160 @@ +//! `surface.match`: rebuild a surface body's face so that one of its boundaries takes the place of +//! a picked edge chain of another body, repeating that body's shape along the seam up to a +//! requested continuity, while the boundary opposite it keeps its place. The body keeps its name: +//! a match is a modify, like Trim, Extend and Fair. + +use serde_json::Value; +use solidcraft_doc::{BodyName, FacePick, FeatureKind, Position}; +use solidcraft_kernel::Continuity; + +use super::CommandSpec; +use super::features::add_feature; +use crate::params::{bad, str_, vec3}; +use crate::{Result, Session}; + +pub static COMMANDS: &[CommandSpec] = &[ + CommandSpec::new("surface.match", "Match Surface", match_surface) + .at("SURFACE", "MODIFY") + .icon("continuity") + .params( + "body: surface name (the body whose face is rebuilt); faces?: [[x,y,z]] (points on that face, default: the body's first); target: body name (the body the seam must meet); edges: [[x,y,z]] (points on one edge chain of the target: the rebuilt boundary takes its place); order?: g1|g2|g3 (default g2: position and tangent plane, the curvature too, or how that curvature changes along the seam). The far boundary stays where it was and the body keeps its name", + ), +]; + +/// `surface.match`: one face of `body` is rebuilt so that its boundary nearest the picked chain of +/// `target` lies on that chain and repeats the target's own shape there up to `order`. +fn match_surface(s: &mut Session, p: &Value) -> Result { + let cmd = "surface.match"; + let body = str_(p, "body").ok_or_else(|| bad(cmd, "`body` is required"))?.to_string(); + if s.model.state().body(&body).is_none() { + return Err(bad(cmd, format!("no body `{body}`"))); + } + let target = str_(p, "target").ok_or_else(|| bad(cmd, "`target` is required"))?.to_string(); + if s.model.state().body(&target).is_none() { + return Err(bad(cmd, format!("no body `{target}`"))); + } + let faces: Vec = p.get("faces").and_then(Value::as_array).map(|a| a.iter().filter_map(vec3).collect()).unwrap_or_default(); + if faces.len() > 64 { + return Err(bad(cmd, "too many points on the face to rebuild")); + } + let edges: Vec = p.get("edges").and_then(Value::as_array).map(|a| a.iter().filter_map(vec3).collect()).unwrap_or_default(); + if edges.is_empty() || edges.len() > 10_000 { + return Err(bad(cmd, "`edges` must list 1 to 10000 points on the target's edge chain")); + } + let order = match p.get("order") { + None => Continuity::G2, + Some(v) => v.as_str().and_then(Continuity::parse).filter(|o| *o != Continuity::G0).ok_or_else(|| bad(cmd, "`order` must be g1, g2 or g3"))?, + }; + add_feature( + s, + p, + FeatureKind::SurfaceMatch { + body: BodyName::from(body), + faces: faces.into_iter().map(FacePick).collect(), + target: BodyName::from(target), + edges: edges.into_iter().map(Position).collect(), + order, + }, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::Session; + use serde_json::json; + use solidcraft_geom::Vec3; + + fn run(s: &mut Session, c: &str, p: Value) -> Value { + s.execute(c, &p).unwrap_or_else(|e| panic!("{c}: {e}")) + } + + /// The picked chain: two points of the cylinder's own vertical wall seam, clear of the corners + /// at either end. The seam is where `solid.extrude` starts the circle, so it is read off the + /// body rather than assumed. + fn picks(s: &Session) -> Vec { + let boss = s.world_state().body("Boss").unwrap().body.clone(); + let e = boss + .edges(boss.size() * 1e-2) + .unwrap() + .into_iter() + .find(|e| e.length > 25.0 && (e.mid.x.hypot(e.mid.y) - 10.0).abs() < 0.05 && e.mid.z > 5.0 && e.mid.z < 25.0) + .expect("the cylinder has a straight vertical wall seam"); + let (a, b) = (e.points.first().copied(), e.points.last().copied()); + let (a, b) = (a.unwrap_or(e.mid), b.unwrap_or(e.mid)); + vec![a + (b - a) * 0.25, a + (b - a) * 0.75] + } + + /// A cylinder of radius 10, 30 high, and a cylindrical skirt of radius 11 from the cylinder's + /// own wall seam round 60 degrees: the skirt's near boundary is 1 mm off the seam line. + fn boss_and_skirt(s: &mut Session) { + run(s, "sketch.create", json!({"plane": "XY", "name": "Round"})); + run(s, "sketch.circle.center", json!({"center": [0, 0], "radius": 10})); + run(s, "sketch.finish", json!({})); + run(s, "solid.extrude", json!({"sketch": "Round", "distance": 30, "body_name": "Boss"})); + let seam = picks(s)[0]; + let a = seam.y.atan2(seam.x); + let at = |t: f64| json!([11.0 * t.cos(), 11.0 * t.sin()]); + run(s, "sketch.create", json!({"plane": "XY", "name": "Skirt sketch"})); + let arc = run(s, "sketch.arc.three_point", json!({"start": at(a), "end": at(a + 60f64.to_radians()), "through": at(a + 30f64.to_radians())})) + ["created"]["curves"][0] + .as_str() + .unwrap() + .to_string(); + run(s, "sketch.finish", json!({})); + run(s, "surface.extrude", json!({"sketch": "Skirt sketch", "curves": [arc], "distance": 30, "body_name": "Skirt"})); + } + + /// The seam of a matched skirt, measured back off the two bodies: how far the rebuilt boundary + /// is from the picked seam line, the angle between the two surfaces' normals across it, and + /// the continuity it holds. + fn seam(s: &Session) -> (f64, f64, Continuity) { + let st = s.world_state(); + let made = st.body("Skirt").unwrap().body.clone(); + let target = st.body("Boss").unwrap().body.clone(); + solidcraft_kernel::seam_continuity(&made, &target, &picks(s)).unwrap() + } + + /// `surface.match`: a skirt meets a cylinder's wall seam at g2; the body keeps its name, undo + /// and redo move it back and forth, a cold reopen gives the same seam, and what cannot be + /// matched is refused. + #[test] + fn surface_match_rebuilds_a_skirt_onto_a_cylinder() { + let mut s = Session::default(); + boss_and_skirt(&mut s); + // Before the match the skirt's boundary is the 1 mm-wider line it was extruded at. + let (gap, _, _) = seam(&s); + assert!((gap - 1.0).abs() < 0.05, "the skirt starts a millimetre off the seam: {gap}"); + let chain = picks(&s); + run(&mut s, "surface.match", json!({"body": "Skirt", "target": "Boss", "edges": chain, "order": "g2"})); + let st = s.world_state(); + assert!(st.body("Skirt").is_some(), "the matched body keeps its name"); + assert!(st.body("Boss").is_some(), "the body it was matched to stays too"); + assert!(st.body("Skirt").unwrap().body.is_surface(), "a match stays a surface"); + let (gap, deg, order) = seam(&s); + println!("engine: gap {gap:e} mm, normal {deg:e} deg, order {order:?}"); + assert!(gap < 1e-6, "the seam is on the picked line: {gap:e} mm"); + assert!(deg < 0.05, "the seam holds the wall's tangent plane: {deg} deg"); + assert!(order.conditions() >= Continuity::G1.conditions(), "{order:?}"); + // Undo puts the boundary back, redo matches it again, and a cold reopen agrees. + run(&mut s, "edit.undo", json!({})); + assert!(seam(&s).0 > 0.5, "undo restores the original skirt"); + run(&mut s, "edit.redo", json!({})); + assert!(seam(&s).1 < 0.05, "redo matches it again"); + let cold = Session::new(solidcraft_doc::Document::from_json(&s.doc.to_json()).unwrap()); + assert!(seam(&cold).1 < 0.05, "a reopened design matches the same"); + // Refusals: an unknown body, no target, no picks on the target, a word that is no order, + // and a body that is not a surface. + assert!(s.execute("surface.match", &json!({"body": "Nope", "target": "Boss", "edges": picks(&s)})).is_err()); + assert!(s.execute("surface.match", &json!({"body": "Skirt", "edges": picks(&s)})).is_err()); + assert!(s.execute("surface.match", &json!({"body": "Skirt", "target": "Boss", "edges": []})).is_err()); + assert!(s.execute("surface.match", &json!({"body": "Skirt", "target": "Nope", "edges": picks(&s)})).is_err()); + assert!(s.execute("surface.match", &json!({"body": "Skirt", "target": "Boss", "edges": picks(&s), "order": "g5"})).is_err()); + assert!(s.execute("surface.match", &json!({"body": "Skirt", "target": "Boss", "edges": [[100, 0, 0]]})).is_err()); + run(&mut s, "sketch.create", json!({"plane": "XY", "name": "B"})); + run(&mut s, "sketch.rectangle.two_point", json!({"p0": [0, 0], "p1": [4, 4]})); + run(&mut s, "sketch.finish", json!({})); + run(&mut s, "solid.extrude", json!({"sketch": "B", "distance": 4, "body_name": "Block"})); + assert!(s.execute("surface.match", &json!({"body": "Block", "target": "Boss", "edges": picks(&s)})).is_err(), "a solid is not a surface"); + } +} diff --git a/crates/kernel/src/boundary.rs b/crates/kernel/src/boundary.rs new file mode 100644 index 00000000..c0825f2e --- /dev/null +++ b/crates/kernel/src/boundary.rs @@ -0,0 +1,123 @@ +//! Boundary patches: one face through the boundary curves of a sketch, each side meeting the +//! surface it was taken from at a requested continuity (G0 up to G3). +//! +//! Two boundaries are the two sides of a [`crate::bridge`]: the patch is the Hermite surface that +//! leaves each boundary along the direction its frames state and repeats as much of that support +//! surface — its tangent plane, its curvature, the change of that curvature — as the side's order +//! asks for, with `crown` shaping the middle without touching a boundary condition. +//! +//! A patch through *three or four* boundaries is refused rather than built approximately. At a +//! corner two sides prescribe the same entries of the control net from two different surfaces, and +//! a tensor-product patch can hold both only where those two prescriptions already agree (one wall +//! carrying every side, say). Where they do not — the general case — the requested order would +//! silently drop near the corner, or the boundary curve would visibly leave its stations, and a +//! Gregory-type corner (a rational blend of the sides' own data) is needed to hold them instead +//! (issue #763). Everything this module refuses is an error, never a quietly worse surface. + +use solidcraft_geom::Vec3; + +use crate::body::Body; +use crate::bridge::{Continuity, Frame, bridge}; +use crate::{KernelError, Result}; + +/// The most stations a boundary of a patch may carry. +const MAX_SAMPLES: usize = 512; + +/// One boundary of a patch: the stations along it, and how much of the surface it was taken from +/// the patch repeats there. +#[derive(Clone, Debug)] +pub struct Boundary { + /// The stations along the boundary, in the order they run: the end of one boundary meets the + /// start of the next, and the last meets the first. + pub frames: Vec, + /// How much of the neighbouring surface the patch repeats at this boundary. + pub order: Continuity, +} + +/// A two-sided patch: one face that meets boundary `i` at the continuity its `order` asks for (G0 up +/// to G3), with `samples` stations every boundary must carry and `crown` shaping the middle of the +/// patch without touching any boundary condition (0 the plain blend, up to 3 fuller, down to -0.9 +/// flatter). Three or four boundaries are refused: see the module docs. +pub fn boundary_patch(boundaries: &[Boundary], crown: f64, samples: usize) -> Result { + check_input(boundaries, crown, samples)?; + if boundaries.len() > 2 { + return Err(KernelError::Invalid(format!( + "not supported yet: a patch through {} boundaries — a three- or four-sided patch needs a Gregory-type corner (issue #763); \ + give two boundaries, which is the bridge this builds exactly", + boundaries.len() + ))); + } + let (Some(a), Some(b)) = (boundaries.first(), boundaries.get(1)) else { + return Err(KernelError::Invalid("a boundary patch joins 2 boundaries: one of them is missing".into())); + }; + bridge(&a.frames, &b.frames, [a.order, b.order], [crown, crown]) +} + +/// Everything a patch refuses, before any geometry is built. +fn check_input(boundaries: &[Boundary], crown: f64, samples: usize) -> Result<()> { + let n = boundaries.len(); + if !(2..=4).contains(&n) { + return Err(KernelError::Invalid(format!("a boundary patch joins 2 to 4 boundaries, {n} given"))); + } + if !(2..=MAX_SAMPLES).contains(&samples) { + return Err(KernelError::Invalid(format!("a boundary patch needs 2 to {MAX_SAMPLES} stations per boundary, {samples} given"))); + } + if !crown.is_finite() || !(-0.9..=3.0).contains(&crown) { + return Err(KernelError::Invalid("a boundary patch's crown must be between -0.9 and 3".into())); + } + for (i, b) in boundaries.iter().enumerate() { + if b.frames.len() != samples { + return Err(KernelError::Invalid(format!( + "boundary {i} carries {} stations, not the {samples} every boundary of a patch needs", + b.frames.len() + ))); + } + for f in &b.frames { + if ![f.p, f.leave, f.bend, f.bend_change].into_iter().all(Vec3::is_finite) { + return Err(KernelError::Invalid(format!("boundary {i} has a station that is not finite"))); + } + if f.leave.normalized().is_none() { + return Err(KernelError::Invalid(format!("boundary {i} has a station with no leave direction"))); + } + } + if boundary_length(&b.frames) <= 1e-9 { + return Err(KernelError::Invalid(format!("boundary {i} has no length: a patch needs a curve, not a single point"))); + } + } + // Two boundaries are the two sides of a bridge, which do not meet; three or four would run round + // a loop, so each one would have to end where the next one begins. + if n >= 3 { + let mut scale: f64 = 1.0; + for b in boundaries { + scale = scale.max(boundary_length(&b.frames)); + } + let tol = scale * 1e-4 + 1e-9; + for i in 0..n { + let (Some(a), Some(b)) = (boundaries.get(i), boundaries.get((i + 1) % n)) else { continue }; + let (Some(end), Some(start)) = (a.frames.last(), b.frames.first()) else { continue }; + let gap = end.p.dist(start.p); + if gap > tol { + return Err(KernelError::Invalid(format!( + "boundary {i} ends and boundary {} starts {gap:.6} mm apart: the boundaries of a loop must run on into one another", + (i + 1) % n + ))); + } + } + } + Ok(()) +} + +/// The length of a run of stations. +fn boundary_length(frames: &[Frame]) -> f64 { + let mut length: f64 = 0.0; + for w in frames.windows(2) { + if let (Some(a), Some(b)) = (w.first(), w.get(1)) { + length += a.p.dist(b.p); + } + } + length +} + +#[cfg(test)] +#[path = "boundary_tests.rs"] +mod tests; diff --git a/crates/kernel/src/boundary_tests.rs b/crates/kernel/src/boundary_tests.rs new file mode 100644 index 00000000..ce7abfcb --- /dev/null +++ b/crates/kernel/src/boundary_tests.rs @@ -0,0 +1,276 @@ +//! Tests of boundary patches: the bridge this builds is measured back off the face it made — not +//! from the construction — and everything it cannot hold is an error rather than a quiet +//! approximation. + +use super::*; +use crate::body::from_p3; +use truck_modeling::ParametricSurface; + +/// The angle between two vectors, in degrees. +fn angle_deg(a: Vec3, b: Vec3) -> f64 { + (a.normalized().unwrap().dot(b.normalized().unwrap())).clamp(-1.0, 1.0).acos().to_degrees() +} + +/// The geometric shape of a surface curve from its first three derivatives along it: the unit +/// tangent, the curvature vector and the arclength derivative of that curvature vector — the same +/// reading `bridge` states its conditions with. +fn shape_of(d1: Vec3, d2: Vec3, d3: Vec3) -> (Vec3, Vec3, Vec3) { + let sigma = d1.len(); + let t = d1 * (1.0 / sigma); + let tp = d2 * (1.0 / sigma) - d1 * (d1.dot(d2) / (sigma * sigma * sigma)); + let nn = d2 - t * d2.dot(t); + let np = d3 - t * d3.dot(t) - tp * d2.dot(t) - t * d2.dot(tp); + let kappa = np * (sigma * sigma) - nn * (2.0 * d1.dot(d2)); + (t, nn * (1.0 / (sigma * sigma)), kappa * (1.0 / (sigma.powi(5)))) +} + +/// Across a boundary: five samples a step `h` apart, `into` the patch from the parameter `(u, v)`, +/// read back as the position, the unit tangent, the curvature vector and the change of curvature +/// along that inward direction. +fn across(body: &Body, uv: (f64, f64), into: (f64, f64), h: f64) -> (Vec3, Vec3, Vec3, Vec3) { + let face = body.solid.face_iter().next().unwrap(); + let surf = face.surface(); + let q: Vec = (0..5).map(|k| from_p3(surf.subs(uv.0 + k as f64 * h * into.0, uv.1 + k as f64 * h * into.1))).collect(); + let (f0, f1, f2, f3, f4) = (q[0], q[1], q[2], q[3], q[4]); + let d1 = (f0 * -25.0 + f1 * 48.0 + f2 * -36.0 + f3 * 16.0 + f4 * -3.0) * (1.0 / (12.0 * h)); + let d2 = (f0 * 35.0 + f1 * -104.0 + f2 * 114.0 + f3 * -56.0 + f4 * 11.0) * (1.0 / (12.0 * h * h)); + let d3 = (f0 * -5.0 + f1 * 18.0 + f2 * -24.0 + f3 * 14.0 + f4 * -3.0) * (1.0 / (2.0 * h * h * h)); + let (t, bend, change) = shape_of(d1, d2, d3); + (f0, t, bend, change) +} + +/// The stations' parameters: `n` of them, evenly spread over the patch. +fn stations(n: usize) -> Vec { + (0..n).map(|i| i as f64 / (n - 1) as f64).collect() +} + +/// The normal angle a side may be off by. +const ANGLE_TOL: f64 = 0.01; +/// How much of the supporting wall's own curvature a side must repeat, relative to it. +const CURV_TOL: f64 = 1e-3; +/// The normal part of the change of curvature a G3 side may leave over, relative to 1/r² (the +/// finite differences that read the third derivative off the face amplify round-off by 1/h³, so +/// this is a noise floor rather than a geometric tolerance). +const CHANGE_TOL: f64 = 1e-4; + +/// Measure one side of a built patch at every station of `frames`, and check what its order asks +/// for: the boundary curve itself always, the tangent plane from G1 on, the curvature vector from +/// G2 on and its change along the leave direction at G3. +fn check_side(body: &Body, frames: &[Frame], order: Continuity, at: impl Fn(usize) -> ((f64, f64), (f64, f64)), r: f64) { + for (i, f) in frames.iter().enumerate() { + let (uv, into) = at(i); + let (p, t, bend, change) = across(body, uv, into, 1e-3); + let gap = p.dist(f.p); + assert!(gap < 1e-9, "station {i} sits on its boundary: {p:?} vs {:?} ({gap:.2e} mm)", f.p); + if order == Continuity::G0 { + continue; + } + assert!(angle_deg(t, f.leave) < ANGLE_TOL, "station {i} leaves along the tangent: {t:?} vs {:?}", f.leave); + if order == Continuity::G1 { + continue; + } + if f.bend.len() > 1e-9 { + assert!(bend.dist(f.bend) / f.bend.len() < CURV_TOL, "station {i}: curvature {bend:?} vs the wall's {:?}", f.bend); + if order == Continuity::G3 { + let normal = f.bend * (1.0 / f.bend.len()); + assert!(change.dot(normal).abs() < CHANGE_TOL / (r * r), "station {i}: the change of curvature has a normal part {change:?}"); + } + } else { + assert!(bend.len() < CURV_TOL / r, "station {i}: the wall is straight here, the patch curves by {bend:?}"); + if order == Continuity::G3 { + assert!(change.len() < CHANGE_TOL / (r * r), "station {i}: a straight cross-section changes curvature by {change:?}"); + } + } + } +} + +/// Two walls 20 mm apart, each leaving towards the other, both walls of the same cylinder of radius +/// `r` (the valley `bridge` is tested with): the two sides of a two-sided patch. +fn two_walls(n: usize, r: f64) -> (Vec, Vec) { + let mut a = Vec::new(); + let mut b = Vec::new(); + for t in stations(n) { + let y = 20.0 * t; + a.push(Frame { + p: Vec3::new(0.0, y, 0.0), + leave: Vec3::new(0.0, 1.0, 0.0), + bend: Vec3::new(0.0, 0.0, 1.0 / r), + bend_change: Vec3::new(0.0, -1.0 / (r * r), 0.0), + }); + b.push(Frame { + p: Vec3::new(0.0, y + 20.0, 0.0), + leave: Vec3::new(0.0, -1.0, 0.0), + bend: Vec3::new(0.0, 0.0, 1.0 / r), + bend_change: Vec3::new(0.0, 1.0 / (r * r), 0.0), + }); + } + (a, b) +} + +#[test] +fn a_two_sided_patch_is_a_bridge_that_holds_both_ends() { + let n = 9; + let r = 10.0; + let (a, b) = two_walls(n, r); + let boundaries = vec![Boundary { frames: a.clone(), order: Continuity::G2 }, Boundary { frames: b.clone(), order: Continuity::G2 }]; + let body = boundary_patch(&boundaries, 0.0, n).unwrap(); + let s = stations(n); + check_side(&body, &a, Continuity::G2, |i| ((s[i], 0.0), (0.0, 1.0)), r); + check_side(&body, &b, Continuity::G2, |i| ((s[i], 1.0), (0.0, -1.0)), r); +} + +/// Four chained sides round a 20 × 20 square in the XY plane, each leaving into the square: the +/// loop a patch through three or four boundaries would have to close. +fn square_loop(n: usize) -> Vec { + let corners = [(0.0_f64, 0.0_f64), (20.0, 0.0), (20.0, 20.0), (0.0, 20.0)]; + let leaves = [Vec3::new(0.0, 1.0, 0.0), Vec3::new(-1.0, 0.0, 0.0), Vec3::new(0.0, -1.0, 0.0), Vec3::new(1.0, 0.0, 0.0)]; + (0..4) + .map(|side| { + let (a, b) = (corners[side], corners[(side + 1) % 4]); + let frames = stations(n) + .into_iter() + .map(|t| Frame { + p: Vec3::new(a.0 + (b.0 - a.0) * t, a.1 + (b.1 - a.1) * t, 0.0), + leave: leaves[side], + bend: Vec3::ZERO, + bend_change: Vec3::ZERO, + }) + .collect(); + Boundary { frames, order: Continuity::G2 } + }) + .collect() +} + +#[test] +fn a_two_sided_patch_meets_its_walls_up_to_the_curvature() { + let n = 11; + let r = 10.0; + let (a, b) = two_walls(n, r); + // G0, G1 and G2 are what this patch states: position, tangent plane and curvature across each + // boundary. (A G3 bridge's third-order rows are `bridge`'s own subject, measured in its tests.) + for order in [Continuity::G0, Continuity::G1, Continuity::G2] { + let boundaries = vec![Boundary { frames: a.clone(), order }, Boundary { frames: b.clone(), order }]; + let body = boundary_patch(&boundaries, 0.0, n).unwrap(); + let s = stations(n); + if order == Continuity::G0 { + for (i, f) in a.iter().enumerate() { + let (p, _, _, _) = across(&body, (s[i], 0.0), (0.0, 1.0), 1e-3); + assert!(p.dist(f.p) < 1e-9, "station {i}: {p:?} vs {:?}", f.p); + } + continue; + } + check_side(&body, &a, order, |i| ((s[i], 0.0), (0.0, 1.0)), r); + check_side(&body, &b, order, |i| ((s[i], 1.0), (0.0, -1.0)), r); + } +} + +#[test] +fn a_crown_shapes_the_middle_without_touching_the_boundary_rows() { + let n = 9; + let r = 10.0; + let (a, b) = two_walls(n, r); + let boundaries = vec![Boundary { frames: a.clone(), order: Continuity::G2 }, Boundary { frames: b.clone(), order: Continuity::G2 }]; + let s = stations(n); + let mut middles = Vec::new(); + for crown in [-0.5, 0.0, 1.0, 2.0] { + let body = boundary_patch(&boundaries, crown, n).unwrap(); + let grid = crate::bridge::sample_grid(&body, 9, 9).unwrap(); + middles.push(grid[4][4].z); + // The interior is the cross-section between the two walls: its middle sits in the gap, not + // outside it, and it stays finite everywhere on the grid. + for row in &grid { + for p in row { + assert!(p.is_finite() && (-2.0..=42.0).contains(&p.y), "the interior stays between the walls: {p:?}"); + } + } + assert!((18.0..=22.0).contains(&grid[4][4].y), "the middle of the patch sits midway in the 20 mm band: {:?}", grid[4][4]); + // The conditions are untouched: the same boundary points, tangent and curvature. + check_side(&body, &a, Continuity::G2, |i| ((s[i], 0.0), (0.0, 1.0)), r); + check_side(&body, &b, Continuity::G2, |i| ((s[i], 1.0), (0.0, -1.0)), r); + } + let steps: Vec = middles.windows(2).map(|w| w[1] - w[0]).collect(); + assert!(steps.iter().all(|d| d.abs() > 1e-9), "a fuller crown moves the middle: {middles:?}"); +} + +#[test] +fn the_patch_refuses_what_it_cannot_hold() { + let n = 9; + let (a, b) = two_walls(n, 10.0); + let two = vec![Boundary { frames: a.clone(), order: Continuity::G2 }, Boundary { frames: b.clone(), order: Continuity::G2 }]; + // Not 2 to 4 boundaries. + assert!(boundary_patch(&[], 0.0, n).is_err()); + assert!(boundary_patch(&two[..1], 0.0, n).is_err()); + let five = vec![two[0].clone(), two[1].clone(), two[0].clone(), two[1].clone(), two[0].clone()]; + assert!(boundary_patch(&five, 0.0, n).is_err()); + // Three or four sides are refused: a tensor-product patch cannot hold two sides' data at a + // corner, which needs a Gregory-type corner (issue #763). The message says so. + let square = square_loop(n); + let e = boundary_patch(&square, 0.0, n).unwrap_err().to_string(); + assert!(e.contains("not supported yet") && e.contains("#763"), "4 sides: {e}"); + // Three sides that do close: a triangle, whose last side runs from the second one's end back to + // the first one's start. + let triangle: Vec = vec![ + square[0].clone(), + square[1].clone(), + Boundary { + frames: stations(n) + .into_iter() + .map(|t| Frame { + p: Vec3::new(20.0 * (1.0 - t), 20.0 * (1.0 - t), 0.0), + leave: Vec3::new(-std::f64::consts::FRAC_1_SQRT_2, -std::f64::consts::FRAC_1_SQRT_2, 0.0), + bend: Vec3::ZERO, + bend_change: Vec3::ZERO, + }) + .collect(), + order: Continuity::G2, + }, + ]; + let e = boundary_patch(&triangle, 0.0, n).unwrap_err().to_string(); + assert!(e.contains("not supported yet") && e.contains("#763"), "3 sides: {e}"); + // A loop whose sides do not even meet is refused earlier and for its own reason. + let broken = square_loop(n); + let mut moved = broken[1].frames.clone(); + moved[0] = Frame { p: Vec3::new(30.0, 0.0, 0.0), ..moved[0] }; + let broken = vec![broken[0].clone(), Boundary { frames: moved, order: Continuity::G2 }, broken[2].clone()]; + let e = boundary_patch(&broken, 0.0, n).unwrap_err().to_string(); + assert!(e.contains("run on into one another"), "{e}"); + // The stations and the crown. + let short = vec![Boundary { frames: a[..n - 1].to_vec(), order: Continuity::G2 }, two[1].clone()]; + assert!(boundary_patch(&short, 0.0, n).is_err(), "a boundary with the wrong number of stations"); + assert!(boundary_patch(&two, 0.0, n - 1).is_err()); + assert!(boundary_patch(&two, 0.0, 1).is_err()); + for crown in [-1.5, 3.5, f64::NAN, f64::INFINITY] { + assert!(boundary_patch(&two, crown, n).is_err(), "crown {crown}"); + } + // A station that is not finite, and a station with no leave direction. + for field in 0..4 { + let mut bad = two.clone(); + let mut frames = bad[0].frames.clone(); + frames[3] = match field { + 0 => Frame { p: Vec3::new(f64::NAN, 0.0, 0.0), ..frames[3] }, + 1 => Frame { leave: Vec3::new(f64::NAN, 0.0, 0.0), ..frames[3] }, + 2 => Frame { bend: Vec3::new(f64::INFINITY, 0.0, 0.0), ..frames[3] }, + _ => Frame { bend_change: Vec3::new(f64::NAN, 0.0, 0.0), ..frames[3] }, + }; + if let Some(b) = bad.first_mut() { + b.frames = frames; + } + assert!(boundary_patch(&bad, 0.0, n).is_err(), "a station that is not finite: field {field}"); + } + let mut flat = two.clone(); + if let Some(b) = flat.first_mut() { + b.frames = vec![Frame { p: Vec3::new(0.0, 1.0, 0.0), leave: Vec3::ZERO, bend: Vec3::ZERO, bend_change: Vec3::ZERO }; n]; + } + assert!(boundary_patch(&flat, 0.0, n).is_err(), "a station with no leave direction"); + let point = vec![ + Boundary { + frames: vec![Frame { p: Vec3::new(1.0, 1.0, 1.0), leave: Vec3::X, bend: Vec3::ZERO, bend_change: Vec3::ZERO }; n], + order: Continuity::G1, + }, + Boundary { + frames: vec![Frame { p: Vec3::new(1.0, 1.0, 1.0), leave: Vec3::X, bend: Vec3::ZERO, bend_change: Vec3::ZERO }; n], + order: Continuity::G1, + }, + ]; + assert!(boundary_patch(&point, 0.0, n).is_err(), "a boundary with no length"); +} diff --git a/crates/kernel/src/fair.rs b/crates/kernel/src/fair.rs new file mode 100644 index 00000000..d8b4a0bb --- /dev/null +++ b/crates/kernel/src/fair.rs @@ -0,0 +1,1538 @@ +//! Fairing the control points of a B-spline curve or surface: moving the interior control +//! vertices to the least-bending shape while the ends, or the boundary rows, stay exactly where +//! the design put them. +//! +//! The fairness energy is the thin-plate (curvature-variation) energy of the *geometry* the +//! control net describes, in the net's own parameter directions: +//! +//! - a curve: `E = ∫‖C″(t)‖² dt`, +//! - a surface: `E = ∫∫ ‖S_uu‖² + 2‖S_uv‖² + ‖S_vv‖² du dv`. +//! +//! A plane has energy zero and anything else pays for how much it bends, which is what a +//! designer means by "fair". Both energies are quadratic in the control points, `E(P) = Pᵀ·G·P`, +//! with `G` the Gram matrix of the basis functions' derivatives (`Gᵢⱼ = ∫Nᵢ″Nⱼ″ dt`, and the +//! tensor products of the one-direction Gram matrices for a surface). Each one-direction Gram is +//! integrated span by span with four-point Gauss–Legendre, exact to degree 7 — a cubic's second +//! derivative products are quadratic, so the cubic curves and bicubic faces fairing meets in +//! practice are integrated exactly. +//! +//! One fairing step is then a constrained least-squares solve: hold the boundary control points, +//! take the exact minimiser of `E` over the interior (for a quadratic that is one Newton step, +//! `G_ff·d = −(G·P)_f`), and apply a fraction `strength` of it, so `strength = 1` is the full +//! solution and a smaller value walks towards it. With the exact step the energy falls by +//! `q·s·(1 − s)` for `q ≥ 0`, so a run at any strength decreases it strictly until it converges. +//! `G_ff` does not change as the control points move, so it is factorised once, by banded +//! Cholesky, and every further step is a matrix–vector product and a triangular solve. +//! +//! Two guarantees are built in rather than checked afterwards: +//! +//! - **The boundary never moves.** The result starts as a copy of the input and only interior +//! entries are written, so a held control point is bit-identical to the one the design gave. +//! - **The geometry cannot jump.** A B-spline lies in the convex hull of its control points +//! (NURBS Book §3.1; with the weights unchanged the rational basis functions are still +//! non-negative and sum to one), so the geometry moves at most as far as the farthest control +//! point. Every step is clamped so that no control point leaves the ball of radius +//! `tolerance` about where it started: the faired curve or surface is then within `tolerance` +//! of the input at the same parameters, by a bound rather than by measurement. A step that +//! would not lower the energy is halved and, if it still would not, the run stops — it never +//! loops for ever and never moves the design further than the caller allowed. +//! +//! Everything is checked before it is used: degrees, knot vectors and counts must be consistent, +//! the control points finite, `strength ∈ (0, 1]`, `iterations` in `1…`[`MAX_FAIR_ITERATIONS`] and +//! `tolerance > 0`. A singular system — fewer than two interior control points, or an interior +//! control point that does not change the geometry at all — is reported as an error and the +//! geometry is left alone. + +use solidcraft_geom::Vec3; +use solidcraft_geom::bspline::{HPoint, MAX_SPLINE_DEGREE, NurbsSurface, Side, SplineError, check_knots, local_basis}; +use truck_modeling as mt; + +use crate::body::Body; +use crate::history::Change; +use crate::{KernelError, Result, guard}; + +/// Most steps one fairing run takes (see [`FairOptions::iterations`]). +pub const MAX_FAIR_ITERATIONS: usize = 1000; +/// Most control points one fairing run accepts (a 64 × 64 net): plenty for any face's control +/// net, and small enough that a step stays cheap whatever a design file contains. +pub const MAX_FAIR_POINTS: usize = 4096; +/// Most entries of the banded system (2²¹ doubles, 16 MB). +const MAX_FAIR_BAND: usize = 1 << 21; +/// The fairness energy of a curve, as a one-direction net: the `(order in u, order in v, weight)` +/// term list of `∫∫ (∂S)²`. +const CURVE_ENERGY: [(usize, usize, f64); 1] = [(2, 0, 1.0)]; +/// The thin-plate energy of a surface: `‖S_uu‖² + 2‖S_uv‖² + ‖S_vv‖²` — the classic +/// curvature-variation energy, zero on a plane and the same if u and v are swapped. +const SURFACE_ENERGY: [(usize, usize, f64); 3] = [(2, 0, 1.0), (1, 1, 2.0), (0, 2, 1.0)]; +/// Four-point Gauss–Legendre nodes and weights on `[−1, 1]` (exact to degree 7). +const GAUSS4: [(f64, f64); 4] = [ + (-0.861_136_311_594_052_6, 0.347_854_845_137_453_8), + (-0.339_981_043_584_856_3, 0.652_145_154_862_546_2), + (0.339_981_043_584_856_3, 0.652_145_154_862_546_2), + (0.861_136_311_594_052_6, 0.347_854_845_137_453_8), +]; +/// The second direction of a curve seen as a control net: one basis function of degree 0 over +/// `[0, 1]`, whose Gram entry is exactly `∫1 dt = 1`, so the net's energy is the curve's own +/// energy unchanged. +const TRIVIAL_KNOTS: [f64; 2] = [0.0, 1.0]; +/// How often a step is halved before the run calls the point converged. +const MAX_HALVINGS: u32 = 40; +/// A step smaller than this fraction of the full Newton step is not worth taking. +const MIN_STEP: f64 = 1e-12; +/// Steps are clamped this far inside the tolerance, so rounding cannot push a control point +/// past it. +const TOLERANCE_SLACK: f64 = 1.0 - 1e-12; + +/// How a fairing run is asked to behave. +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct FairOptions { + /// The fraction of each energy step to apply, `0 < strength ≤ 1`: `1` is the full least + /// squares solution (the exact minimiser of the energy at the held boundary), a smaller + /// value takes that fraction of the way there. The energy falls at every step either way. + pub strength: f64, + /// How many steps at most, one to [`MAX_FAIR_ITERATIONS`]. + pub iterations: usize, + /// Hold the layer of control points next to the boundary as well as the boundary itself (two + /// layers held at each end). For a clamped knot vector the boundary row fixes the position + /// along the edge and the row next to it fixes the derivative across the edge, so with this + /// set the boundary keeps the position and the tangent the design gave it. + pub keep_edges: bool, + /// The farthest a control point may move from where the design put it, in mm. The geometry + /// then stays within this distance of the input at the same parameters (see the module + /// docs), so a fairing run can never make a design jump. + pub tolerance: f64, +} + +impl FairOptions { + /// Checked options for one fairing run: an error, never a panic, for a strength outside + /// `(0, 1]`, zero iterations, more than [`MAX_FAIR_ITERATIONS`] of them, or a tolerance that + /// is not a positive finite number. + pub fn new(strength: f64, iterations: usize, keep_edges: bool, tolerance: f64) -> Result { + FairOptions { strength, iterations, keep_edges, tolerance }.checked() + } + + /// The same checks as [`FairOptions::new`], for options built field by field. + pub fn checked(self) -> Result { + if !(self.strength.is_finite() && self.strength > 0.0 && self.strength <= 1.0) { + return Err(KernelError::Invalid(format!("the fairing strength {} must be greater than 0 and at most 1", self.strength))); + } + if self.iterations == 0 || self.iterations > MAX_FAIR_ITERATIONS { + return Err(KernelError::Invalid(format!("{} fairing iterations (1 to {MAX_FAIR_ITERATIONS})", self.iterations))); + } + if !(self.tolerance.is_finite() && self.tolerance > 0.0) { + return Err(KernelError::Invalid(format!("the fairing tolerance {} must be a positive number of mm", self.tolerance))); + } + Ok(self) + } +} + +impl Default for FairOptions { + /// One full step with the boundary held, at most 1 mm of movement: the defaults a command can + /// start from before a user picks their own. + fn default() -> Self { + FairOptions { strength: 1.0, iterations: 1, keep_edges: false, tolerance: 1.0 } + } +} + +/// What a fairing run did: the energy before and after, how many steps were applied, how far the +/// control points moved and the energy after every applied step. The energy is a sum of squares, +/// so where rounding leaves it a hair below zero the true value is zero: it is reported as zero. +#[derive(Clone, Debug, PartialEq)] +pub struct FairReport { + /// The fairness energy of the input, in the parameter units of the net's own knots. + pub energy_before: f64, + /// The fairness energy of the result: never more than `energy_before`, and equal to it only + /// when no step could lower it. + pub energy_after: f64, + /// How many steps were applied (at most the requested `iterations`). + pub steps: usize, + /// The farthest any control point moved from where the design put it, in mm. It bounds how + /// far the geometry moved from the input (see the module docs) and never exceeds the + /// requested tolerance. + pub movement: f64, + /// The energy after each applied step, the last equal to `energy_after`: it never rises, and + /// falls strictly at every step until the run reaches the rounding of its own arithmetic. + pub energy_trace: Vec, +} + +/// A faired B-spline curve: the input's degree and knots, the moved control points and the run's +/// report. +#[derive(Clone, Debug, PartialEq)] +pub struct FairCurve { + pub degree: usize, + pub knots: Vec, + /// The faired control points; the ends (and, with `keep_edges`, the points next to them) are + /// bit-identical to the input. + pub ctrl: Vec<[f64; N]>, + pub report: FairReport, +} + +/// A faired B-spline control net: the input's degrees, knots and counts, the moved control points +/// (u fastest) and the run's report. +#[derive(Clone, Debug, PartialEq)] +pub struct FairNet { + pub degree: [usize; 2], + pub knots: [Vec; 2], + pub count: [usize; 2], + /// The faired control points, u fastest; the held boundary layers are bit-identical to the + /// input. + pub ctrl: Vec<[f64; N]>, + pub report: FairReport, +} + +/// A geom spline error as the kernel's. +fn spline_error(what: &str, e: SplineError) -> KernelError { + match e { + SplineError::TooLarge(m) => KernelError::TooLarge(format!("{what}: {m}")), + other => KernelError::Invalid(format!("{what}: {other}")), + } +} + +/// The dot product of two control points' coordinate vectors. +fn dot(a: &[f64; N], b: &[f64; N]) -> f64 { + a.iter().zip(b).map(|(x, y)| x * y).sum() +} + +/// The distance between two control points. +fn dist(a: &[f64; N], b: &[f64; N]) -> f64 { + let d: [f64; N] = std::array::from_fn(|c| a[c] - b[c]); + dot(&d, &d).sqrt() +} + +/// The Gram matrices of one parameter direction, stored banded: entry `r` is +/// `∫ Nᵢ^{(r)}(t)·Nₖ^{(r)}(t) dt` over the direction's domain, and since a basis function +/// overlaps only its `degree` neighbours an entry is non-zero only for `|i − k| ≤ degree`, so +/// the whole thing is `count·(degree + 1)` numbers per order. +struct Gram { + count: usize, + bw: usize, + g: [Vec; 3], +} + +impl Gram { + /// The Gram matrices of `count` basis functions of `degree` over `knots`, for orders 0, 1 and + /// 2 — the derivatives a thin-plate energy is built from. + fn new(degree: usize, knots: &[f64], count: usize) -> Result { + let bw = degree; + let mut g: [Vec; 3] = std::array::from_fn(|_| vec![0.0; count * (bw + 1)]); + // On the span `[knots[s], knots[s + 1])` only the basis functions `i ∈ [s − degree, s]` + // are non-zero. The quadrature nodes lie strictly inside the span, so either one-sided + // limit gives the same value there. + let mut ders = [[0.0f64; 3]; MAX_SPLINE_DEGREE + 1]; + for s in degree..count { + let (Some(&a), Some(&b)) = (knots.get(s), knots.get(s + 1)) else { continue }; + if !(b > a) { + continue; + } + for &(x, w) in GAUSS4.iter() { + let t = 0.5 * (a + b) + 0.5 * (b - a) * x; + let first = s - degree; + let mut live = 0usize; + for i in first..=s { + let Some(local) = knots.get(i..=i + degree + 1) else { break }; + let d = local_basis(local, t, Side::Right, 2); + if let Some(slot) = ders.get_mut(live) { + for (o, v) in slot.iter_mut().zip(d.iter()) { + *o = *v; + } + } + live += 1; + } + let weight = 0.5 * (b - a) * w; + let value = |rel: usize, r: usize| ders.get(rel).and_then(|d| d.get(r)).copied().unwrap_or(0.0); + // The upper triangle only — the band holds one copy of a symmetric entry — and at + // the basis functions' own indices, not their places in this span. + for i in 0..live { + for k in i..live { + let (row, off) = (first + i, k - i); + for (r, gg) in g.iter_mut().enumerate() { + if let Some(slot) = gg.get_mut(row * (bw + 1) + off) { + *slot += weight * value(i, r) * value(k, r); + } + } + } + } + } + } + if g.iter().flatten().any(|v| !v.is_finite()) { + return Err(KernelError::Invalid("the fairness energy of this net is not a finite number".into())); + } + Ok(Gram { count, bw, g }) + } + + /// `∫ Nᵢ^{(r)} Nₖ^{(r)} dt`, zero outside the band or off the end of the basis. + fn at(&self, r: usize, i: usize, k: usize) -> f64 { + let Some(m) = self.g.get(r) else { return 0.0 }; + let (row, off) = if i <= k { (i, k - i) } else { (k, i - k) }; + if off > self.bw || row >= self.count { + return 0.0; + } + m.get(row * (self.bw + 1) + off).copied().unwrap_or(0.0) + } +} + +/// A control net to fair: a tensor-product B-spline with the terms of its fairness energy. A +/// direction of one control point (degree 0, knots `[0, 1]`) makes the net a curve, whose energy +/// is the one-direction [`CURVE_ENERGY`]. +struct Net { + degree: [usize; 2], + count: [usize; 2], + /// The number of control points, `count[0] · count[1]`. + total: usize, + gram: [Gram; 2], + terms: &'static [(usize, usize, f64)], +} + +impl Net { + /// Check the degrees, knots and counts and build the Gram matrices: an error, never a panic, + /// for a degree above [`MAX_SPLINE_DEGREE`], too few control points for the degree, a knot + /// vector of the wrong length, unusable knots or an empty parameter range. + fn new(degree: [usize; 2], knots: [Vec; 2], count: [usize; 2], terms: &'static [(usize, usize, f64)]) -> Result { + let Some(total) = count[0].checked_mul(count[1]).filter(|&n| n <= MAX_FAIR_POINTS) else { + return Err(KernelError::TooLarge(format!("fairing {} × {} control points (at most {MAX_FAIR_POINTS} in all)", count[0], count[1]))); + }; + for d in 0..2 { + let (p, c, kn) = (degree[d], count[d], &knots[d]); + if p > MAX_SPLINE_DEGREE { + return Err(KernelError::TooLarge(format!("fairing a spline of degree {p} (at most {MAX_SPLINE_DEGREE})"))); + } + if c <= p { + return Err(KernelError::Invalid(format!("{c} control points is too few across one direction of a spline of degree {p}"))); + } + if kn.len() != c + p + 1 { + return Err(KernelError::Invalid(format!( + "{} knots across one direction, expected {} for {c} control points of degree {p}", + kn.len(), + c + p + 1 + ))); + } + check_knots(kn).map_err(|e| spline_error("fairing", e))?; + let (lo, hi) = (kn.get(p).copied().unwrap_or(f64::NAN), kn.get(c).copied().unwrap_or(f64::NAN)); + if !(lo < hi) { + return Err(KernelError::Invalid("the fairing's parameter range is empty".into())); + } + } + if terms.iter().any(|&(ru, rv, w)| ru > degree[0] || rv > degree[1] || !(w.is_finite() && w >= 0.0)) { + return Err(KernelError::Invalid("a fairness term does not fit the net's degrees".into())); + } + let gram = [Gram::new(degree[0], &knots[0], count[0])?, Gram::new(degree[1], &knots[1], count[1])?]; + Ok(Net { degree, count, total, gram, terms }) + } + + /// The index of control point `(i, j)` in the flattened net (u fastest). + fn index(&self, i: usize, j: usize) -> usize { + j * self.count[0] + i + } + + /// The fairness energy `Pᵀ·G·P` of the net `ctrl` (u fastest) and, in `grad`, `G·P`. One + /// banded sweep gives both, since `E = Σ Pₚ·(G·P)ₚ`. + fn energy_gradient(&self, ctrl: &[[f64; N]], grad: &mut [[f64; N]]) -> f64 { + let [cu, cv] = self.count; + let (pu, pv) = (self.degree[0], self.degree[1]); + let mut energy = 0.0; + for j in 0..cv { + for i in 0..cu { + let mut acc = [0.0f64; N]; + for &(ru, rv, w) in self.terms { + for l in j.saturating_sub(pv)..=(j + pv).min(cv - 1) { + for k in i.saturating_sub(pu)..=(i + pu).min(cu - 1) { + let a = w * self.gram[0].at(ru, i, k) * self.gram[1].at(rv, j, l); + if a == 0.0 { + continue; + } + if let Some(p) = ctrl.get(self.index(k, l)) { + for (x, v) in acc.iter_mut().zip(p) { + *x += a * v; + } + } + } + } + } + let at = self.index(i, j); + if let Some(c) = ctrl.get(at) { + energy += dot(c, &acc); + } + if let Some(g) = grad.get_mut(at) { + *g = acc; + } + } + } + energy + } + + /// The energy matrix `G` over the interior control points, banded and already factorised (the + /// matrix does not change as the control points move, so one factorisation serves every + /// step). In the u-fastest order two unknowns couple within `degree_u + degree_v · cols`: + /// `degree_u` along a row, `degree_v` rows apart. + fn system(&self, interior: &Interior) -> Result { + let [cu, cv] = self.count; + let (pu, pv) = (self.degree[0], self.degree[1]); + let rows = if cv > 1 { interior.rows.saturating_sub(1).min(pv) } else { 0 }; + let mut band = Band::new(interior.points.len(), pu + rows * interior.cols)?; + for (r, &at) in interior.points.iter().enumerate() { + let (i, j) = (at % cu, at / cu); + for &(ru, rv, w) in self.terms { + for l in j.saturating_sub(pv)..=(j + pv).min(cv - 1) { + for k in i.saturating_sub(pu)..=(i + pu).min(cu - 1) { + let Some(s) = interior.slot.get(self.index(k, l)).copied().flatten() else { continue }; + band.add(r, s, w * self.gram[0].at(ru, i, k) * self.gram[1].at(rv, j, l)); + } + } + } + } + band.factorised() + } + + /// Fair `ctrl` (u fastest) with checked `opts`: see the module docs. The result is the input + /// with the interior control points moved; the held ones are bit-identical. + fn fair(&self, ctrl: &[[f64; N]], opts: &FairOptions) -> Result<(Vec<[f64; N]>, FairReport)> { + if ctrl.len() != self.total { + return Err(KernelError::Invalid(format!("{} control points, expected {}", ctrl.len(), self.total))); + } + if ctrl.iter().flatten().any(|x| !x.is_finite()) { + return Err(KernelError::Invalid("a control point is not a finite number".into())); + } + let interior = Interior::new(self, if opts.keep_edges { 2 } else { 1 })?; + let system = self.system(&interior)?; + let mut current: Vec<[f64; N]> = ctrl.to_vec(); + let mut grad = vec![[0.0; N]; self.total]; + let energy_before = self.energy_gradient(¤t, &mut grad); + if !energy_before.is_finite() { + return Err(KernelError::Invalid("the fairness energy of this net is not a finite number".into())); + } + // The energy is a sum of squares, so where rounding leaves it a hair below zero the true + // value is zero: report it that way rather than as a negative number. + let energy_before = energy_before.max(0.0); + // How big the net itself is, for telling a fairing step from rounding (see below). + let size = interior.size(ctrl); + let mut step = vec![[0.0; N]; interior.points.len()]; + let mut b = vec![0.0; interior.points.len()]; + let mut report = FairReport { energy_before, energy_after: energy_before, steps: 0, movement: 0.0, energy_trace: Vec::new() }; + for _ in 0..opts.iterations { + let e_now = self.energy_gradient(¤t, &mut grad); + if !e_now.is_finite() { + break; + } + // The exact minimiser over the interior is the Newton step `G_ff·d = −(G·P)_f`; the + // system is per coordinate, all three sharing the one factorisation. + for c in 0..N { + for (slot, &at) in interior.points.iter().enumerate() { + b[slot] = -grad.get(at).and_then(|g| g.get(c)).copied().unwrap_or(0.0); + } + system.solve(&mut b)?; + for (slot, v) in b.iter().enumerate() { + if let Some(d) = step.get_mut(slot).and_then(|d| d.get_mut(c)) { + *d = *v; + } + } + } + if step.iter().flatten().all(|&x| x == 0.0) { + break; + } + // The largest fraction of the step that keeps every control point within the + // tolerance of where the design put it, and never more than the whole step. + let mut s = opts.strength.min(interior.limit(ctrl, ¤t, &step, opts.tolerance)); + if !(s > 0.0) { + break; + } + // A step this much shorter than the net's own size cannot be told from the rounding + // of the arithmetic that found it: the net is as fair as it gets. + let longest = step.iter().flatten().fold(0.0f64, |m, x| m.max(x.abs())); + if s * longest <= MIN_STEP * size { + break; + } + let mut taken = false; + for _ in 0..MAX_HALVINGS { + let candidate = interior.apply(¤t, &step, s); + let e = self.energy_gradient(&candidate, &mut grad); + if e < e_now { + current = candidate; + report.steps += 1; + report.energy_trace.push(e.max(0.0)); + taken = true; + break; + } + // The step did not lower the energy: halve it and try again, and when even a hair + // of a step will not, this is as fair as the net gets. + s *= 0.5; + if s <= MIN_STEP { + break; + } + } + if !taken { + break; + } + } + report.energy_after = report.energy_trace.last().copied().unwrap_or(energy_before); + report.movement = interior.movement(ctrl, ¤t); + Ok((current, report)) + } +} + +/// Which control points a fairing run may move, and where each sits in the banded system. +struct Interior { + /// The flattened index (u fastest) of interior point number `k`. + points: Vec, + /// The interior number of each flattened index, `None` where the point is held. + slot: Vec>, + /// How many control points across u (`cols`) and across v (`rows`) are interior. + cols: usize, + rows: usize, +} + +impl Interior { + /// The interior of `net` with `keep` layers held at each end of each direction (1 without + /// [`FairOptions::keep_edges`], 2 with it). + fn new(net: &Net, keep: usize) -> Result { + let [cu, cv] = net.count; + let (i0, i1) = free_span(cu, keep)?; + let (j0, j1) = free_span(cv, keep)?; + let (cols, rows) = (i1 - i0, j1 - j0); + let mut points = Vec::with_capacity(cols * rows); + let mut slot = vec![None; net.total]; + for j in j0..j1 { + for i in i0..i1 { + if let Some(s) = slot.get_mut(net.index(i, j)) { + *s = Some(points.len()); + } + points.push(net.index(i, j)); + } + } + if points.len() < 2 { + return Err(KernelError::Invalid(format!( + "fairing needs at least two interior control points; this {cu} × {cv} net has {}", + points.len() + ))); + } + Ok(Interior { points, slot, cols, rows }) + } + + /// `current` with `s` times the step `d` added to the interior control points; the held ones + /// are copied as they are, bit for bit. + fn apply(&self, current: &[[f64; N]], d: &[[f64; N]], s: f64) -> Vec<[f64; N]> { + let mut out = current.to_vec(); + for (slot, &at) in self.points.iter().enumerate() { + let (Some(p), Some(v)) = (out.get_mut(at), d.get(slot)) else { continue }; + for (x, dx) in p.iter_mut().zip(v) { + *x += s * dx; + } + } + out + } + + /// How big the interior is: the farthest interior control point from the first one, in mm. + /// A fairing step far below this belongs to the rounding of the arithmetic, not the design. + fn size(&self, ctrl: &[[f64; N]]) -> f64 { + let Some(first) = self.points.first().and_then(|&at| ctrl.get(at)) else { return 0.0 }; + self.points.iter().fold(0.0f64, |m, &at| ctrl.get(at).map_or(m, |p| m.max(dist(first, p)))) + } + + /// The largest fraction `s ≤ 1` of the step `d` that keeps every interior control point + /// within `tolerance` of where the design put it (`input`). The movement is `‖Δ + s·d‖ ≤ tol` + /// per point — a quadratic in `s` opening upwards, with the accumulated movement + /// `Δ = current − input` already inside the ball, so the bound is its positive root. + fn limit(&self, input: &[[f64; N]], current: &[[f64; N]], d: &[[f64; N]], tolerance: f64) -> f64 { + let mut s = 1.0f64; + for (slot, &at) in self.points.iter().enumerate() { + let (Some(dv), Some(cv), Some(iv)) = (d.get(slot), current.get(at), input.get(at)) else { continue }; + let a = dot(dv, dv); + if a <= 0.0 { + continue; + } + let delta: [f64; N] = std::array::from_fn(|c| cv[c] - iv[c]); + let b = 2.0 * dot(&delta, dv); + let c = dot(&delta, &delta) - tolerance * tolerance; + let disc = b * b - 4.0 * a * c; + let root = if disc >= 0.0 { (-b + disc.sqrt()) / (2.0 * a) } else { 0.0 }; + // `f64::max` ignores a NaN, so a step whose arithmetic overflows stops the run + // instead of leaking a not-a-number into a control point. + s = s.min(root.max(0.0)); + } + (s * TOLERANCE_SLACK).clamp(0.0, 1.0) + } + + /// The farthest any interior control point moved from the design's own position, in mm. + fn movement(&self, input: &[[f64; N]], current: &[[f64; N]]) -> f64 { + self.points.iter().fold(0.0f64, |m, &at| match (input.get(at), current.get(at)) { + (Some(a), Some(b)) => m.max(dist(a, b)), + _ => m, + }) + } +} + +/// The control points of one direction a fairing run may move, as `[lo, hi)`. A direction of one +/// control point — a curve seen as a net one row deep — is all interior; otherwise `keep` layers +/// are held at each end: the boundary, and with `keep = 2` the layer next to it. +fn free_span(count: usize, keep: usize) -> Result<(usize, usize)> { + if count == 1 { + return Ok((0, 1)); + } + if count <= 2 * keep { + return Err(KernelError::Invalid(format!( + "fairing a net {count} control points across one direction and holding {keep} at each edge leaves nothing to move" + ))); + } + Ok((keep, count - keep)) +} + +/// A symmetric banded matrix in upper-triangular form: row `r` holds columns `r ..= r + bw`. +struct Band { + n: usize, + bw: usize, + /// The upper band, `n · (bw + 1)` numbers; the scaling by the largest diagonal is folded in + /// when the matrix is factorised. + a: Vec, + scale: f64, +} + +impl Band { + fn new(n: usize, bw: usize) -> Result { + let Some(len) = (bw + 1).checked_mul(n).filter(|&l| l <= MAX_FAIR_BAND) else { + return Err(KernelError::TooLarge(format!("a fairing system of {n} unknowns {bw} apart"))); + }; + Ok(Band { n, bw, a: vec![0.0; len], scale: 1.0 }) + } + + fn index(&self, r: usize, s: usize) -> Option { + let (r, s) = if r <= s { (r, s) } else { (s, r) }; + (s - r <= self.bw && s < self.n).then_some(r * (self.bw + 1) + (s - r)) + } + + fn get(&self, r: usize, s: usize) -> f64 { + self.index(r, s).and_then(|i| self.a.get(i)).copied().unwrap_or(0.0) + } + + fn set(&mut self, r: usize, s: usize, v: f64) { + if let Some(x) = self.index(r, s).and_then(|i| self.a.get_mut(i)) { + *x = v; + } + } + + /// Add `v` at `(r, s)`. Only `r ≤ s` is stored (the matrix is symmetric, so callers adding a + /// whole symmetric neighbourhood reach each stored entry once). + fn add(&mut self, r: usize, s: usize, v: f64) { + if r <= s + && let Some(x) = self.index(r, s).and_then(|i| self.a.get_mut(i)) + { + *x += v; + } + } + + /// `A = Uᵀ·U` in place, the entries scaled by the largest diagonal first (the scaling does + /// not change the solution, only the size of the pivots, so a net whose knots span microns or + /// kilometres factorises just as well). An error, never a panic, when a pivot is not + /// positive: the system is singular there and the geometry must not move. + fn factorised(mut self) -> Result { + let (n, bw) = (self.n, self.bw); + let scale = (0..n).fold(0.0f64, |m, r| m.max(self.get(r, r).abs())); + if !(scale > 0.0) || !scale.is_finite() { + return Err(KernelError::Invalid("the fairness energy does not depend on any interior control point: nothing to fair".into())); + } + self.scale = scale; + for v in self.a.iter_mut() { + *v /= scale; + } + for r in 0..n { + let mut d = self.get(r, r); + for k in r.saturating_sub(bw)..r { + let u = self.get(k, r); + d -= u * u; + } + if !(d > 0.0) { + return Err(KernelError::Invalid( + "the fairing equations are singular (an interior control point that does not move the geometry)".into(), + )); + } + let d = d.sqrt(); + self.set(r, r, d); + for s in r + 1..(r + bw + 1).min(n) { + let mut v = self.get(r, s); + for k in s.saturating_sub(bw)..r { + v -= self.get(k, r) * self.get(k, s); + } + self.set(r, s, v / d); + } + } + Ok(self) + } + + /// Solve `A·x = b` with the stored factorisation, in place. + fn solve(&self, b: &mut [f64]) -> Result<()> { + let (n, bw) = (self.n, self.bw); + if b.len() != n { + return Err(KernelError::Invalid(format!("{} fairing unknowns for a system of {n}", b.len()))); + } + for x in b.iter_mut() { + *x /= self.scale; + } + // Uᵀ·y = b, then U·x = y. + for r in 0..n { + let mut v = b.get(r).copied().unwrap_or(0.0); + for k in r.saturating_sub(bw)..r { + v -= self.get(k, r) * b.get(k).copied().unwrap_or(0.0); + } + if let Some(x) = b.get_mut(r) { + *x = v / self.get(r, r); + } + } + for r in (0..n).rev() { + let mut v = b.get(r).copied().unwrap_or(0.0); + for s in r + 1..(r + bw + 1).min(n) { + v -= self.get(r, s) * b.get(s).copied().unwrap_or(0.0); + } + if let Some(x) = b.get_mut(r) { + *x = v / self.get(r, r); + } + } + if b.iter().any(|x| !x.is_finite()) { + return Err(KernelError::Invalid("the fairing step is not a finite number".into())); + } + Ok(()) + } +} + +/// Fair a B-spline curve's control points of any dimension: hold control points `0` and `n − 1` +/// and (with [`FairOptions::keep_edges`]) those next to them, and move the rest to lower the +/// bending energy `∫‖C″‖² dt` in the curve's own parameter (see the module docs). `N` is 3 for a +/// wire in space, 2 for a sketch curve. +pub fn fair_curve(degree: usize, knots: &[f64], ctrl: &[[f64; N]], opts: &FairOptions) -> Result> { + let opts = opts.checked()?; + let net = Net::new([degree, 0], [knots.to_vec(), TRIVIAL_KNOTS.to_vec()], [ctrl.len(), 1], &CURVE_ENERGY)?; + let (faired, report) = net.fair(ctrl, &opts)?; + Ok(FairCurve { degree, knots: knots.to_vec(), ctrl: faired, report }) +} + +/// Fair the interior of a B-spline control net with the thin-plate energy +/// `∫∫ ‖S_uu‖² + 2‖S_uv‖² + ‖S_vv‖² du dv` in the net's own parameters (see the module docs). +/// `count[0]` control points lie along u and `count[1]` along v, `ctrl` is u fastest, and the +/// boundary layers (see [`FairOptions::keep_edges`]) are held. The generic core behind +/// [`fair_surface`], [`fair_bspline_surface`] and their rational counterparts, for a caller with +/// its own control net. +pub fn fair_net( + degree: [usize; 2], + knots: [&[f64]; 2], + count: [usize; 2], + ctrl: &[[f64; N]], + opts: &FairOptions, +) -> Result> { + let opts = opts.checked()?; + let net = Net::new(degree, [knots[0].to_vec(), knots[1].to_vec()], count, &SURFACE_ENERGY)?; + let (faired, report) = net.fair(ctrl, &opts)?; + Ok(FairNet { degree, knots: [knots[0].to_vec(), knots[1].to_vec()], count, ctrl: faired, report }) +} + +/// Fair a truck B-spline curve's control points: [`fair_curve`] on its three-dimensional points, +/// rebuilt as a B-spline of the same knots. Guarded here itself, like every call into truck, so a +/// panic inside comes back as an error and the design is left alone. +pub fn fair_bspline_curve(curve: &mt::BSplineCurve, opts: &FairOptions) -> Result<(mt::BSplineCurve, FairReport)> { + guard("fair a B-spline curve", || { + let ctrl: Vec<[f64; 3]> = curve.control_points().iter().map(|p| [p.x, p.y, p.z]).collect(); + let faired = fair_curve(curve.degree(), curve.knot_vec(), &ctrl, opts)?; + let points: Vec = faired.ctrl.iter().map(|c| mt::Point3::new(c[0], c[1], c[2])).collect(); + let curve = mt::BSplineCurve::try_new(mt::KnotVec::from(faired.knots), points).map_err(|e| KernelError::Failed(format!("fair: {e}")))?; + Ok((curve, faired.report)) + }) +} + +/// Fair a truck rational curve's control points: its Cartesian control points are faired like any +/// other curve and its weights are kept, so the result is the same rational curve with moved +/// control points. The convex-hull bound that keeps the geometry within the tolerance still +/// holds, because with the weights unchanged the rational basis functions are non-negative and +/// sum to one. Guarded like [`fair_bspline_curve`]. +pub fn fair_nurbs_curve(curve: &mt::NurbsCurve, opts: &FairOptions) -> Result<(mt::NurbsCurve, FairReport)> { + guard("fair a NURBS curve", || { + let count = curve.control_points().len(); + let mut ctrl = Vec::with_capacity(count); + let mut weights = Vec::with_capacity(count); + for h in curve.control_points() { + let Some(p) = (HPoint { x: h.x, y: h.y, z: h.z, w: h.w }).project() else { + return Err(KernelError::Invalid("a control point has no position: its weight is zero".into())); + }; + ctrl.push([p.x, p.y, p.z]); + weights.push(h.w); + } + let faired = fair_curve(curve.degree(), curve.knot_vec(), &ctrl, opts)?; + let points: Vec = faired.ctrl.iter().zip(&weights).map(|(c, w)| mt::Vector4::new(c[0] * w, c[1] * w, c[2] * w, *w)).collect(); + let bsp = mt::BSplineCurve::try_new(mt::KnotVec::from(faired.knots), points).map_err(|e| KernelError::Failed(format!("fair: {e}")))?; + Ok((mt::NurbsCurve::new(bsp), faired.report)) + }) +} + +/// Fair a truck B-spline surface's control net: [`fair_net`] on its points, rebuilt as a B-spline +/// of the same knots, with the boundary rows held. Guarded like [`fair_bspline_curve`]. +pub fn fair_bspline_surface(surface: &mt::BSplineSurface, opts: &FairOptions) -> Result<(mt::BSplineSurface, FairReport)> { + guard("fair a B-spline surface", || { + let rows = surface.control_points(); + let count = [rows.len(), rows.first().map_or(0, Vec::len)]; + if count[0] == 0 || count[1] == 0 { + return Err(KernelError::Invalid("the surface has no control points".into())); + } + if rows.iter().any(|r| r.len() != count[1]) { + return Err(KernelError::Invalid("the surface's control net is not rectangular".into())); + } + // truck keeps the net as control_points()[i][j] with i along u; fair_net wants u fastest. + let mut ctrl = Vec::with_capacity(count[0] * count[1]); + for j in 0..count[1] { + for i in 0..count[0] { + let Some(p) = rows.get(i).and_then(|r| r.get(j)) else { continue }; + ctrl.push([p.x, p.y, p.z]); + } + } + let (ku, kv) = surface.knot_vecs(); + let (pu, pv) = surface.degrees(); + let faired = fair_net([pu, pv], [ku, kv], count, &ctrl, opts)?; + let mut net: Vec> = Vec::with_capacity(count[0]); + for i in 0..count[0] { + let mut row = Vec::with_capacity(count[1]); + for j in 0..count[1] { + let Some(c) = faired.ctrl.get(j * count[0] + i) else { + return Err(KernelError::Failed("fairing lost a control point".into())); + }; + row.push(mt::Point3::new(c[0], c[1], c[2])); + } + net.push(row); + } + let surface = mt::BSplineSurface::try_new((ku.clone(), kv.clone()), net).map_err(|e| KernelError::Failed(format!("fair: {e}")))?; + Ok((surface, faired.report)) + }) +} + +/// Fair a geom NURBS surface's control net: [`fair_net`] on its Cartesian control points, with +/// the weights kept as they are (a fairing moves points, not weights) and the boundary rows held. +/// A rational surface's geometry then stays within the tolerance too, by the same convex-hull +/// bound as the non-rational case. +pub fn fair_surface(surface: &NurbsSurface, opts: &FairOptions) -> Result<(NurbsSurface, FairReport)> { + let [cu, cv] = surface.count(); + let mut ctrl = Vec::with_capacity(cu * cv); + let mut weights = Vec::with_capacity(cu * cv); + for j in 0..cv { + for i in 0..cu { + let h = surface.point(i, j); + let Some(p) = h.project() else { + return Err(KernelError::Invalid("a control point has no position: its weight is zero".into())); + }; + ctrl.push([p.x, p.y, p.z]); + weights.push(h.w); + } + } + let [ku, kv] = surface.knots(); + let degree = surface.degree(); + let faired = fair_net(degree, [ku, kv], [cu, cv], &ctrl, opts)?; + let points: Vec = faired.ctrl.iter().zip(&weights).map(|(p, w)| HPoint::weighted(Vec3::new(p[0], p[1], p[2]), *w)).collect(); + let out = NurbsSurface::from_homogeneous(degree, surface.knots().clone(), points).map_err(|e| spline_error("fairing the surface", e))?; + Ok((out, faired.report)) +} + +/// Fair a truck rational surface's control net, like [`fair_surface`]: the Cartesian control +/// points are faired, the weights kept, and the result is a NURBS surface of the same knots. +/// Guarded like [`fair_bspline_curve`]. +pub fn fair_nurbs_surface(surface: &mt::NurbsSurface, opts: &FairOptions) -> Result<(mt::NurbsSurface, FairReport)> { + guard("fair a NURBS surface", || { + let bsp = surface.non_rationalized(); + let rows = bsp.control_points(); + let count = [rows.len(), rows.first().map_or(0, Vec::len)]; + if count[0] == 0 || count[1] == 0 { + return Err(KernelError::Invalid("the surface has no control points".into())); + } + if rows.iter().any(|r| r.len() != count[1]) { + return Err(KernelError::Invalid("the surface's control net is not rectangular".into())); + } + let mut ctrl = Vec::with_capacity(count[0] * count[1]); + let mut weights = Vec::with_capacity(count[0] * count[1]); + for j in 0..count[1] { + for i in 0..count[0] { + let Some(h) = rows.get(i).and_then(|r| r.get(j)) else { continue }; + let Some(p) = (HPoint { x: h.x, y: h.y, z: h.z, w: h.w }).project() else { + return Err(KernelError::Invalid("a control point has no position: its weight is zero".into())); + }; + ctrl.push([p.x, p.y, p.z]); + weights.push(h.w); + } + } + let (ku, kv) = bsp.knot_vecs(); + let (pu, pv) = bsp.degrees(); + let faired = fair_net([pu, pv], [ku, kv], count, &ctrl, opts)?; + let mut net: Vec> = Vec::with_capacity(count[0]); + for i in 0..count[0] { + let mut row = Vec::with_capacity(count[1]); + for j in 0..count[1] { + let (Some(c), Some(w)) = (faired.ctrl.get(j * count[0] + i), weights.get(j * count[0] + i)) else { + return Err(KernelError::Failed("fairing lost a control point".into())); + }; + row.push(mt::Vector4::new(c[0] * w, c[1] * w, c[2] * w, *w)); + } + net.push(row); + } + let bsp = mt::BSplineSurface::try_new((ku.clone(), kv.clone()), net).map_err(|e| KernelError::Failed(format!("fair: {e}")))?; + Ok((mt::NurbsSurface::new(bsp), faired.report)) + }) +} + +/// Fair the B-spline faces at `faces` (indices in `body`'s face order) of `body`: each face's +/// interior control vertices move to flatten the thin-plate energy of the face while its boundary +/// rows stay put, so the face keeps meeting its neighbours as it did. +/// +/// Every picked face keeps the very wires, edges and vertices it had and the way it pointed: only +/// the surface between them changes, so the body is as closed (or as open) as it was, holes and +/// all. A face that is not a B-spline (a plane, cylinder, cone, sphere, torus or swept face) has no +/// control points to fair and is refused by name; a mesh body has no faces to fair at all. +/// +/// The report is over the picked faces together: the energies summed, the largest movement of any +/// control point, and the energy trace as the sum at each step (a face that stops early keeps its +/// last energy for the steps the others still take). +pub fn fair_faces(body: &Body, faces: &[usize], opts: &FairOptions) -> Result<(Body, FairReport)> { + let opts = opts.checked()?; + body.require_brep("fair")?; + let all: Vec = body.solid.face_iter().cloned().collect(); + if all.is_empty() { + return Err(KernelError::Invalid("the body has no faces".into())); + } + let mut picked: Vec = Vec::new(); + for &i in faces { + if i >= all.len() { + return Err(KernelError::Invalid(format!("no face {i}: the body has {}", all.len()))); + } + if !picked.contains(&i) { + picked.push(i); + } + } + if picked.is_empty() { + return Err(KernelError::Invalid("pick the faces to fair".into())); + } + guard("fair faces", || { + let mut faired = all.clone(); + let mut reports: Vec = Vec::with_capacity(picked.len()); + for &i in &picked { + let Some(face) = all.get(i) else { continue }; + let (surface, report) = match face.surface() { + mt::Surface::BSplineSurface(s) => { + let (faired, report) = fair_bspline_surface(&s, &opts)?; + (mt::Surface::BSplineSurface(faired), report) + } + mt::Surface::NurbsSurface(s) => { + let (faired, report) = fair_nurbs_surface(&s, &opts)?; + (mt::Surface::NurbsSurface(faired), report) + } + _ => { + return Err(KernelError::Invalid(format!( + "face {i} is not a B-spline face: a plane, cylinder, cone, sphere, torus or swept face has no control points to fair" + ))); + } + }; + // The same face as before, wires and all, with the faired surface between them. + let mut nf = mt::Face::new_unchecked(face.absolute_boundaries().clone(), surface); + if !face.orientation() { + nf.invert(); + } + if let Some(slot) = faired.get_mut(i) { + *slot = nf; + } + reports.push(report); + } + let report = FairReport { + energy_before: reports.iter().map(|r| r.energy_before).sum(), + energy_after: reports.iter().map(|r| r.energy_after).sum(), + steps: reports.iter().map(|r| r.steps).max().unwrap_or(0), + movement: reports.iter().fold(0.0f64, |m, r| m.max(r.movement)), + energy_trace: { + let longest = reports.iter().map(|r| r.energy_trace.len()).max().unwrap_or(0); + (0..longest).map(|k| reports.iter().map(|r| r.energy_trace.get(k).copied().unwrap_or(r.energy_after)).sum()).collect() + }, + }; + // The body shell for shell, in its own face order: a body with holes keeps them. + let mut shells: Vec = Vec::with_capacity(body.solid.boundaries().len()); + let mut index = 0usize; + for shell in body.solid.boundaries() { + let mut shell_faces = Vec::with_capacity(shell.face_iter().count()); + for f in shell.face_iter() { + let i = index; + index += 1; + shell_faces.push(faired.get(i).cloned().unwrap_or_else(|| f.clone())); + } + shells.push(mt::Shell::from(shell_faces)); + } + // The topology is the body's own, face for face, so the solid is built as it (the shells + // are as closed, or as open, as they were) and only the shape is measured anew. + let mut result = body.clone(); + result.solid = std::sync::Arc::new(mt::Solid::new_unchecked(shells)); + result.size = 0.0; + result.volume = Some(std::sync::Arc::new(std::sync::Mutex::new(None))); + result.coarse_missing = None; + result.history = None; + let faces: Vec = + (0..all.len()).map(|i| crate::record::from_face(0, i, if picked.contains(&i) { Change::Modified } else { Change::Kept })).collect(); + let result = crate::record::attach(result, &[crate::record::Operand::new(body)], Some(faces), std::collections::HashMap::new())?; + Ok((result, report)) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use mt::ParametricCurve; + + /// A clamped uniform knot vector over `[0, spans]` of degree `degree`: `spans + degree` + /// control points. + fn clamped(spans: usize, degree: usize) -> Vec { + let mut k = vec![0.0; degree + 1]; + k.extend((1..spans).map(|i| i as f64)); + k.extend(std::iter::repeat_n(spans as f64, degree + 1)); + k + } + + /// The knot average `(kᵢ₊₁ + … + kᵢ₊ₚ)/p` of control point `i`: `Σ Nᵢ(t)·ξᵢ = t` (NURBS Book + /// eq. 3.4), so control points at `a + b·ξᵢ` describe the affine curve `a + b·t` exactly. + fn average(knots: &[f64], degree: usize, i: usize) -> f64 { + (1..=degree).map(|r| knots.get(i + r).copied().unwrap_or(0.0)).sum::() / degree as f64 + } + + /// The control points of the affine curve `ξ ↦ a + b·ξ` at the knot averages of `knots`: a + /// curve of exactly zero bending energy. + fn affine_curve(knots: &[f64], degree: usize, a: [f64; 3], b: [f64; 3]) -> Vec<[f64; 3]> { + (0..knots.len() - degree - 1).map(|i| std::array::from_fn(|c| a[c] + b[c] * average(knots, degree, i))).collect() + } + + /// The control net (u fastest) of the plane `(ξ, η) ↦ a + b·ξ + c·η` at the knot averages of + /// `ku` and `kv`: a net of exactly zero thin-plate energy. + fn planar_net(ku: &[f64], kv: &[f64], degree: [usize; 2], a: [f64; 3], b: [f64; 3], c: [f64; 3]) -> Vec<[f64; 3]> { + let (cu, cv) = (ku.len() - degree[0] - 1, kv.len() - degree[1] - 1); + let mut net = Vec::with_capacity(cu * cv); + for j in 0..cv { + for i in 0..cu { + let (xi, eta) = (average(ku, degree[0], i), average(kv, degree[1], j)); + net.push(std::array::from_fn(|d| a[d] + b[d] * xi + c[d] * eta)); + } + } + net + } + + /// The point of the curve `(degree, knots, ctrl)` at `t`, through the same basis geom uses: a + /// basis function `i` owns the `degree + 2` knots `knots[i..=i + degree + 1]`. + fn curve_at(degree: usize, knots: &[f64], ctrl: &[[f64; N]], t: f64) -> [f64; N] { + let n = ctrl.len(); + let side = if t >= knots.get(n).copied().unwrap_or(f64::INFINITY) { Side::Left } else { Side::Right }; + let mut out = [0.0; N]; + for (i, c) in ctrl.iter().enumerate() { + let b = knots.get(i..=i + degree + 1).and_then(|l| local_basis(l, t, side, 0).first().copied()).unwrap_or(0.0); + for (o, x) in out.iter_mut().zip(c) { + *o += b * x; + } + } + out + } + + /// The greatest distance between two points of space, in mm. + fn apart(a: mt::Point3, b: mt::Point3) -> f64 { + ((a.x - b.x).powi(2) + (a.y - b.y).powi(2) + (a.z - b.z).powi(2)).sqrt() + } + + /// A geom point as a coordinate triple. + fn triple(p: Vec3) -> [f64; 3] { + [p.x, p.y, p.z] + } + + #[test] + fn a_perturbed_curve_is_faired_back_to_its_smooth_shape_and_its_ends_stay_put() { + // A cubic curve whose control points sit at the knot averages of an affine curve: zero + // bending energy, so a fairing run must return to the same control polygon. The knots are + // deliberately uneven, so a fairing that ignored the curve's own parameter would not. + let knots = [0.0, 0.0, 0.0, 0.0, 1.0, 3.0, 5.0, 9.0, 9.0, 9.0, 9.0]; + let (a, b) = ([-20.0, 5.0, 1.5], [4.0, -2.5, 3.0]); + let smooth = affine_curve(&knots, 3, a, b); + let mut rough = smooth.clone(); + rough[2] = [rough[2][0] + 1.5, rough[2][1] - 2.0, rough[2][2] + 3.0]; + rough[3][2] += 2.5; + rough[4][0] -= 1.25; + rough[5][1] += 1.75; + let far = (0..smooth.len()).map(|i| dist(&rough[i], &smooth[i])).fold(0.0, f64::max); + + let opts = FairOptions::new(1.0, 8, false, 100.0).unwrap(); + let faired = fair_curve(3, &knots, &rough, &opts).unwrap(); + // The ends did not move at all, bit for bit. + assert_eq!(faired.ctrl[0], rough[0]); + assert_eq!(faired.ctrl[6], rough[6]); + // Every interior control point came back to the smooth shape. + let near = (1..6).map(|i| dist(&faired.ctrl[i], &smooth[i])).fold(0.0, f64::max); + eprintln!( + "curve: perturbation {far} mm, faired to {near:e} mm, energy {:e} → {:e} in {} steps, movement {:e} mm", + faired.report.energy_before, faired.report.energy_after, faired.report.steps, faired.report.movement + ); + assert!(near < 1e-6 && near < far * 1e-6, "faired to {near:e}, was {far} mm out"); + // The energy is a real number before, fell to nothing, and never rose on the way. + assert!(faired.report.energy_before > 1e-3, "{:e}", faired.report.energy_before); + assert!(faired.report.energy_after >= 0.0 && faired.report.energy_after < 1e-9 * faired.report.energy_before); + assert!(faired.report.steps >= 1 && faired.report.energy_trace.len() == faired.report.steps); + assert_eq!(faired.report.energy_trace.last().copied(), Some(faired.report.energy_after)); + assert!(faired.report.energy_trace.windows(2).all(|w| w[1] < w[0]), "{:?}", faired.report.energy_trace); + // A step never moves a control point further than the tolerance, and here it moved the + // whole way back to the smooth shape. + assert!(faired.report.movement <= 100.0 && (faired.report.movement - far).abs() < 1e-9, "{:e}", faired.report.movement); + // The faired curve is the affine line it was meant to be. + let mut off = 0.0f64; + for k in 0..=32 { + let t = 9.0 * f64::from(k) / 32.0; + let want: [f64; 3] = std::array::from_fn(|c| a[c] + b[c] * t); + off = off.max(dist(&curve_at(3, &knots, &faired.ctrl, t), &want)); + } + eprintln!("curve: the faired curve is {off:e} mm off the affine line it describes"); + assert!(off < 1e-6, "{off:e}"); + } + + #[test] + fn a_half_strength_run_walks_to_the_same_shape_over_its_iterations() { + // The same perturbation, walked a half step at a time: the energy must fall at every step + // (monotone, strictly) and still arrive at the smooth shape. + let knots = [0.0, 0.0, 0.0, 0.0, 1.0, 3.0, 5.0, 9.0, 9.0, 9.0, 9.0]; + let smooth = affine_curve(&knots, 3, [-20.0, 5.0, 1.5], [4.0, -2.5, 3.0]); + let mut rough = smooth.clone(); + rough[2][2] += 4.0; + rough[3][0] += 2.0; + let opts = FairOptions::new(0.5, 40, false, 100.0).unwrap(); + let faired = fair_curve(3, &knots, &rough, &opts).unwrap(); + eprintln!("half strength: energy {:e} → {:e} in {} steps", faired.report.energy_before, faired.report.energy_after, faired.report.steps); + assert!(faired.report.energy_trace.len() > 4, "one step is not a walk"); + assert!(faired.report.energy_trace.windows(2).all(|w| w[1] < w[0]), "the energy must fall at every step"); + assert!(faired.report.energy_after < 1e-9 * faired.report.energy_before); + assert_eq!(faired.ctrl[0], rough[0]); + assert_eq!(faired.ctrl[6], rough[6]); + assert!(dist(&faired.ctrl[3], &smooth[3]) < 1e-6); + } + + #[test] + fn the_faired_curve_stays_within_the_tolerance_of_the_design() { + // A heavily perturbed curve with a 0.75 mm tolerance: the design may be smoothed, but + // never by more than the caller allowed, and the bound is on the geometry itself. + let knots = clamped(3, 3); + let smooth = affine_curve(&knots, 3, [0.0, 0.0, 0.0], [30.0, 8.0, 0.0]); + let mut rough = smooth.clone(); + for (i, d) in [(1, [1.0, -2.0, 4.0]), (2, [-3.0, 2.0, -6.0]), (3, [2.0, -1.0, 5.0]), (4, [-2.0, 3.0, -4.0])] { + for c in 0..3 { + rough[i][c] += d[c]; + } + } + let tolerance = 0.75; + let opts = FairOptions::new(1.0, 12, false, tolerance).unwrap(); + let faired = fair_curve(3, &knots, &rough, &opts).unwrap(); + let mut off = 0.0f64; + for k in 0..=64 { + let t = 3.0 * f64::from(k) / 64.0; + off = off.max(dist(&curve_at(3, &knots, &faired.ctrl, t), &curve_at(3, &knots, &rough, t))); + } + eprintln!( + "tolerance {tolerance}: the curve moved {off:e} mm at worst ({:e} mm of control points), energy {:e} → {:e}", + faired.report.movement, faired.report.energy_before, faired.report.energy_after + ); + assert!(faired.report.movement <= tolerance, "{:e}", faired.report.movement); + assert!(off <= tolerance * (1.0 + 1e-9), "{off:e} over {tolerance}"); + assert!(faired.report.energy_after < faired.report.energy_before); + // The tolerance did not stop the run from heading for the smooth shape. + let before = (0..6).map(|i| dist(&rough[i], &smooth[i])).fold(0.0, f64::max); + let after = (0..6).map(|i| dist(&faired.ctrl[i], &smooth[i])).fold(0.0, f64::max); + assert!(after < before, "{after} vs {before}"); + assert_eq!(faired.ctrl[0], rough[0]); + assert_eq!(faired.ctrl[5], rough[5]); + } + + #[test] + fn a_sketch_curve_of_two_dimensions_fairs_the_same_way() { + // The generic core takes `[f64; 2]` just as well: a quadratic sketch curve, its middle + // pulled 2 mm out of the smooth polyline. + let knots = clamped(4, 2); + let smooth: Vec<[f64; 2]> = (0..knots.len() - 3).map(|i| [average(&knots, 2, i) * 10.0, average(&knots, 2, i) * 2.0]).collect(); + let mut rough = smooth.clone(); + rough[2] = [rough[2][0] + 1.0, rough[2][1] - 2.0]; + rough[3][1] += 1.5; + let opts = FairOptions::new(1.0, 10, false, 50.0).unwrap(); + let faired = fair_curve(2, &knots, &rough, &opts).unwrap(); + eprintln!("2D sketch curve: energy {:e} → {:e} in {} steps", faired.report.energy_before, faired.report.energy_after, faired.report.steps); + assert_eq!(faired.ctrl[0], rough[0]); + assert_eq!(faired.ctrl[5], rough[5]); + assert!(faired.report.energy_after >= 0.0 && faired.report.energy_after < 1e-9 * faired.report.energy_before); + for (i, want) in smooth.iter().enumerate().take(5).skip(1) { + assert!(dist(&faired.ctrl[i], want) < 1e-6, "point {i}"); + } + } + + #[test] + fn a_perturbed_net_is_faired_back_to_its_plane_with_its_boundary_rows_held() { + // A bicubic net of a plane (zero thin-plate energy), its middle pushed out; the boundary + // rows must not move at all and the interior must come back to the plane. + let (ku, kv) = (clamped(3, 3), clamped(4, 3)); + let degree = [3, 3]; + let (cu, cv) = (ku.len() - 4, kv.len() - 4); + let (a, b, c) = ([1.0, -2.0, 4.0], [2.0, 0.5, -0.25], [-0.5, 1.5, 0.75]); + let smooth = planar_net(&ku, &kv, degree, a, b, c); + let mut rough = smooth.clone(); + for &(i, j, d) in &[(2usize, 2usize, 3.0), (3, 3, -2.5), (1, 4, 1.5), (4, 5, -1.0)] { + rough[j * cu + i][2] += d; + } + let opts = FairOptions::new(1.0, 6, false, 100.0).unwrap(); + let faired = fair_net(degree, [&ku, &kv], [cu, cv], &rough, &opts).unwrap(); + for j in 0..cv { + for i in [0, cu - 1] { + assert_eq!(faired.ctrl[j * cu + i], rough[j * cu + i], "column {i}, row {j} moved"); + } + } + for i in 0..cu { + for j in [0, cv - 1] { + assert_eq!(faired.ctrl[j * cu + i], rough[j * cu + i], "row {j}, column {i} moved"); + } + } + let near = (0..cu * cv).map(|k| dist(&faired.ctrl[k], &smooth[k])).fold(0.0, f64::max); + let far = (0..cu * cv).map(|k| dist(&rough[k], &smooth[k])).fold(0.0, f64::max); + eprintln!("net: perturbation {far} mm, faired to {near:e} mm, energy {:e} → {:e}", faired.report.energy_before, faired.report.energy_after); + assert!(near < 1e-6, "{near:e}"); + assert!(faired.report.energy_after < 1e-9 * faired.report.energy_before); + assert!(faired.report.energy_trace.windows(2).all(|w| w[1] < w[0])); + // With keep_edges the two outer layers at each side stay exactly as designed — so the + // bump goes into the middle of the net — and the rest still comes back to the plane. + let mut inner = smooth.clone(); + for &(i, j, d) in &[(2usize, 2usize, 3.0), (3, 3, -2.5), (2, 3, 1.5), (3, 2, -1.0)] { + inner[j * cu + i][2] += d; + } + let kept = FairOptions::new(1.0, 6, true, 100.0).unwrap(); + let faired = fair_net(degree, [&ku, &kv], [cu, cv], &inner, &kept).unwrap(); + let shell = |i: usize, j: usize| i < 2 || i + 2 >= cu || j < 2 || j + 2 >= cv; + for j in 0..cv { + for i in 0..cu { + if shell(i, j) { + assert_eq!(faired.ctrl[j * cu + i], inner[j * cu + i], "({i}, {j}) is a boundary layer and moved"); + } + } + } + let near = (0..cu * cv).filter(|&k| !shell(k % cu, k / cu)).map(|k| dist(&faired.ctrl[k], &smooth[k])).fold(0.0, f64::max); + eprintln!("net with keep_edges: interior faired to {near:e} mm, energy {:e} → {:e}", faired.report.energy_before, faired.report.energy_after); + assert!(near < 1e-6 && faired.report.energy_after < faired.report.energy_before); + } + + #[test] + fn a_faired_geom_surface_stays_within_the_tolerance_of_the_design_and_keeps_its_weights() { + // A rational surface (weights off one) whose middle is pushed out: fair it with a 0.5 mm + // tolerance. The weights must be untouched, the boundary rows must not move, and the + // surface must stay within the tolerance of the one the design asked for. + let (ku, kv) = (clamped(3, 3), clamped(3, 3)); + let degree = [3, 3]; + let (cu, cv) = (ku.len() - 4, kv.len() - 4); + let smooth = planar_net(&ku, &kv, degree, [0.0, 0.0, 0.0], [20.0, 0.0, 0.0], [0.0, 15.0, 0.0]); + let weights: Vec = (0..cu * cv).map(|k| 0.5 + (k % 5) as f64 * 0.25).collect(); + let mut rough = smooth.clone(); + for &(i, j, d) in &[(2usize, 2usize, 4.0), (3, 3, -3.0), (1, 2, 2.0)] { + rough[j * cu + i][2] += d; + } + let surface = + NurbsSurface::new(degree, [ku.clone(), kv.clone()], &rough.iter().map(|c| Vec3::new(c[0], c[1], c[2])).collect::>(), &weights) + .unwrap(); + let tolerance = 0.5; + let opts = FairOptions::new(1.0, 8, false, tolerance).unwrap(); + let (faired, report) = fair_surface(&surface, &opts).unwrap(); + for k in 0..cu * cv { + let (i, j) = (k % cu, k / cu); + assert_eq!(faired.point(i, j).w, surface.point(i, j).w, "the weight of ({i}, {j}) changed"); + } + for j in 0..cv { + for i in [0, cu - 1] { + assert_eq!(faired.point(i, j), surface.point(i, j), "column {i} moved"); + } + } + let dom = surface.domain(); + let mut off = 0.0f64; + for k in 0..=24 { + for l in 0..=24 { + let (u, v) = (dom[0][0] + (dom[0][1] - dom[0][0]) * f64::from(k) / 24.0, dom[1][0] + (dom[1][1] - dom[1][0]) * f64::from(l) / 24.0); + off = off.max(surface.eval(u, v).unwrap().dist(faired.eval(u, v).unwrap())); + } + } + eprintln!( + "surface: moved {off:e} mm at worst ({:e} mm of control points), energy {:e} → {:e}", + report.movement, report.energy_before, report.energy_after + ); + assert!(report.movement <= tolerance, "{:e}", report.movement); + assert!(off <= tolerance * (1.0 + 1e-9), "{off:e} over {tolerance}"); + assert!(report.energy_after < report.energy_before); + // Every interior control point is nearer the plane than it was. + let before = (0..cu * cv).map(|k| dist(&rough[k], &smooth[k])).fold(0.0, f64::max); + let after = (0..cu * cv).map(|k| dist(&triple(faired.point(k % cu, k / cu).project().unwrap()), &smooth[k])).fold(0.0, f64::max); + assert!(after < before, "{after} vs {before}"); + } + + #[test] + fn the_truck_wrappers_fair_a_spline_curve_and_surface_with_their_ends_held() { + let knots = [0.0, 0.0, 0.0, 0.0, 1.0, 3.0, 5.0, 9.0, 9.0, 9.0, 9.0]; + let smooth = affine_curve(&knots, 3, [-20.0, 5.0, 1.5], [4.0, -2.5, 3.0]); + let mut rough = smooth.clone(); + rough[2][2] += 3.0; + rough[4][1] -= 2.0; + let points = |net: &[[f64; 3]]| -> Vec { net.iter().map(|c| mt::Point3::new(c[0], c[1], c[2])).collect() }; + let curve = mt::BSplineCurve::try_new(mt::KnotVec::from(knots.to_vec()), points(&rough)).unwrap(); + let tolerance = 5.0; + let opts = FairOptions::new(1.0, 8, false, tolerance).unwrap(); + let (faired, report) = fair_bspline_curve(&curve, &opts).unwrap(); + let mut off = 0.0f64; + for k in 0..=64 { + let t = 9.0 * f64::from(k) / 64.0; + off = off.max(apart(faired.subs(t), curve.subs(t))); + } + eprintln!( + "truck curve: energy {:e} → {:e} in {} steps, moved {off:e} mm ({:e} mm of control points)", + report.energy_before, report.energy_after, report.steps, report.movement + ); + assert_eq!(faired.control_points().first().copied(), curve.control_points().first().copied()); + assert_eq!(faired.control_points().last().copied(), curve.control_points().last().copied()); + assert!(off <= tolerance * (1.0 + 1e-9), "{off:e}"); + assert!(report.energy_after < 1e-9 * report.energy_before); + + // The same on a B-spline surface: boundary rows bit-identical, the bump in the middle + // comes down, the energy falls. + let (ku, kv) = (clamped(3, 3), clamped(3, 3)); + let degree = [3, 3]; + let (cu, cv) = (ku.len() - 4, kv.len() - 4); + let smooth = planar_net(&ku, &kv, degree, [0.0, 0.0, 0.0], [20.0, 0.0, 0.0], [0.0, 15.0, 0.0]); + let mut rough = smooth.clone(); + rough[2 * cu + 2][2] += 5.0; + let rows: Vec> = + (0..cu).map(|i| (0..cv).map(|j| mt::Point3::new(rough[j * cu + i][0], rough[j * cu + i][1], rough[j * cu + i][2])).collect()).collect(); + let surface = mt::BSplineSurface::try_new((mt::KnotVec::from(ku.clone()), mt::KnotVec::from(kv.clone())), rows).unwrap(); + let (faired, report) = fair_bspline_surface(&surface, &FairOptions::new(1.0, 6, true, 8.0).unwrap()).unwrap(); + eprintln!("truck surface: energy {:e} → {:e}, {} steps", report.energy_before, report.energy_after, report.steps); + for i in 0..cu { + for j in 0..cv { + if i < 2 || i + 2 >= cu || j < 2 || j + 2 >= cv { + assert_eq!(faired.control_points()[i][j], surface.control_points()[i][j], "({i}, {j}) is a boundary layer and moved"); + } + } + } + assert!(report.energy_after < report.energy_before); + assert!(faired.control_points()[2][2].z < surface.control_points()[2][2].z, "the bump should come down"); + } + + #[test] + fn a_rational_surface_fairs_with_its_boundary_and_tolerance_intact() { + // The truck NURBS wrapper, on weights away from one: fairing moves the Cartesian control + // points and keeps the weights, so the surface still cannot move more than the tolerance. + let (ku, kv) = (clamped(3, 3), clamped(3, 3)); + let degree = [3, 3]; + let (cu, cv) = (ku.len() - 4, kv.len() - 4); + let smooth = planar_net(&ku, &kv, degree, [0.0, 0.0, 0.0], [20.0, 0.0, 0.0], [0.0, 15.0, 0.0]); + let mut rough = smooth.clone(); + rough[2 * cu + 3][2] += 6.0; + let weights: Vec = (0..cu * cv).map(|k| 0.75 + (k % 3) as f64 * 0.5).collect(); + let rows: Vec> = (0..cu) + .map(|i| { + (0..cv) + .map(|j| { + let (c, w) = (rough[j * cu + i], weights[j * cu + i]); + mt::Vector4::new(c[0] * w, c[1] * w, c[2] * w, w) + }) + .collect() + }) + .collect(); + let bsp = mt::BSplineSurface::try_new((mt::KnotVec::from(ku.clone()), mt::KnotVec::from(kv.clone())), rows).unwrap(); + let surface = mt::NurbsSurface::new(bsp); + let (faired, report) = fair_nurbs_surface(&surface, &FairOptions::new(1.0, 6, false, 0.5).unwrap()).unwrap(); + eprintln!("rational surface: energy {:e} → {:e}, movement {:e} mm", report.energy_before, report.energy_after, report.movement); + assert!(report.movement <= 0.5 && report.energy_after < report.energy_before); + for i in 0..cu { + for j in 0..cv { + let (before, after) = (surface.non_rationalized().control_points()[i][j], faired.non_rationalized().control_points()[i][j]); + assert_eq!(after.w, before.w, "the weight of ({i}, {j}) changed"); + if i == 0 || i + 1 == cu || j == 0 || j + 1 == cv { + assert_eq!(after, before, "({i}, {j}) is on the boundary and moved"); + } + } + } + } + + #[test] + fn hostile_fairing_inputs_are_refused() { + let knots = clamped(3, 3); + let ctrl = affine_curve(&knots, 3, [0.0, 0.0, 0.0], [10.0, 4.0, 2.0]); + let ok = FairOptions::new(1.0, 4, false, 10.0).unwrap(); + // Out-of-range parameters: strength, iterations and tolerance are all input-derived. + for strength in [0.0, -0.25, 1.000_001, f64::NAN, f64::INFINITY] { + assert!(FairOptions::new(strength, 4, false, 10.0).is_err(), "strength {strength}"); + } + for iterations in [0, MAX_FAIR_ITERATIONS + 1, usize::MAX] { + assert!(FairOptions::new(1.0, iterations, false, 10.0).is_err(), "iterations {iterations}"); + } + for tolerance in [0.0, -1.0, f64::NAN, f64::INFINITY] { + assert!(FairOptions::new(1.0, 4, false, tolerance).is_err(), "tolerance {tolerance}"); + } + // A control point that is not a finite number. + for bad in [f64::NAN, f64::INFINITY, f64::NEG_INFINITY] { + let mut nan = ctrl.clone(); + nan[2][1] = bad; + assert!(fair_curve(3, &knots, &nan, &ok).is_err(), "a control point of {bad} was faired"); + } + // Knot vectors that do not fit the control points or the degree. + assert!(fair_curve(3, &knots[..9], &ctrl, &ok).is_err(), "nine knots for six control points of degree three"); + assert!(fair_curve(3, &[0.0, 0.0, 0.0, 0.0, 2.0, 1.0, 3.0, 4.0, 4.0, 4.0], &ctrl, &ok).is_err(), "knots that decrease"); + assert!(fair_curve(3, &vec![f64::NAN; knots.len()], &ctrl, &ok).is_err(), "a knot that is not a number"); + assert!(fair_curve(9, &knots, &ctrl, &ok).is_err(), "a degree above the supported maximum"); + // Fewer than two interior control points: one free point (a triangle of a quadratic), and + // a 3 × 3 net whose two edge layers leave nothing at all. + let triangle = [[0.0, 0.0, 0.0], [5.0, 2.0, 0.0], [10.0, 0.0, 1.0]]; + let one = fair_curve(2, &[0.0, 0.0, 0.0, 1.0, 1.0, 1.0], &triangle, &ok).unwrap_err(); + assert!(one.to_string().contains("at least two interior"), "{one}"); + let flat = [0.0, 0.0, 1.0, 2.0, 2.0]; + let grid = [[0.0, 0.0, 0.0]; 9]; + let kept = FairOptions::new(1.0, 4, true, 1.0).unwrap(); + assert!(fair_net([1, 1], [&flat, &flat], [3, 3], &grid, &kept).is_err(), "keep_edges on a 3 × 3 net"); + // A net too large to fair, refused before anything is allocated for it. + let line = [0.0, 0.0, 1.0, 1.0]; + assert!(fair_net([1, 1], [&line, &line], [65, 65], &vec![[0.0; 3]; 65 * 65], &ok).is_err(), "4225 control points"); + // A singular system: a cubic whose last control points lie past the end of its domain + // (0.5), where they do not move the curve at all, so the interior equations have no + // unique solution and the run must refuse rather than move anything. + let odd = [0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 1.0, 1.0, 1.0]; + let six: Vec<[f64; 3]> = (0..6).map(|i| [i as f64, 0.0, 1.0]).collect(); + let singular = fair_curve(3, &odd, &six, &ok).unwrap_err(); + eprintln!("hostile inputs: refused with {singular}"); + assert!(singular.to_string().contains("singular"), "{singular}"); + } + + #[test] + fn a_small_quadratic_net_and_a_quintic_curve_fair_the_same_way() { + // Degrees and band shapes away from the bicubic case. A 5 × 5 quadratic net has fewer + // rows than the degree, so the solver's band is narrower than `degree_u + degree_v · cols` + // (the coupling cannot reach that far in v); a quintic curve carries six basis functions + // per span instead of four. Both must reproduce a zero-energy shape exactly. + let (ku, kv) = (clamped(3, 2), clamped(3, 2)); + let degree = [2, 2]; + let (cu, cv) = (ku.len() - 3, kv.len() - 3); + assert_eq!((cu, cv), (5, 5)); + let smooth = planar_net(&ku, &kv, degree, [0.0, 0.0, 0.0], [12.0, 1.0, 0.0], [-2.0, 9.0, 0.0]); + let mut rough = smooth.clone(); + for &(i, j, d) in &[(1usize, 2usize, 2.5), (2, 2, -1.5), (3, 3, 3.0), (2, 1, -2.0)] { + rough[j * cu + i][2] += d; + } + let faired = fair_net(degree, [&ku, &kv], [cu, cv], &rough, &FairOptions::new(1.0, 8, false, 100.0).unwrap()).unwrap(); + let near = (0..cu * cv).map(|k| dist(&faired.ctrl[k], &smooth[k])).fold(0.0, f64::max); + eprintln!("5 × 5 quadratic net: faired to {near:e} mm, energy {:e} → {:e}", faired.report.energy_before, faired.report.energy_after); + assert!(near < 1e-6 && faired.report.energy_after < 1e-9 * faired.report.energy_before); + for j in 0..cv { + for i in 0..cu { + if i == 0 || i + 1 == cu || j == 0 || j + 1 == cv { + assert_eq!(faired.ctrl[j * cu + i], rough[j * cu + i], "({i}, {j}) is on the boundary and moved"); + } + } + } + // A quintic curve, its middle pulled out. + let knots = clamped(3, 5); + let smooth = affine_curve(&knots, 5, [-10.0, 0.0, 2.0], [6.0, 4.0, -1.0]); + let mut rough = smooth.clone(); + rough[3][1] += 3.0; + rough[4][2] -= 2.0; + let faired = fair_curve(5, &knots, &rough, &FairOptions::new(1.0, 8, false, 100.0).unwrap()).unwrap(); + let near = (1..smooth.len() - 1).map(|i| dist(&faired.ctrl[i], &smooth[i])).fold(0.0, f64::max); + eprintln!("quintic curve: faired to {near:e} mm, energy {:e} → {:e}", faired.report.energy_before, faired.report.energy_after); + assert!(near < 1e-6 && faired.report.energy_after < 1e-9 * faired.report.energy_before); + assert_eq!(faired.ctrl[0], rough[0]); + assert_eq!(faired.ctrl[rough.len() - 1], rough[rough.len() - 1]); + } + + /// A one-face sheet body of the bicubic surface `net` (u fastest) over the clamped knots `ku` + /// and `kv`, its sides the straight lines between the surface's corners — true while the + /// net's boundary rows describe lines, which is how a plane's control net is built here. + fn sheet(ku: &[f64], kv: &[f64], net: &[[f64; 3]]) -> Body { + let (cu, cv) = (ku.len() - 4, kv.len() - 4); + assert_eq!(net.len(), cu * cv, "the net does not fit the knots"); + let rows: Vec> = + (0..cu).map(|i| (0..cv).map(|j| mt::Point3::new(net[j * cu + i][0], net[j * cu + i][1], net[j * cu + i][2])).collect()).collect(); + let bsp = mt::BSplineSurface::try_new((mt::KnotVec::from(ku.to_vec()), mt::KnotVec::from(kv.to_vec())), rows).unwrap(); + let corner = |i: usize, j: usize| { + let c = net[j * cu + i]; + mt::Vertex::new(mt::Point3::new(c[0], c[1], c[2])) + }; + let v = [corner(0, 0), corner(cu - 1, 0), corner(cu - 1, cv - 1), corner(0, cv - 1)]; + let line = |a: &mt::Vertex, b: &mt::Vertex| mt::Edge::new(a, b, mt::Curve::Line(mt::Line(a.point(), b.point()))); + let wire: mt::Wire = vec![line(&v[0], &v[1]), line(&v[1], &v[2]), line(&v[2], &v[3]), line(&v[3], &v[0])].into(); + crate::surfaces::surface_body(vec![mt::Face::try_new(vec![wire], mt::Surface::BSplineSurface(bsp)).unwrap()]) + } + + #[test] + fn a_body_face_is_faired_with_its_edges_untouched_and_its_history_kept() { + // A sheet whose middle is bumped: fairing the face must smooth it without moving a single + // edge, vertex or neighbouring face of the body, and must leave a history saying so. + let (ku, kv) = (clamped(3, 3), clamped(3, 3)); + let (cu, cv) = (ku.len() - 4, kv.len() - 4); + let smooth = planar_net(&ku, &kv, [3, 3], [0.0, 0.0, 0.0], [20.0, 0.0, 0.0], [0.0, 15.0, 0.0]); + let mut rough = smooth.clone(); + for &(i, j, d) in &[(2usize, 2usize, 3.0), (3, 3, -2.0), (2, 3, 1.5)] { + rough[j * cu + i][2] += d; + } + let body = sheet(&ku, &kv, &rough); + let before: Vec<_> = + body.solid.face_iter().flat_map(|f| f.absolute_boundaries().iter()).flat_map(|w| w.edge_iter().map(|e| e.id())).collect(); + assert!(!before.is_empty()); + let (faired, report) = fair_faces(&body, &[0], &FairOptions::new(1.0, 6, false, 50.0).unwrap()).unwrap(); + let after: Vec<_> = + faired.solid.face_iter().flat_map(|f| f.absolute_boundaries().iter()).flat_map(|w| w.edge_iter().map(|e| e.id())).collect(); + eprintln!( + "face: energy {:e} → {:e} in {} steps, movement {:e} mm, {} faces, history {}", + report.energy_before, + report.energy_after, + report.steps, + report.movement, + faired.face_count(), + faired.history().is_some() + ); + assert_eq!(before, after, "the body's edges must be the very ones it had"); + assert_eq!(faired.face_count(), 1); + assert!(faired.history().is_some(), "the face came from the one it was faired from"); + assert!(report.energy_after < 1e-9 * report.energy_before); + // The face's own surface is back on the plane, boundary rows bit for bit as they were. + let Some(mt::Surface::BSplineSurface(s)) = faired.solid.face_iter().next().map(|f| f.surface()) else { panic!("a B-spline face") }; + for j in 0..cv { + for i in 0..cu { + let p = s.control_points()[i][j]; + let want = if i == 0 || i + 1 == cu || j == 0 || j + 1 == cv { rough[j * cu + i] } else { smooth[j * cu + i] }; + assert!(dist(&[p.x, p.y, p.z], &want) < 1e-6, "({i}, {j})"); + } + } + // A solid keeps its shells, its faces and its edges: thickening the sheet gives a closed + // body whose top face is still the B-spline one, and fairing that face leaves the body a + // solid of the same shape. + let solid = crate::thicken(&body, 2.0, false).unwrap(); + assert!(!solid.is_surface()); + let top = + (0..solid.face_count()).find(|&i| matches!(solid.solid.face_iter().nth(i).map(|f| f.surface()), Some(mt::Surface::BSplineSurface(_)))); + let Some(top) = top else { panic!("the thickened sheet keeps its B-spline face") }; + let edges: Vec<_> = + solid.solid.face_iter().flat_map(|f| f.absolute_boundaries().iter()).flat_map(|w| w.edge_iter().map(|e| e.id())).collect(); + let (faired, report) = fair_faces(&solid, &[top], &FairOptions::new(1.0, 6, false, 0.5).unwrap()).unwrap(); + eprintln!("thickened solid: energy {:e} → {:e}, movement {:e} mm", report.energy_before, report.energy_after, report.movement); + assert!(!faired.is_surface() && faired.face_count() == solid.face_count() && faired.shell_count() == solid.shell_count()); + assert_eq!( + faired.solid.face_iter().flat_map(|f| f.absolute_boundaries().iter()).flat_map(|w| w.edge_iter().map(|e| e.id())).collect::>(), + edges + ); + assert!(report.energy_after < report.energy_before); + // A face with no control points to fair is refused, by name. + let cube = crate::box_solid(Vec3::ZERO, Vec3::new(10.0, 10.0, 10.0)).unwrap(); + let refused = fair_faces(&cube, &[0], &FairOptions::new(1.0, 1, false, 1.0).unwrap()).unwrap_err(); + eprintln!("cube face: {refused}"); + assert!(refused.to_string().contains("not a B-spline face"), "{refused}"); + assert!(fair_faces(&body, &[7], &FairOptions::new(1.0, 1, false, 1.0).unwrap()).is_err(), "no such face"); + assert!(fair_faces(&body, &[], &FairOptions::new(1.0, 1, false, 1.0).unwrap()).is_err(), "no face picked"); + } + + #[test] + fn an_already_fair_curve_is_left_where_it_is() { + // Zero bending energy, no reason to move: nothing churns, and an input at the minimum + // cannot be faired into a worse shape. + let knots = clamped(4, 3); + let smooth = affine_curve(&knots, 3, [1.0, 2.0, 3.0], [5.0, -1.0, 0.5]); + let opts = FairOptions::new(1.0, 20, false, 10.0).unwrap(); + let faired = fair_curve(3, &knots, &smooth, &opts).unwrap(); + eprintln!( + "already fair: energy {:e} → {:e}, {} steps, {:e} mm", + faired.report.energy_before, faired.report.energy_after, faired.report.steps, faired.report.movement + ); + assert!(faired.report.energy_after <= faired.report.energy_before); + assert!(faired.report.energy_after >= 0.0); + assert!(faired.report.movement < 1e-9, "{:e}", faired.report.movement); + for (i, want) in smooth.iter().enumerate() { + assert!(dist(&faired.ctrl[i], want) < 1e-9, "control point {i}"); + } + } +} diff --git a/crates/kernel/src/lib.rs b/crates/kernel/src/lib.rs index 0376c6a7..22756f87 100644 --- a/crates/kernel/src/lib.rs +++ b/crates/kernel/src/lib.rs @@ -24,6 +24,7 @@ mod boolean_diagnostics; mod boolean_guard; mod boolean_record; mod bore_guard; +mod boundary; mod bridge; mod build; mod clearance; @@ -36,6 +37,7 @@ mod emboss; mod face_params; #[cfg(test)] mod face_source_tests; +mod fair; mod fill; mod freeform; pub mod fuzz; @@ -66,6 +68,7 @@ mod issue_871_tests; mod join_between_caps_tests; mod lip; mod loopblend; +mod matchsurf; mod measure; mod mesh_convert; mod meshbody; @@ -125,6 +128,7 @@ pub use blend_corner::fillet_radii; pub use blend_variable::{RadiusSpline, Taper, fillet_chord, fillet_tapered, fillet_variable, fillet_variable_points, fillet_variable_spline, taper}; pub use body::{Body, CapSignature, DISPLAY_ANGLE, EdgeInfo, FaceInfo, FacePaint, FaceSource, Paint}; pub use boolean_diagnostics::{BooleanDiagnostics, BooleanFallback, BooleanStrategy, capture_boolean_diagnostics}; +pub use boundary::{Boundary, boundary_patch}; pub use bridge::{Continuity, Frame, blend_between, bridge, chain, chain_closes, frames, frames_across, sample_grid}; pub use build::{ PathSeg, box_solid, canonical_revolve_axis, cylinder, extrude, extrude_tapered, extrude_tapered_between, loft, revolve, sphere, sweep, @@ -132,11 +136,16 @@ pub use build::{ }; pub use delete_face::delete_faces; pub use emboss::{cylinder_emboss_anchor, emboss_cylinder, emboss_cylinder_at, has_cylinder_emboss_wall, infer_cylinder_emboss}; +pub use fair::{ + FairCurve, FairNet, FairOptions, FairReport, MAX_FAIR_ITERATIONS, MAX_FAIR_POINTS, fair_bspline_curve, fair_bspline_surface, fair_curve, + fair_faces, fair_net, fair_nurbs_curve, fair_nurbs_surface, fair_surface, +}; pub use fill::{PATCH_ANGLE_TOL_DEG, PatchReport, PatchSpec, patch_edges_crowned, patch_edges_report, patch_edges_with}; pub use helix::{loft_to_point, sweep_helix, sweep_helix_mesh}; pub use iges_in::{MAX_IGES_BYTES, iges_import, iges_to_step}; pub use iges_out::iges_export_bodies; pub use lip::raise_band; +pub use matchsurf::{match_surface, seam_continuity}; pub use measure::{BodyMeasure, measure}; pub use mesh_convert::convert_prismatic_mesh; pub use meshbody::{MAX_TRIANGLES, mesh_body}; diff --git a/crates/kernel/src/matchsurf.rs b/crates/kernel/src/matchsurf.rs new file mode 100644 index 00000000..8134ea34 --- /dev/null +++ b/crates/kernel/src/matchsurf.rs @@ -0,0 +1,601 @@ +//! Surface matching: rebuild a surface body's face so that one boundary of it meets a picked +//! edge chain of another body up to a requested continuity (G1, G2 or G3), while the boundary +//! opposite it does not move. +//! +//! A match is the bridge core ([`crate::bridge`]) pointed at a different pair of boundaries. One +//! end reads its position, tangent, curvature and change of curvature from the *target's* face +//! along the picked chain — that is the end that moves. The other end reads them from the body's +//! own surface along the boundary opposite it, built through the original boundary's own points: +//! a match may shape the middle, never that seam. In between the cross-sections are the bridge's +//! cubic Hermites, whose crown is free, so the crown whose surface stays closest to the original +//! one — sampled on a grid and measured against it — is the one kept: a match moves the seam and +//! as little else as the conditions allow. +//! +//! Which boundary of the face moves is read off the geometry: the one nearest the picked chain. +//! The order a match may ask for is read off the target the same way: a chain that several faces +//! of the target meet, with shapes that part company, is a seam the target itself does not hold +//! beyond that order, and no surface can be told to carry a condition the target has not got. + +use mt::{BoundedCurve, ParametricCurve, ParametricSurface, ParametricSurface3D, SearchNearestParameter}; +use solidcraft_geom::Vec3; +use truck_modeling as mt; + +use crate::body::{Body, from_p3, p3}; +use crate::bridge::{self, Continuity, Frame}; +use crate::record::Rebuild; +use crate::surfaces::surface_body; +use crate::{KernelError, Result, guard}; + +/// Stations a match reads along the seam and along the boundary it keeps. +const STATIONS: usize = 33; + +/// Samples each way of the grid the rebuilt surface is compared with the original on. +const GRID: usize = 7; + +/// The crowns the match tries at each end: [`crate::bridge::bridge`]'s free knob, which shapes +/// the middle without touching either end's conditions. +const CROWNS: [f64; 5] = [-0.5, 0.0, 0.5, 1.0, 2.0]; + +/// Points a caller may pick one face with. +const MAX_PICKS: usize = 64; + +/// Samples per edge of a chain, for lengths and distances. +const PER_EDGE: usize = 32; + +/// A seam is credited with G1 when its normals agree this closely (degrees), with G2 when the +/// two curvature vectors agree within this fraction of the larger of them, and with G3 when the +/// change of curvature agrees within this fraction of the curvature over the body's size. +const G1_DEG: f64 = 0.05; +const G2_REL: f64 = 5e-3; +const G3_REL: f64 = 5e-2; + +/// Two faces of the target count as meeting each other at the picked chain when their normals +/// agree this closely, their curvature within this fraction of the larger, and their change of +/// curvature within this fraction of the curvature over the body's size. +const SUPPLY_DEG: f64 = 0.05; +const SUPPLY_REL: f64 = 2e-2; +const SUPPLY_BEND_REL: f64 = 1e-1; + +/// Rebuild the face of `body` picked by `faces` (points on it) so that its boundary nearest the +/// chain of `target`'s edges picked by `target_pick` takes that chain's place and repeats the +/// target's own shape along it up to `order` — position, tangent, curvature vector, and the +/// change of that curvature vector along the direction the match leaves in. The boundary +/// opposite keeps its place and the original surface's own frame, and the middle is shaped to +/// stay as close to the original surface as the conditions allow. +pub fn match_surface(body: &Body, faces: &[Vec3], target: &Body, target_pick: &[Vec3], order: Continuity) -> Result { + body.require_brep("match")?; + target.require_brep("match")?; + if !body.is_surface() { + return Err(KernelError::Invalid("match rebuilds a surface body: this one is closed".into())); + } + let face = face_near(body, faces)?; + let chain = bridge::chain(target, target_pick)?; + let near = nearest_side(&face, &chain)?; + let far = near.opposite(); + let far_edges = side_edges(&face, far, body.size() * 1e-6 + 1e-9)?; + let (mid_near, mid_far) = (chain_mid(&chain)?, Side::at(&face.surface(), &ranges(&face)?, far, 0.5)); + let leave = (mid_far - mid_near) + .normalized() + .filter(|l| l.is_finite()) + .ok_or_else(|| KernelError::Invalid("the far boundary sits on the picked chain: there is nothing to match".into()))?; + // Which face of the target the match continues from, and how much of the requested order the + // target itself holds along that chain. + let candidates = support_faces(target, &chain, leave)?; + let supply = supply_order(&candidates, &chain, leave, target.size())?; + if order.conditions() > supply.conditions() { + return Err(KernelError::Invalid(format!( + "the target's own surfaces part company at the picked edges: they hold only {} there, so a seam cannot hold {}", + supply.as_str(), + order.as_str() + ))); + } + let Some((target_face, _)) = candidates.first() else { + return Err(KernelError::Invalid("no face of the target holds the picked edges".into())); + }; + // The stations of the seam: what the target does there along the direction the match leaves + // in, and what the far boundary does coming back the other way. + let mut near_frames = bridge::frames(target_face, &chain, leave, STATIONS)?; + let far_frames = bridge::frames(&face, &far_edges, leave * -1.0, STATIONS)?; + // The two chains are sampled from their own starts: turn one round when that pairs the + // stations better (a match is built station to station). + let direct: f64 = near_frames.iter().zip(&far_frames).map(|(a, b)| a.p.dist(b.p)).sum(); + let reversed: f64 = near_frames.iter().zip(far_frames.iter().rev()).map(|(a, b)| a.p.dist(b.p)).sum(); + if reversed < direct { + near_frames.reverse(); + } + guard("surface match", || { + // The crown is the free knob: keep the one whose surface stays closest to the original. + let mut best: Option<(f64, mt::Face)> = None; + for crown_near in CROWNS { + for crown_far in CROWNS { + let made = bridge::bridge(&near_frames, &far_frames, [order, Continuity::G1], [crown_near, crown_far])?; + let Some(made) = made.solid.face_iter().next().cloned() else { + return Err(KernelError::Failed("match: the bridge made no face".into())); + }; + let stray = deviation(&made, &face)?; + if best.as_ref().is_none_or(|(b, _)| stray < *b) { + best = Some((stray, made)); + } + } + } + let Some((_, made)) = best else { + return Err(KernelError::Failed("match: no crown built a surface".into())); + }; + let mut kept = made; + // The rebuilt face takes the target's own sense at the seam: the two surfaces then meet + // the same way round, which is what a stitch, a thicken or a display of the result reads. + let seam = chain_mid(&chain)?; + if let (Some((made_n, _)), Some((target_n, _))) = (normal_near(&kept, seam), normal_near(target_face, seam)) + && made_n.dot(target_n) < 0.0 + { + kept.invert(); + } + let mut rec = Rebuild::default(); + rec.face(&kept, &face); + Ok(crate::record::rebuilt_body(surface_body(vec![kept]), &[&body.solid, &target.solid], &rec)) + }) +} + +/// How well the rebuilt surface `made` meets `target` along the chain picked by `target_pick`: +/// the worst distance from the seam to that chain, the worst angle between the two surfaces' +/// normals across it (degrees), and the highest continuity the seam holds +/// ([`Continuity::G0`] when even the normals disagree). +pub fn seam_continuity(made: &Body, target: &Body, target_pick: &[Vec3]) -> Result<(f64, f64, Continuity)> { + made.require_brep("match")?; + target.require_brep("match")?; + let chain = bridge::chain(target, target_pick)?; + let poly = chain_polyline(&chain)?; + // The face whose boundary runs along the chain: the one nearest it, so that a body that has + // not been matched yet — where the seam is still some way off — can be measured too. + let mid = chain_mid(&chain)?; + let face = made + .solid + .face_iter() + .filter_map(|f| face_distance(f, mid).map(|d| (d, f))) + .min_by(|a, b| a.0.total_cmp(&b.0)) + .map(|(_, f)| f.clone()) + .ok_or_else(|| KernelError::Failed("match: the body has no faces".into()))?; + let near = nearest_side(&face, &chain)?; + let far = near.opposite(); + let ranges = ranges(&face)?; + let mid_far = Side::at(&face.surface(), &ranges, far, 0.5); + let leave = (mid_far - chain_mid(&chain)?) + .normalized() + .ok_or_else(|| KernelError::Invalid("the seam and the far boundary coincide: there is nothing to measure".into()))?; + let candidates = support_faces(target, &chain, leave)?; + let Some((target_face, _)) = candidates.first() else { + return Err(KernelError::Invalid("no face of the target holds the picked edges".into())); + }; + let frames = bridge::frames(target_face, &chain, leave, STATIONS)?; + let size = target.size(); + guard("surface match", || { + let surf = face.surface(); + let (mut gap, mut deg, mut curv, mut bend) = (0.0f64, 0.0f64, 0.0f64, 0.0f64); + for i in 0..STATIONS { + let t = i as f64 / (STATIONS - 1) as f64; + let p = Side::at(&surf, &ranges, near, t); + gap = gap.max(chain_distance(&poly, p)); + // What the target says there, and what the rebuilt surface actually does there. + let Some(frame) = frames.iter().min_by(|a, b| a.p.dist(p).total_cmp(&b.p.dist(p))) else { + return Err(KernelError::Failed("match: the target has no frames".into())); + }; + let (_, t_made, bend_made, change_made) = seam_shape(&surf, &ranges, near, t)?; + if let Some((n_made, _)) = normal_near(&face, p) + && let Some((n_target, _)) = normal_near(target_face, p) + { + deg = deg.max(angle_deg(n_made, n_target)); + } + let scale = frame.bend.len().max(bend_made.len()).max(1.0 / size); + curv = curv.max((bend_made - frame.bend).len() / scale); + // The change of curvature is what a surface can hold: only its normal part counts, + // and it turns round with the direction of travel. + let change = if t_made.dot(frame.leave) < 0.0 { change_made * -1.0 } else { change_made }; + let scale3 = frame.bend_change.len().max(change.len()).max(scale / size); + bend = bend.max((change - frame.bend_change).len() / scale3); + } + let mut order = Continuity::G0; + if deg <= G1_DEG { + order = Continuity::G1; + if curv <= G2_REL { + order = Continuity::G2; + if bend <= G3_REL { + order = Continuity::G3; + } + } + } + Ok((gap, deg, order)) + }) +} + +/// Which side of a face's parameter rectangle a boundary runs along: the match reads its face as +/// a tensor patch, so its four sides are its own parameter lines. +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +enum Side { + /// The `u = u0` side (its points run along `v`). + U0, + /// The `u = u1` side. + U1, + /// The `v = v0` side (its points run along `u`). + V0, + /// The `v = v1` side. + V1, +} + +impl Side { + /// The four sides, in a fixed order. + const ALL: [Side; 4] = [Side::U0, Side::U1, Side::V0, Side::V1]; + + /// The side opposite this one: what a match keeps when this one moves. + fn opposite(self) -> Side { + match self { + Side::U0 => Side::U1, + Side::U1 => Side::U0, + Side::V0 => Side::V1, + Side::V1 => Side::V0, + } + } + + /// Whether this side pins `u` (its points run along `v`). + fn is_u(self) -> bool { + matches!(self, Side::U0 | Side::U1) + } + + /// The value this side pins, and the range the side runs over. + fn fixed_and_along(self, u: (f64, f64), v: (f64, f64)) -> (f64, (f64, f64)) { + match self { + Side::U0 => (u.0, v), + Side::U1 => (u.1, v), + Side::V0 => (v.0, u), + Side::V1 => (v.1, u), + } + } + + /// The point at the normalized station `t` along the side. + fn at(surf: &mt::Surface, ranges: &[(f64, f64); 2], side: Side, t: f64) -> Vec3 { + let (u, v) = (ranges[0], ranges[1]); + let (fixed, along) = side.fixed_and_along(u, v); + let t = along.0 + (along.1 - along.0) * t.clamp(0.0, 1.0); + if side.is_u() { from_p3(surf.subs(fixed, t)) } else { from_p3(surf.subs(t, fixed)) } + } +} + +/// The bounded parameter ranges of a face's surface. +fn ranges(face: &mt::Face) -> Result<[(f64, f64); 2]> { + let surf = face.surface(); + let (Some(u), Some(v)) = surf.try_range_tuple() else { + return Err(KernelError::Failed("match: the face's surface is unbounded".into())); + }; + Ok([u, v]) +} + +/// How far `p` is from the face's own surface. +fn face_distance(face: &mt::Face, p: Vec3) -> Option { + let surf = face.surface(); + let (u, v) = surf.search_nearest_parameter(p3(p), None, 100)?; + Some(from_p3(surf.subs(u, v)).dist(p)) +} + +/// The surface's unit normal at the point nearest `p`, and how far `p` is from that point. +fn normal_near(face: &mt::Face, p: Vec3) -> Option<(Vec3, f64)> { + let surf = face.surface(); + let (u, v) = surf.search_nearest_parameter(p3(p), None, 100)?; + let n = surf.normal(u, v); + let n = Vec3::new(n.x, n.y, n.z).normalized()?; + Some((n, from_p3(surf.subs(u, v)).dist(p))) +} + +/// The face of `body` the picks lie on: they must all pick the same one. A pick is a point the +/// caller clicked, so the face nearest it within the body's own pick tolerance is the face it +/// means (`crate::surfaces::edge_near` reads points the same way). +fn face_near(body: &Body, picks: &[Vec3]) -> Result { + if picks.is_empty() || picks.len() > MAX_PICKS || picks.iter().any(|p| !p.is_finite()) { + return Err(KernelError::Invalid(format!("pick 1 to {MAX_PICKS} points on the face to match"))); + } + let tol = body.size() * 0.05 + 1e-6; + let mut found: Option = None; + for p in picks { + let hit = body + .solid + .face_iter() + .filter_map(|f| face_distance(f, *p).map(|d| (d, f))) + .min_by(|a, b| a.0.total_cmp(&b.0)) + .filter(|(d, _)| *d <= tol) + .map(|(_, f)| f.clone()) + .ok_or_else(|| KernelError::Invalid(format!("no face of the body passes through {p:?}")))?; + if found.as_ref().is_some_and(|f| f.id() != hit.id()) { + return Err(KernelError::Invalid("the picks are on different faces: match one face".into())); + } + found = Some(hit); + } + found.ok_or_else(|| KernelError::Invalid("pick a point on the face to match".into())) +} + +/// A chain of edges as a polyline (each edge sampled), for lengths and distances. +fn chain_polyline(chain: &[mt::Edge]) -> Result> { + if chain.is_empty() { + return Err(KernelError::Invalid("the chain has no edges".into())); + } + let mut out = Vec::with_capacity(chain.len() * (PER_EDGE + 1)); + for e in chain { + let c = e.curve(); + let (t0, t1) = c.range_tuple(); + if !(t1 > t0) || ![t0, t1].into_iter().all(f64::is_finite) { + return Err(KernelError::Failed("match: an edge has no parameter range".into())); + } + for k in 0..=PER_EDGE { + out.push(from_p3(c.subs(t0 + (t1 - t0) * k as f64 / PER_EDGE as f64))); + } + } + Ok(out) +} + +/// The point at the middle of a chain, by length. +fn chain_mid(chain: &[mt::Edge]) -> Result { + let poly = chain_polyline(chain)?; + let mut cum = Vec::with_capacity(poly.len()); + cum.push(0.0); + for w in poly.windows(2) { + let (Some(a), Some(b)) = (w.first(), w.get(1)) else { continue }; + let Some(last) = cum.last().copied() else { break }; + cum.push(last + a.dist(*b)); + } + let total = cum.last().copied().unwrap_or(0.0); + if !(total > 1e-9) || !total.is_finite() { + return Err(KernelError::Invalid("the picked chain has no length".into())); + } + let half = total * 0.5; + let hi = cum.partition_point(|x| *x < half).clamp(1, poly.len().saturating_sub(1)); + let (Some(a), Some(b)) = (poly.get(hi - 1), poly.get(hi)) else { + return Err(KernelError::Failed("match: chain".into())); + }; + let (Some(&lo), Some(&up)) = (cum.get(hi - 1), cum.get(hi)) else { + return Err(KernelError::Failed("match: chain".into())); + }; + let span = up - lo; + let t = if span > 1e-12 { (half - lo) / span } else { 0.0 }; + Ok(*a + (*b - *a) * t) +} + +/// How far `p` is from a polyline. +fn chain_distance(poly: &[Vec3], p: Vec3) -> f64 { + let mut best = f64::INFINITY; + for w in poly.windows(2) { + let (Some(a), Some(b)) = (w.first(), w.get(1)) else { continue }; + let d = b.dist(*a); + let t = if d > 1e-12 { ((p - *a).dot(*b - *a) / (d * d)).clamp(0.0, 1.0) } else { 0.0 }; + best = best.min(p.dist(*a + (*b - *a) * t)); + } + best +} + +/// The side of the face's own parameter rectangle the picked chain sits nearest. +fn nearest_side(face: &mt::Face, chain: &[mt::Edge]) -> Result { + let surf = face.surface(); + let ranges = ranges(face)?; + let poly = chain_polyline(chain)?; + /// Samples of each side used to tell which one the chain runs along. + const SAMPLES: usize = 17; + let mut best: Option<(f64, Side)> = None; + for side in Side::ALL { + let mut total = 0.0; + for k in 0..SAMPLES { + let t = k as f64 / (SAMPLES - 1) as f64; + total += chain_distance(&poly, Side::at(&surf, &ranges, side, t)); + } + let mean = total / SAMPLES as f64; + if best.is_none_or(|(b, _)| mean < b) { + best = Some((mean, side)); + } + } + best.map(|(_, s)| s).ok_or_else(|| KernelError::Failed("match: the face has no sides".into())) +} + +/// The face's own edges that run along a side of its parameter rectangle, chained head to tail. +/// A match keeps the far side's own edges, so they must be a chain that runs on. +fn side_edges(face: &mt::Face, side: Side, tol: f64) -> Result> { + let surf = face.surface(); + let ranges = ranges(face)?; + let (fixed, along) = side.fixed_and_along(ranges[0], ranges[1]); + let band = (along.1 - along.0).abs().max(1e-12) * 1e-3; + let mut pool: Vec = Vec::new(); + for e in face.edge_iter() { + let c = e.curve(); + let (t0, t1) = c.range_tuple(); + let p = from_p3(c.subs(0.5 * (t0 + t1))); + let Some((u, v)) = surf.search_nearest_parameter(p3(p), None, 100) else { continue }; + if from_p3(surf.subs(u, v)).dist(p) > tol { + continue; + } + let got = if side.is_u() { u } else { v }; + if (got - fixed).abs() <= band { + pool.push(e.clone()); + } + } + if pool.is_empty() { + return Err(KernelError::Invalid("the face has no edges along the boundary a match would keep".into())); + } + let first = pool.remove(0); + let mut chain = vec![first]; + let mut end = match chain.first() { + Some(e) => e.back().clone(), + None => return Err(KernelError::Failed("match: chain".into())), + }; + while let Some(k) = pool.iter().position(|e| e.front().id() == end.id() || e.back().id() == end.id()) { + let e = pool.remove(k); + let e = if e.front().id() == end.id() { e } else { e.inverse() }; + end = e.back().clone(); + chain.push(e); + } + let mut start = match chain.first() { + Some(e) => e.front().clone(), + None => return Err(KernelError::Failed("match: chain".into())), + }; + while let Some(k) = pool.iter().position(|e| e.front().id() == start.id() || e.back().id() == start.id()) { + let e = pool.remove(k); + let e = if e.back().id() == start.id() { e } else { e.inverse() }; + start = e.front().clone(); + chain.insert(0, e); + } + if !pool.is_empty() { + return Err(KernelError::Invalid("the face's edges along that boundary do not run on from one another".into())); + } + Ok(chain) +} + +/// The faces of `target` that meet the chain and whose tangent plane holds the leave direction, +/// best first: the face a match continues from, and the ones it might have been read from. +fn support_faces(target: &Body, chain: &[mt::Edge], leave: Vec3) -> Result> { + let mid = chain_mid(chain)?; + let tol = target.size() * 1e-6 + 1e-9; + let mut out: Vec<(mt::Face, f64)> = Vec::new(); + for face in target.solid.face_iter() { + if !chain.iter().all(|e| face.edge_iter().any(|f| f.id() == e.id())) { + continue; + } + let Some((n, d)) = normal_near(face, mid) else { continue }; + if d > tol { + continue; + } + let score = (leave - n * leave.dot(n)).len(); + if score.is_finite() && score >= 0.2 { + out.push((face.clone(), score)); + } + } + if out.is_empty() { + return Err(KernelError::Invalid( + "no face of the target holds the picked edges in the direction the match leaves in: pick the chain of a face the surface can continue" + .into(), + )); + } + out.sort_by(|a, b| b.1.total_cmp(&a.1)); + Ok(out) +} + +/// The highest order the target itself holds along the chain: every face that meets those edges +/// and whose tangent plane holds the leave direction reads the chain's shape from its own +/// surface, and where two of them part company the target's own geometry jumps at the seam. +fn supply_order(candidates: &[(mt::Face, f64)], chain: &[mt::Edge], leave: Vec3, size: f64) -> Result { + let Some((first, best)) = candidates.first() else { + return Err(KernelError::Invalid("no face of the target holds the picked edges".into())); + }; + let keep: Vec<&mt::Face> = candidates.iter().filter(|(_, s)| *s >= 0.5 * best).map(|(f, _)| f).collect(); + let mut order = Continuity::G3; + if keep.len() < 2 { + return Ok(order); + } + let primary: Vec = bridge::frames(first, chain, leave, STATIONS)?; + for other in keep.iter().skip(1) { + // A face that cannot be read along the whole chain says nothing here: the face the match + // is built on is the one that must be able to supply it. + let Ok(other_frames) = bridge::frames(other, chain, leave, STATIONS) else { continue }; + let mut worst_deg = 0.0f64; + let mut worst = 0.0f64; + let mut worst_change = 0.0f64; + for (a, b) in primary.iter().zip(&other_frames) { + if let (Some((na, _)), Some((nb, _))) = (normal_near(first, a.p), normal_near(other, b.p)) { + worst_deg = worst_deg.max(angle_deg(na, nb)); + } + let scale = a.bend.len().max(b.bend.len()).max(1.0 / size); + worst = worst.max((a.bend - b.bend).len() / scale); + let scale3 = a.bend_change.len().max(b.bend_change.len()).max(scale / size); + worst_change = worst_change.max((a.bend_change - b.bend_change).len() / scale3); + } + if worst_deg > SUPPLY_DEG { + order = Continuity::G0; + } + if worst > SUPPLY_REL && order.conditions() > 1 { + order = Continuity::G1; + } + if worst_change > SUPPLY_BEND_REL && order.conditions() > 2 { + order = Continuity::G2; + } + } + Ok(order) +} + +/// The acute angle between two directions, in degrees. For two surfaces' normals this is the +/// angle between their tangent planes: a sheet has no inside, so which way a normal points says +/// nothing about whether the surfaces meet smoothly. +fn angle_deg(a: Vec3, b: Vec3) -> f64 { + let d = a.dot(b) / (a.len() * b.len()); + if !d.is_finite() { + return f64::NAN; + } + d.abs().clamp(0.0, 1.0).acos().to_degrees() +} + +/// The geometric shape of a surface curve at a point from its first three derivatives along the +/// curve: the same statement [`crate::bridge`] makes of a support surface — the unit tangent, the +/// curvature vector, and the arclength derivative of that curvature vector. +fn shape(d1: Vec3, d2: Vec3, d3: Vec3) -> Result<(Vec3, Vec3, Vec3)> { + let sigma = d1.len(); + if !(sigma > 1e-12) || !sigma.is_finite() { + return Err(KernelError::Failed("match: the seam's cross-section does not move".into())); + } + let t = d1 * (1.0 / sigma); + let tp = d2 * (1.0 / sigma) - d1 * (d1.dot(d2) / (sigma * sigma * sigma)); + let nn = d2 - t * d2.dot(t); + let np = d3 - t * d3.dot(t) - tp * d2.dot(t) - t * d2.dot(tp); + let kappa = np * (sigma * sigma) - nn * (2.0 * d1.dot(d2)); + let change = kappa * (1.0 / (sigma.powi(5))); + if ![t, nn, change].into_iter().all(Vec3::is_finite) { + return Err(KernelError::Failed("match: the seam's shape is not finite".into())); + } + Ok((t, nn * (1.0 / (sigma * sigma)), change)) +} + +/// The shape of a face's surface along its cross direction at the station `t`, read inwards from +/// the boundary `near` over five one-sided samples: the point, the unit tangent, the curvature +/// vector and the change of that curvature. The same finite difference [`crate::bridge::frames`] +/// reads a support surface with, so that a rebuilt seam can be compared with what it matched. +fn seam_shape(surf: &mt::Surface, ranges: &[(f64, f64); 2], near: Side, t: f64) -> Result<(Vec3, Vec3, Vec3, Vec3)> { + let (station, cross, at_start) = if near.is_u() { + (ranges[1].0 + (ranges[1].1 - ranges[1].0) * t, ranges[0], near == Side::U0) + } else { + (ranges[0].0 + (ranges[0].1 - ranges[0].0) * t, ranges[1], near == Side::V0) + }; + let span = (cross.1 - cross.0).abs().max(1e-12); + let h = span * 1e-3; + let c0 = if at_start { cross.0 } else { cross.1 }; + let sgn = if at_start { 1.0 } else { -1.0 }; + let at = |x: f64| if near.is_u() { from_p3(surf.subs(x, station)) } else { from_p3(surf.subs(station, x)) }; + let q: Vec = (0..5).map(|k| at(c0 + sgn * k as f64 * h)).collect(); + let (Some(&q0), Some(&q1), Some(&q2), Some(&q3), Some(&q4)) = (q.first(), q.get(1), q.get(2), q.get(3), q.get(4)) else { + return Err(KernelError::Failed("match: seam samples".into())); + }; + let d1 = (q0 * -25.0 + q1 * 48.0 + q2 * -36.0 + q3 * 16.0 + q4 * -3.0) * (sgn / (12.0 * h)); + let d2 = (q0 * 35.0 + q1 * -104.0 + q2 * 114.0 + q3 * -56.0 + q4 * 11.0) * (1.0 / (12.0 * h * h)); + let d3 = (q0 * -5.0 + q1 * 18.0 + q2 * -24.0 + q3 * 14.0 + q4 * -3.0) * (sgn / (2.0 * h * h * h)); + let (t, bend, change) = shape(d1, d2, d3)?; + Ok((q0, t, bend, change)) +} + +/// How far the rebuilt surface strays from the original one: the root mean square of the +/// distances from a grid of its samples to the original surface. +fn deviation(made: &mt::Face, original: &mt::Face) -> Result { + let (surf, os) = (made.surface(), original.surface()); + let ranges = ranges(made)?; + let mut sum = 0.0f64; + let mut n = 0usize; + for i in 0..GRID { + for j in 0..GRID { + let u = ranges[0].0 + (ranges[0].1 - ranges[0].0) * i as f64 / (GRID - 1) as f64; + let v = ranges[1].0 + (ranges[1].1 - ranges[1].0) * j as f64 / (GRID - 1) as f64; + let q = from_p3(surf.subs(u, v)); + let Some((a, b)) = os.search_nearest_parameter(p3(q), None, 100) else { continue }; + let d = from_p3(os.subs(a, b)).dist(q); + if d.is_finite() { + sum += d * d; + n += 1; + } + } + } + if n == 0 { + return Err(KernelError::Failed("match: the original surface cannot be sampled".into())); + } + Ok((sum / n as f64).sqrt()) +} + +#[cfg(test)] +#[path = "matchsurf_tests.rs"] +mod tests; diff --git a/crates/kernel/src/matchsurf_tests.rs b/crates/kernel/src/matchsurf_tests.rs new file mode 100644 index 00000000..f99066be --- /dev/null +++ b/crates/kernel/src/matchsurf_tests.rs @@ -0,0 +1,225 @@ +//! Tests of surface matching: a sheet is rebuilt to meet a cylinder's wall up to G1, G2 and G3, +//! its seam, its far boundary and its interior are measured, and what cannot be matched is +//! refused. + +use super::*; +use crate::bridge::{Continuity, Frame}; +use crate::build::SEAM_ANGLE; +use crate::{cylinder, stitch}; +use solidcraft_geom::Vec3; +use truck_modeling as mt; + +/// The radius of the cylinder a sheet is matched to, the radius the sheet starts at, its height, +/// and how far round the cylinder the sheet runs. +const R_TARGET: f64 = 10.0; +const R_SHEET: f64 = 11.0; +const HEIGHT: f64 = 30.0; +const SPAN: f64 = 0.6; + +/// A point on the vertical line at radius `r`, angle `a`, height `z` (Z up). +fn at(a: f64, r: f64, z: f64) -> Vec3 { + Vec3::new(r * a.cos(), r * a.sin(), z) +} + +/// The outward radial and the circumferential unit directions at the angle `a`. +fn radial(a: f64) -> Vec3 { + Vec3::new(a.cos(), a.sin(), 0.0) +} + +fn circ(a: f64) -> Vec3 { + Vec3::new(-a.sin(), a.cos(), 0.0) +} + +/// A cylindrical sheet of radius `r` between the angles `a0` and `a1`, `stations` high: the body +/// a match rebuilds. Its near boundary is the vertical line at `a0`, its far boundary at `a1`. +fn cylinder_sheet(r: f64, a0: f64, a1: f64, stations: usize) -> Body { + let mut a = Vec::new(); + let mut b = Vec::new(); + for i in 0..stations { + let z = HEIGHT * i as f64 / (stations - 1) as f64; + a.push(Frame { p: at(a0, r, z), leave: circ(a0), bend: radial(a0) * (-1.0 / r), bend_change: Vec3::ZERO }); + b.push(Frame { p: at(a1, r, z), leave: circ(a1) * -1.0, bend: radial(a1) * (-1.0 / r), bend_change: Vec3::ZERO }); + } + bridge::bridge(&a, &b, [Continuity::G2, Continuity::G2], [0.0, 0.0]).unwrap() +} + +/// The stock cylinder, and two picks on the vertical seam line of its wall. +fn cylinder_and_picks() -> (Body, [Vec3; 2]) { + let c = cylinder(Vec3::ZERO, Vec3::new(0.0, 0.0, 1.0), R_TARGET, HEIGHT).unwrap(); + (c, [at(SEAM_ANGLE, R_TARGET, 6.0), at(SEAM_ANGLE, R_TARGET, 24.0)]) +} + +/// The sheet of the usual shape, and a pick on its near boundary. +fn sheet_and_pick() -> (Body, [Vec3; 1]) { + (cylinder_sheet(R_SHEET, SEAM_ANGLE, SEAM_ANGLE + SPAN, 9), [at(SEAM_ANGLE, R_SHEET, HEIGHT * 0.5)]) +} + +/// The middle of the edge of `body`'s first face nearest `p`. +fn edge_at(body: &Body, p: Vec3) -> mt::Edge { + let face = body.solid.face_iter().next().unwrap(); + let mut best: Option<(f64, mt::Edge)> = None; + for e in face.edge_iter() { + let c = e.curve(); + let (t0, t1) = c.range_tuple(); + let m = from_p3(c.subs(0.5 * (t0 + t1))); + let d = m.dist(p); + if best.as_ref().is_none_or(|(b, _)| d < *b) { + best = Some((d, e.clone())); + } + } + best.unwrap().1 +} + +/// How far the rebuilt face's far boundary lies from the original one, in mm: the far row of the +/// rebuilt surface sampled at its own stations, against the original boundary edge's own points. +fn far_drift(made: &Body, sheet: &Body, far_mid: Vec3) -> f64 { + let face = made.solid.face_iter().next().unwrap(); + let surf = face.surface(); + let (Some((u0, u1)), Some((_, v1))) = surf.try_range_tuple() else { panic!("unbounded") }; + let edge = edge_at(sheet, far_mid); + let poly = chain_polyline(&[edge]).unwrap(); + let mut worst = 0.0f64; + for k in 0..=8 { + let p = from_p3(surf.subs(u0 + (u1 - u0) * k as f64 / 8.0, v1)); + worst = worst.max(chain_distance(&poly, p)); + } + worst +} + +/// What the rebuilt sheet does at the normalized station `t` of its matching boundary: the +/// point, the unit tangent, the curvature vector and the change of that curvature, read off the +/// finished surface (never from the construction). +fn seam_at(body: &Body, t: f64) -> (Vec3, Vec3, Vec3, Vec3) { + let face = body.solid.face_iter().next().unwrap(); + let ranges = super::ranges(face).unwrap(); + super::seam_shape(&face.surface(), &ranges, Side::V0, t).unwrap() +} + +/// The stations a seam is measured at, as fractions of its length. +fn stations() -> Vec { + (0..9).map(|k| k as f64 / 8.0).collect() +} + +#[test] +fn a_g2_match_meets_a_cylinder_with_its_own_curvature() { + let (target, picks) = cylinder_and_picks(); + let (sheet, pick) = sheet_and_pick(); + let made = match_surface(&sheet, &pick, &target, &picks, Continuity::G2).unwrap(); + // The rebuilt boundary has moved onto the picked line: the seam is on the cylinder's wall. + assert!(seam_at(&made, 0.5).0.dist(at(SEAM_ANGLE, R_TARGET, HEIGHT * 0.5)) < 1e-6, "the seam is on the picked line"); + let (gap, deg, order) = seam_continuity(&made, &target, &picks).unwrap(); + println!("g2: gap {gap:e} mm, normal {deg:e} deg, order {order:?}"); + assert!(gap < 1e-6, "position gap {gap:e}"); + assert!(deg < 0.01, "normal angle {deg}"); + assert!(order.conditions() >= Continuity::G2.conditions(), "{order:?}"); + // The curvature the cylinder bends with along the seam: matched to a thousandth of itself. + let want = radial(SEAM_ANGLE) * (-1.0 / R_TARGET); + let mut worst = 0.0f64; + for t in stations() { + worst = worst.max(seam_at(&made, t).2.dist(want) * R_TARGET); + } + println!("g2: worst curvature jump {worst:e} of the cylinder's own"); + assert!(worst < 1e-3, "curvature jump {worst:e}"); + // The far boundary did not move: it is built through the original boundary's own points and + // stays on the original edge between them to round-off. + let far = at(SEAM_ANGLE + SPAN, R_SHEET, HEIGHT * 0.5); + let drift = far_drift(&made, &sheet, far); + println!("g2: far boundary drift {drift:e} mm"); + assert!(drift < 1e-9, "the far boundary drifted {drift:e} mm"); + // The interior stays near the original: the crowning that leaves it closest. + let (face, original) = (made.solid.face_iter().next().unwrap().clone(), sheet.solid.face_iter().next().unwrap().clone()); + let stray = deviation(&face, &original).unwrap(); + println!("g2: interior stray {stray:.6} mm rms"); + // The seam moved 1 mm, so the face cannot be closer than that at the seam itself: over the + // whole face the root mean square distance is well under half of it. + assert!(stray < 0.6, "the interior strays {stray} mm"); +} + +#[test] +fn a_g1_match_holds_the_tangent_and_leaves_the_curvature_free() { + let (target, picks) = cylinder_and_picks(); + let (sheet, pick) = sheet_and_pick(); + let made = match_surface(&sheet, &pick, &target, &picks, Continuity::G1).unwrap(); + let (gap, deg, order) = seam_continuity(&made, &target, &picks).unwrap(); + let want = radial(SEAM_ANGLE) * (-1.0 / R_TARGET); + let worst = stations().into_iter().map(|t| seam_at(&made, t).2.dist(want) * R_TARGET).fold(0.0f64, f64::max); + println!("g1: gap {gap:e} mm, normal {deg:e} deg, order {order:?}, curvature jump {worst:e}"); + assert!(gap < 1e-6 && deg < 0.01, "position {gap:e}, normal {deg}"); + assert_eq!(order, Continuity::G1, "a tangent match leaves the curvature free"); + assert!(worst > 1e-3, "a G1 match need not hold the curvature: {worst:e}"); + // The far boundary is kept whatever the order. + let far = at(SEAM_ANGLE + SPAN, R_SHEET, HEIGHT * 0.5); + assert!(far_drift(&made, &sheet, far) < 1e-9); +} + +#[test] +fn a_g3_match_holds_the_change_of_curvature() { + let (target, picks) = cylinder_and_picks(); + let (sheet, pick) = sheet_and_pick(); + let made = match_surface(&sheet, &pick, &target, &picks, Continuity::G3).unwrap(); + let (gap, deg, order) = seam_continuity(&made, &target, &picks).unwrap(); + let want = radial(SEAM_ANGLE) * (-1.0 / R_TARGET); + let (mut bend, mut change) = (0.0f64, 0.0f64); + for t in stations() { + let (_, _, b, c) = seam_at(&made, t); + bend = bend.max(b.dist(want) * R_TARGET); + // A cylinder's curvature does not change in its own surface: the normal part of the + // change of curvature across the seam must be zero too. + change = change.max(c.dot(radial(SEAM_ANGLE)).abs() * R_TARGET * R_TARGET); + } + println!("g3: gap {gap:e} mm, normal {deg:e} deg, order {order:?}, curvature jump {bend:e}, change {change:e}"); + assert!(gap < 1e-6 && deg < 0.01, "position {gap:e}, normal {deg}"); + assert_eq!(order, Continuity::G3, "the seam holds the change of curvature"); + assert!(bend < 1e-3, "curvature jump {bend:e}"); + assert!(change < 1e-3, "change of curvature {change:e}"); + let far = at(SEAM_ANGLE + SPAN, R_SHEET, HEIGHT * 0.5); + assert!(far_drift(&made, &sheet, far) < 1e-9); +} + +#[test] +fn a_match_refuses_what_it_cannot_hold() { + let (target, picks) = cylinder_and_picks(); + let (sheet, pick) = sheet_and_pick(); + // No pick on the body's face, no pick on the target's edges, and picks that are not numbers. + assert!(match_surface(&sheet, &[], &target, &picks, Continuity::G1).is_err()); + assert!(match_surface(&sheet, &[Vec3::new(0.0, 0.0, 100.0)], &target, &picks, Continuity::G1).is_err()); + assert!(match_surface(&sheet, &[Vec3::new(f64::NAN, 0.0, 0.0)], &target, &picks, Continuity::G1).is_err()); + assert!(match_surface(&sheet, &vec![Vec3::ZERO; MAX_PICKS + 1], &target, &picks, Continuity::G1).is_err()); + assert!(match_surface(&sheet, &pick, &target, &[], Continuity::G1).is_err()); + // A pick that is not on the target at all, and one in the middle of its wall: no chain there. + assert!(match_surface(&sheet, &pick, &target, &[Vec3::new(100.0, 0.0, 15.0)], Continuity::G1).is_err()); + assert!(match_surface(&sheet, &pick, &target, &[Vec3::new(10.0, 0.0, 15.0)], Continuity::G1).is_err()); + // A body that is not a surface: the stock cylinder itself. + assert!(match_surface(&target, &[at(SEAM_ANGLE, R_TARGET, 15.0)], &target, &picks, Continuity::G1).is_err()); +} + +#[test] +fn a_target_that_jumps_in_curvature_supplies_only_g1() { + // Two sheets of the target meet along a line with the same tangent plane but different + // curvature: a cylinder's wall and the plane tangent to it there. The target itself does not + // hold the curvature along that line, so no match may be told to. + let wall = cylinder_sheet(R_TARGET, SEAM_ANGLE, SEAM_ANGLE + 0.5, 5); + let mut a = Vec::new(); + let mut b = Vec::new(); + for i in 0..5 { + let z = HEIGHT * i as f64 / 4.0; + let (p, q) = (at(SEAM_ANGLE, R_TARGET, z), at(SEAM_ANGLE, R_TARGET, z) + circ(SEAM_ANGLE) * 8.0); + a.push(Frame { p, leave: circ(SEAM_ANGLE), bend: Vec3::ZERO, bend_change: Vec3::ZERO }); + b.push(Frame { p: q, leave: circ(SEAM_ANGLE) * -1.0, bend: Vec3::ZERO, bend_change: Vec3::ZERO }); + } + let plane = bridge::bridge(&a, &b, [Continuity::G2, Continuity::G2], [0.0, 0.0]).unwrap(); + let joined = stitch(&[&wall, &plane], 1e-6).unwrap(); + assert_eq!(joined.solid.face_iter().count(), 2, "the two sheets sewed into one body"); + let picks = [at(SEAM_ANGLE, R_TARGET, 6.0), at(SEAM_ANGLE, R_TARGET, 24.0)]; + let (sheet, pick) = sheet_and_pick(); + // The seam is smooth enough to match, so G1 goes through; the curvature jumps there, so G2 + // and G3 do not. + assert!(match_surface(&sheet, &pick, &joined, &picks, Continuity::G1).is_ok()); + let err = match_surface(&sheet, &pick, &joined, &picks, Continuity::G2).unwrap_err().to_string(); + println!("refused g2: {err}"); + assert!(err.contains("only g1"), "{err}"); + assert!(match_surface(&sheet, &pick, &joined, &picks, Continuity::G3).is_err()); + // The plain cylinder, whose two wall faces are the same surface, supplies G3. + let (target, plain_picks) = cylinder_and_picks(); + assert!(match_surface(&sheet, &pick, &target, &plain_picks, Continuity::G3).is_ok()); +} diff --git a/crates/sketch/src/model.rs b/crates/sketch/src/model.rs index 493df7b0..65581877 100644 --- a/crates/sketch/src/model.rs +++ b/crates/sketch/src/model.rs @@ -1289,8 +1289,8 @@ impl Sketch { } /// Exact boundary segments of a free-form curve: ellipses as four conics, conics, fit - /// splines and control splines up to degree 3 as Béziers. None for other curves (and for - /// higher-degree splines, which stay polylines). + /// splines and control splines up to `MAX_BEZIER_DEGREE` as Béziers. None for other curves + /// (and for higher-degree splines, which stay polylines). pub fn exact_segs(&self, ci: usize) -> Option> { let cu = self.curves.get(ci)?; let pt = |i: &usize| self.point(*i); @@ -1326,6 +1326,17 @@ impl Sketch { } } + /// The exact [`Seg2`] pieces of a curve of any kind, in the curve's own direction of travel: + /// lines, circles and arcs from their analytic form, free-form curves through + /// [`Sketch::exact_segs`]. Empty for a curve with no exact pieces (a spline above + /// `solidcraft_geom::MAX_BEZIER_DEGREE`). + pub fn exact_pieces(&self, ci: usize) -> Vec { + match self.exact_segs(ci) { + Some(segs) => segs, + None => self.segs(ci), + } + } + /// Polyline of a free-form curve (ellipse, spline, conic); other curves: their segments' /// polylines. pub fn polyline(&self, ci: usize) -> Vec { @@ -1375,8 +1386,11 @@ impl Sketch { "e" } CurveKind::Spline { pts, control, degree, periodic } => { - if pts.len() < 2 || pts.len() > crate::curves::MAX_SPLINE_POINTS || !(1..=7).contains(degree) { - return Err(SketchError::Invalid("a spline needs 2 to 500 points and degree 1 to 7".into())); + if pts.len() < 2 || pts.len() > crate::curves::MAX_SPLINE_POINTS || !(1..=solidcraft_geom::MAX_BEZIER_DEGREE as u8).contains(degree) { + return Err(SketchError::Invalid(format!( + "a spline needs 2 to 500 points and degree 1 to {}", + solidcraft_geom::MAX_BEZIER_DEGREE + ))); } if *periodic { if *control || *degree != 3 { diff --git a/docs/screenshots/class-a-boundary.png b/docs/screenshots/class-a-boundary.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f436e963723c18e655a3a2fad6035947aa199a GIT binary patch literal 616830 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%0DOe&3*m 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

-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 literal 0 HcmV?d00001

fo0JRwh-zD=PXVxFn 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