Support IDS tests for nest relationships in IFC2X3

This commit is contained in:
Dion Moult
2024-06-20 15:53:28 +10:00
parent d92679223e
commit d700262e7f
2 changed files with 6 additions and 27 deletions
+6 -26
View File
@@ -547,7 +547,7 @@ class PartOf(Facet):
is_pass = False is_pass = False
reason = {"type": "PREDEFINEDTYPE", "actual": predefined_type} reason = {"type": "PREDEFINEDTYPE", "actual": predefined_type}
elif self.relation == "IFCRELNESTS": elif self.relation == "IFCRELNESTS":
nest = self.get_nested_whole(inst) nest = ifcopenshell.util.element.get_nest(inst)
is_pass = nest is not None is_pass = nest is not None
if not is_pass: if not is_pass:
reason = {"type": "NOVALUE"} reason = {"type": "NOVALUE"}
@@ -565,17 +565,17 @@ class PartOf(Facet):
else: else:
is_pass = True is_pass = True
break break
nest = self.get_nested_whole(nest) nest = ifcopenshell.util.element.get_nest(nest)
if not is_pass: if not is_pass:
reason = {"type": "ENTITY", "actual": ancestors} reason = {"type": "ENTITY", "actual": ancestors}
elif self.relation == "IFCRELVOIDSELEMENT IFCRELFILLSELEMENT": elif self.relation == "IFCRELVOIDSELEMENT IFCRELFILLSELEMENT":
if inst.is_a("IfcOpeningElement"): if inst.is_a("IfcOpeningElement"):
building_element = self.get_voided_element(inst) building_element = ifcopenshell.util.element.get_voided_element(inst)
else: else:
building_element = None building_element = None
opening = self.get_filled_opening(inst) opening = ifcopenshell.util.element.get_filled_void(inst)
if opening: if opening:
building_element = self.get_voided_element(opening) building_element = ifcopenshell.util.element.get_voided_element(opening)
is_pass = building_element is not None is_pass = building_element is not None
if not is_pass: if not is_pass:
reason = {"type": "NOVALUE"} reason = {"type": "NOVALUE"}
@@ -593,33 +593,13 @@ class PartOf(Facet):
return PartOfResult(not is_pass, {"type": "PROHIBITED"}) return PartOfResult(not is_pass, {"type": "PROHIBITED"})
return PartOfResult(is_pass, reason) return PartOfResult(is_pass, reason)
def get_nested_whole(self, element):
for rel in getattr(element, "Nests", []) or []:
return rel.RelatingObject
def get_voided_element(self, element):
for rel in getattr(element, "VoidsElements", []) or []:
return rel.RelatingBuildingElement
def get_filled_opening(self, element):
for rel in getattr(element, "FillsVoids", []) or []:
return rel.RelatingOpeningElement
def get_parent(self, element): def get_parent(self, element):
parent = ifcopenshell.util.element.get_aggregate(element) parent = ifcopenshell.util.element.get_parent(element)
if not parent:
parent = ifcopenshell.util.element.get_container(element, should_get_direct=True)
if not parent: if not parent:
for rel in getattr(element, "HasAssignments", []) or []: for rel in getattr(element, "HasAssignments", []) or []:
if rel.is_a("IfcRelAssignsToGroup"): if rel.is_a("IfcRelAssignsToGroup"):
parent = rel.RelatingGroup parent = rel.RelatingGroup
break break
if not parent:
self.get_nested_whole(element)
if not parent:
self.get_voided_element(element)
if not parent:
self.get_filled_opening(element)
return parent return parent
-1
View File
@@ -21,7 +21,6 @@ import os
import re import re
import sys import sys
import math import math
import logging
import datetime import datetime
import ifcopenshell import ifcopenshell
import ifcopenshell.util.unit import ifcopenshell.util.unit