Fix #3059. Implement IfcTester prohibited string templates (taking into account double negatives)

This commit is contained in:
Dion Moult
2023-11-28 17:20:20 +11:00
parent a464551644
commit 304acdccef
4 changed files with 38 additions and 6 deletions
@@ -82,7 +82,7 @@ class BIM_PT_styles(Panel):
row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id
if self.props.style_type == "IfcSurfaceStyle":
self.layout.label(text="Choose current style's aspect to edit:")
self.layout.label(text="Surface Style Element:")
col = self.layout.column(align=True)
row = col.row(align=True)
@@ -52,7 +52,7 @@ class IfcTesterProperties(PropertyGroup):
ifc_file: StringProperty(default="", name="IFC File")
should_load_from_memory: BoolProperty(default=False, name="Load from Memory")
generate_html_report: BoolProperty(default=False, name="Generate HTML report")
flag : BoolProperty(default=False, name="Flag failed entities")
flag: BoolProperty(default=False, name="Flag Failed Entities")
active_specification_index: IntProperty(name="Active Specification Index", update=update_active_specification_index)
old_index: IntProperty(name="", default=0)
active_failed_entity_index: IntProperty(name="Active Failed Entity Index")
+34 -2
View File
@@ -85,11 +85,16 @@ class Facet:
def filter(self, ifc_file, elements):
return [e for e in elements if self(e)]
def to_string(self, clause_type):
def to_string(self, clause_type, specification=None, requirement=None):
if clause_type == "applicability":
templates = self.applicability_templates
elif clause_type == "requirement":
templates = self.requirement_templates
is_prohibited = False
if specification.maxOccurs == 0:
is_prohibited = not is_prohibited
if requirement.maxOccurs == 0:
is_prohibited = not is_prohibited
templates = self.prohibited_templates if is_prohibited else self.requirement_templates
for template in templates:
total_variables = len(template) - len(template.replace("{", ""))
@@ -139,6 +144,10 @@ class Entity(Facet):
"Shall be {name} data of type {predefinedType}",
"Shall be {name} data",
]
self.prohibited_templates = [
"Shall not be {name} data of type {predefinedType}",
"Shall not be {name} data",
]
super().__init__(name, predefinedType, instructions)
def filter(self, ifc_file, elements):
@@ -192,6 +201,10 @@ class Attribute(Facet):
"The {name} shall be {value}",
"The {name} shall be provided",
]
self.prohibited_templates = [
"The {name} shall not be {value}",
"The {name} shall not be provided",
]
super().__init__(name, value, minOccurs, maxOccurs, instructions)
def filter(self, ifc_file, elements):
@@ -311,6 +324,13 @@ class Classification(Facet):
"Shall be classified as {value}",
"Shall be classified",
]
self.prohibited_templates = [
"Shall not have a {system} reference of {value}",
"Shall not be classified using {system}",
"Shall not be classified as {value}",
"Shall not be classified",
]
super().__init__(value, system, uri, minOccurs, maxOccurs, instructions)
def filter(self, ifc_file, elements):
@@ -370,6 +390,10 @@ class PartOf(Facet):
"An element must have an {relation} relationship with an {name}",
"An element must have an {relation} relationship",
]
self.prohibited_templates = [
"An element must not have an {relation} relationship with an {name}",
"An element must not have an {relation} relationship",
]
super().__init__(name, predefinedType, relation, minOccurs, maxOccurs, instructions)
def filter(self, ifc_file, elements):
@@ -584,6 +608,10 @@ class Property(Facet):
"{name} data shall be {value} and in the dataset {propertySet}",
"{name} data shall be provided in the dataset {propertySet}",
]
self.prohibited_templates = [
"{name} data shall not be {value} and in the dataset {propertySet}",
"{name} data shall not be provided in the dataset {propertySet}",
]
super().__init__(propertySet, name, value, datatype, uri, minOccurs, maxOccurs, instructions)
def filter(self, ifc_file, elements):
@@ -845,6 +873,10 @@ class Material(Facet):
"Shall have a material of {value}",
"Shall have a material",
]
self.prohibited_templates = [
"Shall not have a material of {value}",
"Shall not have a material",
]
super().__init__(value, uri, minOccurs, maxOccurs, instructions)
def filter(self, ifc_file, elements):
+2 -2
View File
@@ -106,7 +106,7 @@ class Console(Reporter):
for requirement in specification.requirements:
self.set_style("reset")
self.set_style("red") if requirement.failed_entities else self.set_style("green")
self.print(" " * 8 + requirement.to_string("requirement"))
self.print(" " * 8 + requirement.to_string("requirement", specification, requirement))
self.set_style("reset")
for i, element in enumerate(requirement.failed_entities[0:10]):
self.print(" " * 12, end="")
@@ -217,7 +217,7 @@ class Json(Reporter):
total_checks_pass += total_pass
requirements.append(
{
"description": requirement.to_string("requirement") if specification.maxOccurs != 0 else requirement.to_string("requirement").replace('shall', 'shall not'),
"description": requirement.to_string("requirement", specification, requirement),
"status": requirement.status,
"failed_entities": self.report_failed_entities(requirement),
"total_applicable": total_applicable,