mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 10:11:46 +00:00
Fix bug where element types couldn't get psets applied to them due to lack of specificity in IFC templates
This commit is contained in:
@@ -20,6 +20,7 @@ import re
|
|||||||
import pathlib
|
import pathlib
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import ifcopenshell.util.schema
|
import ifcopenshell.util.schema
|
||||||
|
import ifcopenshell.util.type
|
||||||
from ifcopenshell.entity_instance import entity_instance
|
from ifcopenshell.entity_instance import entity_instance
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from typing import List, Generator, Optional
|
from typing import List, Generator, Optional
|
||||||
@@ -98,6 +99,16 @@ class PsetQto:
|
|||||||
applicable_class = match.group(1)
|
applicable_class = match.group(1)
|
||||||
if ifcopenshell.util.schema.is_a(entity, applicable_class):
|
if ifcopenshell.util.schema.is_a(entity, applicable_class):
|
||||||
return True
|
return True
|
||||||
|
# There is an implementer agreement that if the template type is
|
||||||
|
# type based, the type need not be explicitly mentioned
|
||||||
|
# https://github.com/buildingSMART/IFC4.3.x-development/issues/22
|
||||||
|
# This will be fixed in IFC4.3
|
||||||
|
template_type = template_type or ""
|
||||||
|
if "TYPE" in template_type and ifcopenshell.util.schema.is_a(entity, "IfcTypeObject"):
|
||||||
|
types = ifcopenshell.util.type.get_applicable_types(applicable_class, "IFC4")
|
||||||
|
for ifc_type in types:
|
||||||
|
if ifcopenshell.util.schema.is_a(entity, ifc_type):
|
||||||
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@lru_cache()
|
@lru_cache()
|
||||||
|
|||||||
@@ -41,3 +41,10 @@ class TestPsetQto:
|
|||||||
names = self.pset_qto.get_applicable_names("IfcAudioVisualAppliance", predefined_type="AMPLIFIER")
|
names = self.pset_qto.get_applicable_names("IfcAudioVisualAppliance", predefined_type="AMPLIFIER")
|
||||||
assert "Pset_AudioVisualApplianceTypeAmplifier" in names
|
assert "Pset_AudioVisualApplianceTypeAmplifier" in names
|
||||||
assert len(names) == 18
|
assert len(names) == 18
|
||||||
|
|
||||||
|
def test_getting_a_pset_of_a_type_where_the_type_class_is_not_explicitly_applicable(self):
|
||||||
|
names = self.pset_qto.get_applicable_names("IfcWall")
|
||||||
|
assert "Pset_WallCommon" in names
|
||||||
|
names = self.pset_qto.get_applicable_names("IfcWallType")
|
||||||
|
assert len(names) == 9
|
||||||
|
assert "Pset_WallCommon" in names
|
||||||
|
|||||||
Reference in New Issue
Block a user