Skip to main content

Crate ifc_author

Crate ifc_author 

Source
Expand description

ifc-author — schema-checked construction and editing of IFC entities.

§Why this is not part of ifc-model

ifc_model::Model::push takes a type name and a positional Vec<Value>. That is the right primitive for a codec, which is reproducing a record it just parsed, and the wrong one for an application, which is inventing a record and has no way to know it got the arity right.

The fix is not typed setters on Model: the model is the L0 record core and must not depend on the schema tables. Authoring is therefore an L2 concern that borrows both. See ADR 0007.

§What is checked

FailureExample
Unknown entityIfcAnnotaton (typo)
Unknown attributeIfcAnnotation.Nmae
Attribute set twicetwo Name calls
Required attribute unsetIfcAnnotation with no GlobalId
Declared-type mismatcha string where IfcLengthMeasure is declared
Value form (ISO 10303-21)IFCAREAMEASURE(12.5) where IfcAreaMeasure, not a SELECT, is declared; a bare 1. where IfcValue is
Scalar/aggregate confusiona scalar where LIST OF is declared
Malformed GlobalIdnot 22 characters in IFC’s base-64 alphabet

Slot positions come from ifc_schema::Schema::attributes, which returns inherited attributes first — the ordering STEP records depend on.

§What is not checked

WHERE rules, inverse attributes, uniqueness, and cross-entity consistency. Those need a whole model rather than one entity, and ifc-validate owns them. This crate refuses obviously-wrong construction; it does not certify a valid file.

§Example

use ifc_author::EntityBuilder;
use ifc_model::Model;
use ifc_schema::Schema;

let schema = Schema::from_express(
    "SCHEMA IFC4;\n\
     TYPE IfcGloballyUniqueId = STRING; END_TYPE;\n\
     TYPE IfcLabel = STRING; END_TYPE;\n\
     ENTITY IfcAnnotation;\n\
       GlobalId : IfcGloballyUniqueId;\n\
       Name : OPTIONAL IfcLabel;\n\
     END_ENTITY;\n\
     END_SCHEMA;",
);

let mut model = Model::new();
let id = EntityBuilder::new(&schema, "IfcAnnotation")
    .text("GlobalId", "3vB2YO$MX4xv5uCqZZG05x")
    .text("Name", "Brandwand")
    .insert(&mut model)?;

assert_eq!(model.get(id).unwrap().text(1), Some("Brandwand"));

Structs§

ApplicationDraft
Authored fields for IfcApplication.
EntityBuilder
A partially-specified entity, checked against the schema on build.
EntityEditor
A schema-checked edit of one entity already present in a Model.
OrganizationDraft
Authored fields for IfcOrganization.
OwnerHistoryDraft
Authored fields for IfcOwnerHistory.
PersonDraft
Authored fields for IfcPerson.

Enums§

AuthorError
A refused construction.

Functions§

add_application
Stage an IfcApplication, the authoring tool recorded in ownership.
add_organization
Stage an IfcOrganization. Name is required by the schema.
add_owner_history
Stage an IfcOwnerHistory.
add_person
Stage an IfcPerson.
add_person_and_organization
Stage an IfcPersonAndOrganization, the IfcActorSelect used by IfcOwnerHistory.OwningUser.

Type Aliases§

AuthorResult
The result of a construction attempt.