pub fn fillet_edges(
solid: &BrepSolid,
edge_points: &[Vec3],
edge_names: Option<&[String]>,
radius: f64,
chamfer: bool,
name: Option<&str>,
) -> Result<BrepSolid, String>Expand description
Fillet (or chamfer) a GROUP of edges as ONE operation, and — for fillets — round the convex “star” vertices where three or more of the selected edges meet (Golovanov §6.9.7). This is the whole multi-edge fillet in a single kernel call: the caller passes the object plus one 3D point on each edge, and the kernel orchestrates the filleting and corner blending against the full topology (so acute corners resolve coherently instead of being stitched edge-by-edge by the app). A corner the kernel cannot round (e.g. non-orthogonal beyond support, or a general no-common-ball star) is left as the edge fillets rather than failing the whole group.
When the WHOLE selection cannot be blended as one unit — a shared convex corner where a revolve axis/pole edge meets the adjacent cap edges can defeat the sequential corner surgery even though each edge and every proper SUBSET of the selection blends cleanly (the three fillets converge on the pole with no single end face across the corner) — we do NOT hard-reject the whole selection (which makes the app refuse it outright with “does not yet support the selected edge geometry”). Instead we blend the LARGEST subset of the selected edges that yields a VALID solid, dropping only the edge(s) that cannot co-blend at the corner. A selection that already composes is returned unchanged (byte-identical) — the subset search only runs after the full-group attempt errors.
edge_names (when Some) is the per-edge blend-FACE name parallel to
edge_points — each grown wall is named after ITS originating edge; None
names every wall with the single base name (the legacy/test behavior,
byte-identical to before). The whole *_edges family takes the same
edge_names slot in the same position.