Fix #4078. Bug in IfcTester that didn't allow certain facets to be used as applicabilities. Also canonicalise facet ordering for convenience.

This commit is contained in:
Dion Moult
2023-12-06 15:06:11 +11:00
parent 298363c175
commit a70d1ac1ca
2 changed files with 10 additions and 5 deletions
+4 -1
View File
@@ -60,12 +60,15 @@ class Facet:
for i, name in enumerate(self.parameters): for i, name in enumerate(self.parameters):
setattr(self, name.replace("@", ""), parameters[i]) setattr(self, name.replace("@", ""), parameters[i])
def asdict(self): def asdict(self, clause_type):
results = {} results = {}
for name in self.parameters: for name in self.parameters:
value = getattr(self, name.replace("@", "")) value = getattr(self, name.replace("@", ""))
if value is not None: if value is not None:
results[name] = value if "@" in name else self.to_ids_value(value) results[name] = value if "@" in name else self.to_ids_value(value)
if clause_type == "applicability":
for key in ["@uri", "@instructions", "@minOccurs", "@maxOccurs"]:
results.pop(key, None)
return results return results
def parse(self, xml): def parse(self, xml):
+6 -4
View File
@@ -168,13 +168,15 @@ class Specification:
clause = getattr(self, clause_type) clause = getattr(self, clause_type)
if not clause: if not clause:
continue continue
facets = {}
for facet in clause: for facet in clause:
facet_type = type(facet).__name__ facet_type = type(facet).__name__
facet_type = facet_type[0].lower() + facet_type[1:] facet_type = facet_type[0].lower() + facet_type[1:]
if facet_type in results[clause_type]: facets.setdefault(facet_type, []).append(facet.asdict(clause_type))
results[clause_type][facet_type].append(facet.asdict()) # Canonicalise ordering as per XSD requirements
else: for facet_type in ("entity", "partOf", "classification", "attribute", "property", "material"):
results[clause_type][facet_type] = [facet.asdict()] if facet_type in facets:
results[clause_type][facet_type] = facets[facet_type]
return results return results
def parse(self, ids_dict): def parse(self, ids_dict):