Implement guid facet in facet selector

This commit is contained in:
Dion Moult
2023-07-20 19:42:34 +10:00
parent 452089596e
commit 1b71f4f569
2 changed files with 19 additions and 2 deletions
@@ -55,8 +55,10 @@ def filter_elements(ifc_file, query, elements=None):
filter_group: facet_list ("+" facet_list)*
facet_list: facet ("," facet)*
facet: entity | attribute | type | material | property | classification | location
facet: instance | entity | attribute | type | material | property | classification | location
instance: not? globalid
globalid: /[0-3][a-zA-Z0-9_$]{21}/
entity: not? ifc_class
attribute: attribute_name comparison value
type: "type" comparison value
@@ -127,7 +129,6 @@ class FacetTransformer(lark.Transformer):
self.elements = elements or set()
self.container_parents = {}
self.container_trees = {}
print("INIT TRANSFORMER")
def get_results(self):
results = set()
@@ -140,6 +141,12 @@ class FacetTransformer(lark.Transformer):
self.results.append(self.elements)
self.elements = set()
def instance(self, args):
if args[0].data == "globalid":
self.elements.add(self.file.by_guid(args[0].children[0].value))
else:
self.elements.remove(self.file.by_guid(args[1].children[0].value))
def entity(self, args):
if args[0].data == "ifc_class":
self.elements |= set(self.file.by_type(args[0].children[0].value))
@@ -75,6 +75,16 @@ class TestGetElementValue(test.bootstrap.IFC4):
class TestFilterElements(test.bootstrap.IFC4):
def test_selecting_by_globalid(self):
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab")
guid1 = element.GlobalId
guid2 = element2.GlobalId
assert subject.filter_elements(self.file, f"{guid1}") == {element}
assert subject.filter_elements(self.file, f"{guid1}, {guid2}") == {element, element2}
assert subject.filter_elements(self.file, f"{guid1}, {guid2}, ! {guid2}") == {element}
assert subject.filter_elements(self.file, f"IfcElement, ! {guid2}") == {element}
def test_selecting_by_class(self):
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
element.Name = "Foo"