ocs_doc_api: outstanding methods — loft + bulge-arc polyline profiles

- Loft{profiles} op (append-only); executor resolves each profile to curve sets
  all-or-nothing; backend loft() -> brep::loft on XY plane; facade solids().loft.
- entity_to_profile_curves: convert LwVertex.bulge to geom2d::Curve::Arc via
  bulge_arc_segment (theta = 4*atan(bulge)), so bulged polyline profiles sweep
  correctly instead of erroring Unsupported.
- spec loft; api_reference + binding_schema regenerated; mocks + baseline.
- Tests: loft_two_profiles_produces_solid, bulge_arc_polyline_profile_converts_to_arc
  (semicircle radius=5 for bulge=1) -> 612 host lib + 3 consistency green.
This commit is contained in:
Sebastian committed 2026-09-06 10:44:37 +02:00
1 parent 46a5922520
commit e216a7bf94
13 files changed
+176 -21

No files matched your search

+7
View File
@@ -452,6 +452,13 @@ impl SolidCollection {
.ok_or_else(|| ApiError::Transport("revolve returned no id".into()))?;
Ok(Solid::new(self.session.clone(), id))
}
/// Loft a solid through >= 2 profile entities (polylines/circles/arcs).
pub fn loft(&self, profiles: &[impl HasId]) -> ApiResult<Solid> {
let ids: Vec<ObjectId> = profiles.iter().map(|p| p.id()).collect();
let receipt = self.session.apply_op(Operation::Loft { profiles: ids })?;
let id = receipt.outcome.and_then(|o| o.new_id()).ok_or_else(|| ApiError::Transport("loft returned no id".into()))?;
Ok(Solid::new(self.session.clone(), id))
}
}
#[derive(Clone)]