mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 06:58:56 +00:00
Implement guid facet in facet selector
This commit is contained in:
@@ -55,8 +55,10 @@ def filter_elements(ifc_file, query, elements=None):
|
|||||||
filter_group: facet_list ("+" facet_list)*
|
filter_group: facet_list ("+" facet_list)*
|
||||||
facet_list: facet ("," facet)*
|
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
|
entity: not? ifc_class
|
||||||
attribute: attribute_name comparison value
|
attribute: attribute_name comparison value
|
||||||
type: "type" comparison value
|
type: "type" comparison value
|
||||||
@@ -127,7 +129,6 @@ class FacetTransformer(lark.Transformer):
|
|||||||
self.elements = elements or set()
|
self.elements = elements or set()
|
||||||
self.container_parents = {}
|
self.container_parents = {}
|
||||||
self.container_trees = {}
|
self.container_trees = {}
|
||||||
print("INIT TRANSFORMER")
|
|
||||||
|
|
||||||
def get_results(self):
|
def get_results(self):
|
||||||
results = set()
|
results = set()
|
||||||
@@ -140,6 +141,12 @@ class FacetTransformer(lark.Transformer):
|
|||||||
self.results.append(self.elements)
|
self.results.append(self.elements)
|
||||||
self.elements = set()
|
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):
|
def entity(self, args):
|
||||||
if args[0].data == "ifc_class":
|
if args[0].data == "ifc_class":
|
||||||
self.elements |= set(self.file.by_type(args[0].children[0].value))
|
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):
|
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):
|
def test_selecting_by_class(self):
|
||||||
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
element.Name = "Foo"
|
element.Name = "Foo"
|
||||||
|
|||||||
Reference in New Issue
Block a user