diff --git a/src/blenderbim/blenderbim/bim/module/search/__init__.py b/src/blenderbim/blenderbim/bim/module/search/__init__.py index 0eadf9a42d..57379f90a1 100644 --- a/src/blenderbim/blenderbim/bim/module/search/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/search/__init__.py @@ -38,6 +38,7 @@ classes = ( operator.SaveSelectorQuery, operator.OpenQueryLibrary, operator.LoadQuery, + operator.AddToIfcGroup, prop.BIMFilterClasses, prop.BIMFilterBuildingStoreys, prop.BIMSearchProperties, diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index f1736d85f0..960611f6ee 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -20,6 +20,7 @@ import re import bpy import ifcopenshell import ifcopenshell.util.element +from ifcopenshell.api.group.data import Data from ifcopenshell.util.selector import Selector import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore @@ -513,7 +514,7 @@ class FilterModelElements(Operator): selection = self.add_filters(selection, query) elif query.selector == "GlobalId": - selection += f"#{query.global_id}" + selection += f"#{query.value}" elif query.selector == "IfcElementType": index = int(query.active_sub_option.split(":")[0]) @@ -646,3 +647,29 @@ class LoadQuery(Operator): ifc_selector = context.scene.IfcSelectorProperties ifc_selector.selector_query_syntax = ifc_selector.query_library[self.index].query return {"FINISHED"} + +class AddToIfcGroup(Operator): + bl_idname = "bim.add_to_ifc_group" + bl_label = "Add to IFC Group" + group_name: StringProperty(name="Group Name") + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self, width=400) + + def draw(self, context): + layout = self.layout + layout.prop(self, "group_name") + + def execute(self, context): + self.file = IfcStore.get_file() + ifc_selector = context.scene.IfcSelectorProperties + selector_query_syntax = ifc_selector.selector_query_syntax + + group = ifcopenshell.api.run("group.add_group", self.file, **{"Name": self.group_name}) + objects = Selector.parse(self.file, selector_query_syntax) + for obj in objects: + ifcopenshell.api.run("group.assign_group", self.file, **{"product": obj, "group": group}) + + Data.load(IfcStore.get_file()) + + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/search/ui.py b/src/blenderbim/blenderbim/bim/module/search/ui.py index 01669337d0..8a040a8878 100644 --- a/src/blenderbim/blenderbim/bim/module/search/ui.py +++ b/src/blenderbim/blenderbim/bim/module/search/ui.py @@ -154,6 +154,10 @@ class IfcSelectorUI: row.alignment = "CENTER" row.operator("bim.save_selector_query", text="Save Query") row.operator("bim.open_query_library", text="Load Query") + + row = layout.row(align=True) + row.alignment = "CENTER" + row.operator("bim.add_to_ifc_group", text="Add to IFC Group") def draw_query_group_ui(self, ifc_selector, layout): for index, group in enumerate(ifc_selector.groups): diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index 6a4ebfc2f5..27a7e4972e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -23,7 +23,9 @@ import ifcopenshell.api class Usecase: def __init__(self, file, **settings): self.file = file - self.settings = {} + self.settings = { + "Name": "Unnamed" + } for key, value in settings.items(): self.settings[key] = value @@ -33,6 +35,6 @@ class Usecase: **{ "GlobalId": ifcopenshell.guid.new(), "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "Name": "Unnamed", + "Name": self.settings["Name"], } )