| 208 | self.is_ifc_version = None |
| 209 | |
| 210 | def asdict(self) -> dict[str, Any]: |
| 211 | results: dict[str, Any] = { |
| 212 | "@name": self.name, |
| 213 | "@ifcVersion": self.ifcVersion, |
| 214 | "applicability": {}, |
| 215 | "requirements": {}, |
| 216 | } |
| 217 | for attribute in ["identifier", "description", "instructions"]: |
| 218 | value = getattr(self, attribute) |
| 219 | if value is not None: |
| 220 | results[f"@{attribute}"] = value |
| 221 | for clause_type in ["applicability", "requirements"]: |
| 222 | clause = getattr(self, clause_type) |
| 223 | if not clause: |
| 224 | continue |
| 225 | facets = {} |
| 226 | for facet in clause: |
| 227 | facet_type = type(facet).__name__ |
| 228 | facet_type = facet_type[0].lower() + facet_type[1:] |
| 229 | facets.setdefault(facet_type, []).append(facet.asdict(clause_type)) |
| 230 | # Canonicalise ordering as per XSD requirements |
| 231 | for facet_type in ("entity", "partOf", "classification", "attribute", "property", "material"): |
| 232 | if facet_type in facets: |
| 233 | results[clause_type][facet_type] = facets[facet_type] |
| 234 | if clause_type == "applicability": |
| 235 | for attribute in ["minOccurs", "maxOccurs"]: |
| 236 | value = getattr(self, attribute) |
| 237 | if value is not None: |
| 238 | results[clause_type][f"@{attribute}"] = value |
| 239 | return results |
| 240 | |
| 241 | def parse(self, ids_dict): |
| 242 | self.name = ids_dict.get("@name", "") |