ifc_material/usage/
assignment.rs1use ifc_model::EntityId;
4
5use crate::view::{
6 borrowed_entity, optional_text, required_ref, required_refs, required_text, MaterialView,
7};
8use crate::MaterialResult;
9
10borrowed_entity!(MaterialAssignment, "IFCRELASSOCIATESMATERIAL");
11
12impl<'m> MaterialAssignment<'m> {
13 pub fn global_id(self) -> MaterialResult<&'m str> {
15 required_text(
16 "IFCRELASSOCIATESMATERIAL",
17 self.id(),
18 self.entity(),
19 0,
20 "GlobalId",
21 )
22 }
23
24 pub fn name(self) -> MaterialResult<Option<&'m str>> {
26 optional_text(
27 "IFCRELASSOCIATESMATERIAL",
28 self.id(),
29 self.entity(),
30 2,
31 "Name",
32 )
33 }
34
35 pub fn description(self) -> MaterialResult<Option<&'m str>> {
37 optional_text(
38 "IFCRELASSOCIATESMATERIAL",
39 self.id(),
40 self.entity(),
41 3,
42 "Description",
43 )
44 }
45
46 pub fn related_object_ids(self) -> MaterialResult<Vec<EntityId>> {
49 required_refs(
50 "IFCRELASSOCIATESMATERIAL",
51 self.id(),
52 self.entity(),
53 4,
54 "RelatedObjects",
55 1,
56 )
57 }
58
59 pub fn relating_material_id(self) -> MaterialResult<EntityId> {
62 required_ref(
63 "IFCRELASSOCIATESMATERIAL",
64 self.id(),
65 self.entity(),
66 5,
67 "RelatingMaterial",
68 )
69 }
70}
71
72impl<'m> MaterialView<'m> {
73 pub fn assignments(self) -> impl Iterator<Item = MaterialAssignment<'m>> + 'm {
75 self.model()
76 .of_type("IFCRELASSOCIATESMATERIAL")
77 .map(|(id, entity)| MaterialAssignment::from_known(id, entity))
78 }
79
80 pub fn assignments_for(self, object: EntityId) -> MaterialResult<Vec<MaterialAssignment<'m>>> {
85 let mut matches = Vec::new();
86 for assignment in self.assignments() {
87 if assignment.related_object_ids()?.contains(&object) {
88 matches.push(assignment);
89 }
90 }
91 Ok(matches)
92 }
93}