ifc_material/layer/
usage.rs1use 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 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 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 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 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 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 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}