pub struct ProducedElementMeshes {
pub meshes: Vec<MeshData>,
pub instance_occurrences: Vec<RawInstanceOccurrence>,
pub geometry_hash: Option<u64>,
pub geometry_aabb: Option<[f64; 6]>,
pub geometry_volume: Option<f64>,
pub geometry_closure: Option<GeometryClosure>,
pub csg_failures: FxHashMap<u32, Vec<BoolFailure>>,
pub degenerate_triangles_dropped: u64,
}Expand description
Everything one element produced.
Fields§
§meshes: Vec<MeshData>§instance_occurrences: Vec<RawInstanceOccurrence>#1623 Phase 2 don’t-bake output: this element’s occurrences of a repeated
IfcRepresentationMap that skipped the per-occurrence materialize. Empty
unless the router was armed with an instancing plan
(GeometryRouter::enable_output_instancing); the streaming finalize resolves
each into a crate::InstanceRecord against the shared template MeshData.
geometry_hash: Option<u64>Per-ELEMENT fingerprint, accumulated across all of the element’s
meshes in the native IFC frame (pre-split, pre-site-rotation).
None when hashing is off, nothing was produced, or the job is a
TypeProduct.
geometry_aabb: Option<[f64; 6]>The same pass’s world-space AABB, [minx, miny, minz, maxx, maxy, maxz]
in unquantized f64 world coordinates (the file’s RTC folded back in),
over every triangle corner the hasher saw. Some exactly when
Self::geometry_hash is Some, so the two stay index-parallel at the
FFI boundary.
Why the diff engine needs it: the hash conflates moved / reshaped / re-tessellated into one “different” bit. The box separates them — same extent at a new centre is a MOVE, a different extent is a reshape, an identical box with a different hash is retriangulation.
geometry_volume: Option<f64>The element’s enclosed volume in m³ from the SAME pass — Some ONLY
when the produced geometry was provably a single closed orientable
solid, None otherwise (#1891). None is the common case for
material-layered walls, open SurfaceModel geometry, and any element
assembled from more than one representation item.
Read ifc_lite_geometry::GeometryHasher::volume before widening any
clause of that gate: the alternative is not a slightly-off volume, it is
a confidently wrong one with nothing about it that looks wrong.
geometry_closure: Option<GeometryClosure>The folded per-segment topology verdict behind Self::geometry_volume
— which clause held and which refused. Some exactly when
Self::geometry_hash is. A model checker wants it: “open shell” and
“multi-item assembly” are different findings with different fixes.
csg_failures: FxHashMap<u32, Vec<BoolFailure>>CSG diagnostics recorded while producing THIS element, attributed by product id. The router is fully drained on return, so a warm router reused across a batch never leaks one element’s failures into the next. Failures from a superseded strategy (a fallback re-attempting the same cuts) are discarded — only the path that produced the returned meshes contributes.
degenerate_triangles_dropped: u64Triangles dropped by the f32-collapse degenerate-triangle backstop
(see the degenerate child module) across ALL of this element’s meshes.
Zero when the backstop is disabled or nothing was degenerate.
Request-local (scoped per produce_element_meshes call) so concurrent
passes never cross-contaminate. Non-zero also RETRACTS
Self::geometry_closure and Self::geometry_volume — the drop
happens after the verdict was taken and can open a certified shell.
Auto Trait Implementations§
impl Freeze for ProducedElementMeshes
impl RefUnwindSafe for ProducedElementMeshes
impl Send for ProducedElementMeshes
impl Sync for ProducedElementMeshes
impl Unpin for ProducedElementMeshes
impl UnsafeUnpin for ProducedElementMeshes
impl UnwindSafe for ProducedElementMeshes
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.