Skip to content

bounded_half_space has no independent in-plane frame for the boundary; cannot represent IfcPolygonalBoundedHalfSpace.Position #93

Description

@GeneralPawz

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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

needs-triageFiled but not yet accepted, sized, or scheduled

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions