implement material facet

added actual evaluation and extended current implementation with all possible ifc relations for materials.
This commit is contained in:
ArturTomczak
2021-06-11 17:10:54 +02:00
parent 9db01bc6cc
commit 65fa5768f2
+37 -19
View File
@@ -94,7 +94,6 @@ class entity(facet):
def __call__(self, inst, logger): def __call__(self, inst, logger):
# @nb with inheritance # @nb with inheritance
if self.predefinedtype and hasattr(inst, "PredefinedType"): if self.predefinedtype and hasattr(inst, "PredefinedType"):
# logger.debug("Testing if entity predefinedtype '%s' == '%s'", inst.PredefinedType, self.predefinedtype)
self.message = "an entity name '%(name)s' of predefined type '%(predefinedtype)s'" self.message = "an entity name '%(name)s' of predefined type '%(predefinedtype)s'"
return facet_evaluation( return facet_evaluation(
inst.is_a(self.name) and inst.PredefinedType == self.predefinedtype, inst.is_a(self.name) and inst.PredefinedType == self.predefinedtype,
@@ -130,10 +129,11 @@ class classification(facet):
) )
else: else:
return facet_evaluation( return facet_evaluation(
False, False,
"has no classification" "has no classification"
) )
class property(facet): class property(facet):
""" """
The IDS property facet implenented using `ifcopenshell.util.element` The IDS property facet implenented using `ifcopenshell.util.element`
@@ -146,7 +146,6 @@ class property(facet):
props = ifcopenshell.util.element.get_psets(inst) props = ifcopenshell.util.element.get_psets(inst)
pset = props.get(self.propertyset) pset = props.get(self.propertyset)
val = pset.get(self.name) if pset else None val = pset.get(self.name) if pset else None
logger.debug("Testing if property %s == %s", val, self.value)
di = { di = {
"name": self.name, "name": self.name,
@@ -158,35 +157,50 @@ class property(facet):
msg = self.message % di msg = self.message % di
else: else:
if pset: if pset:
msg = "a set '%(propertyset)s', but no property '%(name)s'" % di msg = "no property '%(name)s' in a set '%(propertyset)s'" % di
else: else:
msg = "no set '%(propertyset)s'" % di msg = "no set '%(propertyset)s'" % di
return facet_evaluation(val == self.value, msg) return facet_evaluation(
str(val) == str(self.value),
msg
)
class material(facet): class material(facet):
""" """
The IDS material facet The IDS material facet by traversing the HasAssociations inverse attribute
""" """
parameters = ["name", "value"] parameters = ["value"]
message = "a material '%(name)s with value '%(value)s'" message = "a material '%(value)s'"
def __call__(self, inst, logger): def __call__(self, inst, logger):
material_relations = [rel for rel in inst.HasAssociations if rel.is_a("IfcRelAssociatesMaterial")] material_relations = [rel for rel in inst.HasAssociations if rel.is_a("IfcRelAssociatesMaterial")]
names = [] materials = []
for rel in material_relations: for rel in material_relations:
# @todo not all subtypes of IfcMaterial handled #TODO test all subtypes of material definitions
if rel.RelatingMaterial.is_a() == "IfcMaterialLayerSetUsage": if rel.RelatingMaterial.is_a() == "IfcMaterial":
materials.append(rel.RelatingMaterial.Name)
elif rel.RelatingMaterial.is_a() == "IfcMaterialMaterialList": #DEPRECATED in IFC4
[materials.append(mat.Name) for mat in rel.RelatingMaterial]
elif rel.RelatingMaterial.is_a() == "IfcMaterialConstituentSet":
[materials.append(mat.Material.Name) for mat in rel.RelatingMaterial.MaterialConstituents]
elif rel.RelatingMaterial.is_a() == "IfcMaterialLayerSet":
[materials.append(mat.Name) for mat in rel.RelatingMaterial.MaterialLayers]
elif rel.RelatingMaterial.is_a() == "IfcMaterialLayerSetUsage":
layers = rel.RelatingMaterial.ForLayerSet.MaterialLayers layers = rel.RelatingMaterial.ForLayerSet.MaterialLayers
names = [layer.Material.Name for layer in layers] [materials.append(layer.Material.Name) for layer in layers]
elif rel.RelatingMaterial.is_a() == "IfcMaterial": elif rel.RelatingMaterial.is_a() == "IfcMaterialProfileSet":
names.append(rel.RelatingMaterial.Name) [materials.append(mat.Material.Name) for mat in rel.RelatingMaterial.MaterialProfiles]
elif rel.RelatingMaterial.is_a() == "IfcMaterialProfileSetUsage":
profileSets = rel.RelatingMaterial.ForProfileSet.MaterialProfiles
[materials.append(pset.Material.Name) for pset in profileSets]
else:
logger.error({'guid':inst.GlobalId, 'result':'ERROR', 'sentence':'IfcRelAssociatesMaterial not implemented'})
return facet_evaluation( return facet_evaluation(
0, self.value in materials,
# @todo self.message % {"value": self.value},
"[material_eval_todo]",
) )
@@ -199,9 +213,13 @@ class boolean_logic:
self.terms = terms self.terms = terms
def __call__(self, *args): def __call__(self, *args):
#TODO only takes one requirement of a type, should take all
eval = [t(*args) for t in self.terms] eval = [t(*args) for t in self.terms]
join = [" and ", " or "][self.fold == any] join = [" and ", " or "][self.fold == any]
return facet_evaluation(self.fold(eval), join.join(map(str, eval))) return facet_evaluation(
self.fold(eval),
join.join(map(str, eval))
)
def __str__(self): def __str__(self):
return [" and ", " or "][self.fold == any].join(map(str, self.terms)) return [" and ", " or "][self.fold == any].join(map(str, self.terms))