Skip to main content

ifc_material/layer/
usage.rs

1//! `IfcMaterialLayerSetUsage` authored fields.
2
3use ifc_model::EntityId;
4
5use crate::view::{
6    borrowed_entity, optional_number, required_enum, required_number, required_ref, MaterialView,
7};
8use crate::{DirectionSense, LayerSetDirection, MaterialError, MaterialResult};
9
10borrowed_entity!(MaterialLayerSetUsage, "IFCMATERIALLAYERSETUSAGE");
11
12impl MaterialLayerSetUsage<'_> {
13    /// `IfcMaterialLayerSetUsage.ForLayerSet`. Required.
14    pub fn layer_set_id(self) -> MaterialResult<EntityId> {
15        required_ref(
16            "IFCMATERIALLAYERSETUSAGE",
17            self.id(),
18            self.entity(),
19            0,
20            "ForLayerSet",
21        )
22    }
23
24    /// `IfcMaterialLayerSetUsage.LayerSetDirection`. Required.
25    pub fn layer_set_direction(self) -> MaterialResult<LayerSetDirection> {
26        let token = required_enum(
27            "IFCMATERIALLAYERSETUSAGE",
28            self.id(),
29            self.entity(),
30            1,
31            "LayerSetDirection",
32        )?;
33        LayerSetDirection::parse(token).ok_or_else(|| MaterialError::InvalidValue {
34            entity: "IFCMATERIALLAYERSETUSAGE",
35            id: self.id(),
36            attribute: "LayerSetDirection",
37            value: token.to_owned(),
38        })
39    }
40
41    /// `IfcMaterialLayerSetUsage.DirectionSense`. Required.
42    pub fn direction_sense(self) -> MaterialResult<DirectionSense> {
43        let token = required_enum(
44            "IFCMATERIALLAYERSETUSAGE",
45            self.id(),
46            self.entity(),
47            2,
48            "DirectionSense",
49        )?;
50        DirectionSense::parse(token).ok_or_else(|| MaterialError::InvalidValue {
51            entity: "IFCMATERIALLAYERSETUSAGE",
52            id: self.id(),
53            attribute: "DirectionSense",
54            value: token.to_owned(),
55        })
56    }
57
58    /// `IfcMaterialLayerSetUsage.OffsetFromReferenceLine`. Required.
59    pub fn offset_from_reference_line(self) -> MaterialResult<f64> {
60        required_number(
61            "IFCMATERIALLAYERSETUSAGE",
62            self.id(),
63            self.entity(),
64            3,
65            "OffsetFromReferenceLine",
66        )
67    }
68
69    /// `IfcMaterialLayerSetUsage.ReferenceExtent`, if given. Must be
70    /// strictly positive when present.
71    pub fn reference_extent(self) -> MaterialResult<Option<f64>> {
72        let value = optional_number(
73            "IFCMATERIALLAYERSETUSAGE",
74            self.id(),
75            self.entity(),
76            4,
77            "ReferenceExtent",
78        )?;
79        if value.is_some_and(|value| value <= 0.0) {
80            return Err(MaterialError::InvalidValue {
81                entity: "IFCMATERIALLAYERSETUSAGE",
82                id: self.id(),
83                attribute: "ReferenceExtent",
84                value: "expected a positive length".to_owned(),
85            });
86        }
87        Ok(value)
88    }
89}
90
91impl<'m> MaterialView<'m> {
92    /// Iterates every `IfcMaterialLayerSetUsage` instance in the model.
93    pub fn layer_set_usages(self) -> impl Iterator<Item = MaterialLayerSetUsage<'m>> + 'm {
94        self.model()
95            .of_type("IFCMATERIALLAYERSETUSAGE")
96            .map(|(id, entity)| MaterialLayerSetUsage::from_known(id, entity))
97    }
98}