Problem
axiolid_construct::half_space::bounded_half_space(boundary, plane, agreement, margin, tolerance) has no parameter through which an independent in-plane orientation for boundary can be supplied.
Internally, the function derives the boundary's 3D placement frame entirely from plane.normal (picks Vec3::X or Vec3::Y as reference depending on which is less parallel to the normal). There is no way to override that pick with an authored in-plane direction.
Why this matters (IFC consumer context)
IfcPolygonalBoundedHalfSpace.Position is an IfcAxis2Placement3D that is explicitly independent of BaseSurface: schema-wise the two need not share an origin or an orientation. PolygonalBoundary is a 2D curve lying in Position's XY plane, extruded along Position's +Z to build the clipping prism.
SolidOperation::BoundedHalfSpace (the graph relationship) does carry a placement: Transform3 field, but the compiler applies it only to the output mesh, after bounded_half_space already ran with only plane.normal to build the boundary's local basis (crates/execution/compile/src/compiler.rs, SolidOperation::BoundedHalfSpace arm). That post-hoc transform cannot retroactively fix the boundary's in-plane rotation relative to the clip plane -- by the time it runs, bounded_half_space has already committed to its own guessed X/Y.
Reproduction
Signature check against axiolid HEAD c144808d76ebf653b2183d6895192514d1838bfd:
pub fn bounded_half_space(
boundary: &Rings,
plane: Plane3,
agreement: bool,
margin: ClipMargin,
tolerance: Tolerance,
) -> GeomResult<TriMesh>
plane carries only origin+normal (2 DOF of orientation). There is no third parameter for the boundary's in-plane rotation about that normal, so any consumer whose source format authors an independent boundary frame (like IFC's Position) cannot round-trip it.
Acceptance criteria
bounded_half_space (or BoundedHalfSpace's graph contract) gains a way to supply an explicit in-plane basis/frame for the boundary, independent of the clip plane's own normal-derived guess.
- A test with a rotated boundary and a fixed clip plane produces a mesh footprint that follows the supplied frame, not the internal
Vec3::X/Vec3::Y heuristic.
- Existing callers that do not supply an explicit frame keep their current behavior (backward compatible default).
Problem
axiolid_construct::half_space::bounded_half_space(boundary, plane, agreement, margin, tolerance)has no parameter through which an independent in-plane orientation forboundarycan be supplied.Internally, the function derives the boundary's 3D placement frame entirely from
plane.normal(picksVec3::XorVec3::Yas reference depending on which is less parallel to the normal). There is no way to override that pick with an authored in-plane direction.Why this matters (IFC consumer context)
IfcPolygonalBoundedHalfSpace.Positionis anIfcAxis2Placement3Dthat is explicitly independent ofBaseSurface: schema-wise the two need not share an origin or an orientation.PolygonalBoundaryis a 2D curve lying in Position's XY plane, extruded along Position's +Z to build the clipping prism.SolidOperation::BoundedHalfSpace(the graph relationship) does carry aplacement: Transform3field, but the compiler applies it only to the output mesh, afterbounded_half_spacealready ran with onlyplane.normalto build the boundary's local basis (crates/execution/compile/src/compiler.rs,SolidOperation::BoundedHalfSpacearm). That post-hoc transform cannot retroactively fix the boundary's in-plane rotation relative to the clip plane -- by the time it runs,bounded_half_spacehas already committed to its own guessed X/Y.Reproduction
Signature check against axiolid HEAD
c144808d76ebf653b2183d6895192514d1838bfd:planecarries only origin+normal (2 DOF of orientation). There is no third parameter for the boundary's in-plane rotation about that normal, so any consumer whose source format authors an independent boundary frame (like IFC'sPosition) cannot round-trip it.Acceptance criteria
bounded_half_space(orBoundedHalfSpace's graph contract) gains a way to supply an explicit in-plane basis/frame for the boundary, independent of the clip plane's own normal-derived guess.Vec3::X/Vec3::Yheuristic.