mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-29 03:37:21 +00:00
Fix #7212. IfcTester now supports IFC2X3 type element mapping.
This commit is contained in:
@@ -206,6 +206,12 @@ class Entity(Facet):
|
|||||||
except:
|
except:
|
||||||
# If the user has specified a class that doesn't exist in the version
|
# If the user has specified a class that doesn't exist in the version
|
||||||
results = []
|
results = []
|
||||||
|
if not self.name.endswith("TYPE"):
|
||||||
|
try:
|
||||||
|
for element_type in ifc_file.by_type(f"{self.name}Type"):
|
||||||
|
results.extend(ifcopenshell.util.element.get_types(element_type))
|
||||||
|
except:
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
results = []
|
results = []
|
||||||
ifc_classes = [t for t in ifc_file.wrapped_data.types() if t.upper() == self.name]
|
ifc_classes = [t for t in ifc_file.wrapped_data.types() if t.upper() == self.name]
|
||||||
@@ -223,7 +229,15 @@ class Entity(Facet):
|
|||||||
is_pass = inst.is_a().upper() == self.name
|
is_pass = inst.is_a().upper() == self.name
|
||||||
reason = None
|
reason = None
|
||||||
|
|
||||||
if not is_pass:
|
if (
|
||||||
|
not is_pass
|
||||||
|
and inst.file.schema == "IFC2X3"
|
||||||
|
and not self.name.endswith("TYPE")
|
||||||
|
and (element_type := ifcopenshell.util.element.get_type(inst))
|
||||||
|
):
|
||||||
|
is_pass = element_type.is_a().upper() == f"{self.name}TYPE"
|
||||||
|
reason = {"type": "NAME", "actual": element_type.is_a().upper()[:-4]}
|
||||||
|
elif not is_pass:
|
||||||
reason = {"type": "NAME", "actual": inst.is_a().upper()}
|
reason = {"type": "NAME", "actual": inst.is_a().upper()}
|
||||||
|
|
||||||
if is_pass and self.predefinedType:
|
if is_pass and self.predefinedType:
|
||||||
|
|||||||
@@ -230,6 +230,32 @@ class TestEntity:
|
|||||||
wall3 = ifcopenshell.api.root.create_entity(ifc, ifc_class="IfcWall", predefined_type="BAZFOO")
|
wall3 = ifcopenshell.api.root.create_entity(ifc, ifc_class="IfcWall", predefined_type="BAZFOO")
|
||||||
run("Restrictions an be specified for the predefined type 3/3", facet=facet, inst=wall3, expected=False)
|
run("Restrictions an be specified for the predefined type 3/3", facet=facet, inst=wall3, expected=False)
|
||||||
|
|
||||||
|
def test_ifc2x3_occurrence_type_mapping(self):
|
||||||
|
set_facet("entity")
|
||||||
|
|
||||||
|
ifc = ifcopenshell.file(schema="IFC2X3")
|
||||||
|
application = ifcopenshell.api.owner.add_application(ifc)
|
||||||
|
person = ifcopenshell.api.owner.add_person(
|
||||||
|
ifc, identification="LPARTEE", family_name="Partee", given_name="Leeable"
|
||||||
|
)
|
||||||
|
organisation = ifcopenshell.api.owner.add_organisation(
|
||||||
|
ifc, identification="AWB", name="Architects Without Ballpens"
|
||||||
|
)
|
||||||
|
user = ifcopenshell.api.owner.add_person_and_organisation(ifc, person=person, organisation=organisation)
|
||||||
|
ifcopenshell.api.owner.settings.get_user = lambda x: user
|
||||||
|
ifcopenshell.api.owner.settings.get_application = lambda x: application
|
||||||
|
|
||||||
|
element = ifcopenshell.api.root.create_entity(ifc, "IfcFlowTerminal")
|
||||||
|
element_type = ifcopenshell.api.root.create_entity(ifc, "IfcAirTerminalType")
|
||||||
|
ifcopenshell.api.type.assign_type(ifc, related_objects=[element], relating_type=element_type)
|
||||||
|
facet = Entity(name="IFCAIRTERMINAL")
|
||||||
|
assert facet.filter(ifc) == [element]
|
||||||
|
run("In IFC2X3 the type class is checked instead 1/2", facet=facet, inst=element, expected=True)
|
||||||
|
|
||||||
|
facet = Entity(name="IFCELECTRICAPPLIANCE")
|
||||||
|
assert facet.filter(ifc) == []
|
||||||
|
run("In IFC2X3 the type class is checked instead 2/2", facet=facet, inst=element, expected=False)
|
||||||
|
|
||||||
def test_to_string_required_applicability(self):
|
def test_to_string_required_applicability(self):
|
||||||
spec = ifctester.ids.Specification(name="Foo", minOccurs=1, maxOccurs="unbounded")
|
spec = ifctester.ids.Specification(name="Foo", minOccurs=1, maxOccurs="unbounded")
|
||||||
facet = Entity(name="IFCWALL")
|
facet = Entity(name="IFCWALL")
|
||||||
|
|||||||
Reference in New Issue
Block a user