Skip to main content

Crate ifc_spatial

Crate ifc_spatial 

Source
Expand description

ifc-spatial — containment and objectified relationship traversal.

§The problem

IFC stores no parent pointers. A wall does not name its storey; a separate IfcRelContainedInSpatialStructure entity names both ends. Asking “which elements are on this storey” therefore means finding relationship entities and reading the right attribute slot — and the two relationships that build the tree disagree about which slot is which:

IfcRelAggregates                    4 = RelatingObject   5 = RelatedObjects
IfcRelContainedInSpatialStructure   4 = RelatedElements  5 = RelatingStructure

Assuming a uniform layout inverts containment silently: elements become the parents of their storey, and every downstream answer is wrong in a way no type error catches.

§Example

use ifc_spatial::{SpatialKind, SpatialTree};

let tree = SpatialTree::build(&model);

for storey in tree.of_kind(SpatialKind::Storey) {
    let elements = tree.elements_of(storey.id);
    println!("storey {:?} holds {} elements", storey.id, elements.len());
}

§Tolerating real files

The canonical hierarchy is project → site → building → storey → element, and real exports deviate: omitted sites, elements hung directly off a building, duplicate storeys, relationships naming entities that are not in the file. The tree records what the file says and reports anomalies through SpatialTree::orphans and SpatialTree::dangling rather than asserting the ideal shape or panicking.

§Boundaries

This crate reads containment. It does not validate it — ifc-validate owns WHERE rules and cardinality — and it does not interpret geometry or properties of the elements it groups.

§Releases

The release features (ifc2x3, ifc4, ifc4x1, ifc4x2, ifc4x3, all on by default) choose which schema tables are linked. Classification needs one of the three it is verified against – IFC2X3, IFC4 or IFC4X3 – because without a table nothing would classify as a container and every tree would be silently empty; a build naming none of them is refused at compile time.

Re-exports§

pub use relation::BoundaryExposure;
pub use relation::BoundaryPhysicality;
pub use relation::ConnectionGeometryAnomaly;
pub use relation::Relationship;
pub use relation::RelationshipIndex;
pub use relation::RelationshipKind;
pub use relation::SpaceBoundary;
pub use facility::create_facility;
pub use facility::create_facility_with_owner_history;
pub use facility::Facility;
pub use facility::FacilityDraft;
pub use facility::FacilityError;
pub use facility::FacilityResult;
pub use authoring::aggregate;
pub use authoring::aggregate_with_owner_history;
pub use authoring::connect_path_elements;
pub use authoring::connect_path_elements_with_owner_history;
pub use authoring::contain;
pub use authoring::contain_with_owner_history;
pub use authoring::create_external_spatial_element;
pub use authoring::create_external_spatial_element_with_owner_history;
pub use authoring::create_project;
pub use authoring::create_project_library;
pub use authoring::create_project_library_with_owner_history;
pub use authoring::create_project_with_owner_history;
pub use authoring::create_space_boundary;
pub use authoring::create_space_boundary_with_owner_history;
pub use authoring::create_spatial_element;
pub use authoring::create_spatial_element_with_owner_history;
pub use authoring::BoundaryDraft;
pub use authoring::BoundaryLevel;
pub use authoring::ExternalSpatialDraft;
pub use authoring::ProjectLibraryDraft;
pub use authoring::SpatialAuthoringError;
pub use authoring::SpatialAuthoringResult;
pub use authoring::SpatialDraft;

Modules§

authoring
Transactional authoring of the spatial structure.
facility
Facilities and facility parts: the non-building spatial containers.
relation
Objectified relationship access.

Structs§

SpatialNode
One entity’s place in the containment tree.
SpatialTree
The containment tree of one model.

Enums§

SchemaVersion
The IFC release a tree classifies against (re-exported from ifc-schema). Which IFC schema version a table describes.
SpatialAnomaly
A statement of the file the tree could not honour, recorded instead of silently dropped.
SpatialKind
The spatial role of an entity, as far as containment is concerned.