diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 8a6bf77073..f1736d85f0 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -577,132 +577,8 @@ class IfcSelector(Operator): return {"FINISHED"} def draw(self, context): - ifc_selector = context.scene.IfcSelectorProperties - layout = self.layout - row = layout.row() - - row.context_pointer_set(name="bim_prop_group", data=ifc_selector) - op = row.operator("bim.edit_blender_collection", text="Add selection group") - op.option = "add" - op.collection = "groups" - layout.separator() - - self.draw_query_group_ui(ifc_selector, layout) - - if len(ifc_selector.groups) != 0: - row = layout.row(align=True) - row.prop(ifc_selector, "selector_query_syntax", text="Query Syntax") - row.prop(ifc_selector, "manual_override", text="") - - select = row.operator("bim.filter_model_elements", text="", icon="RESTRICT_SELECT_OFF") - select.option = "select" - isolate = row.operator("bim.filter_model_elements", text="", icon="ZOOM_SELECTED") - isolate.option = "isolate" - hide = row.operator("bim.filter_model_elements", text="", icon="HIDE_ON") - hide.option = "hide" - row.operator("bim.unhide_all_elements", text="", icon="HIDE_OFF") - - row = layout.row(align=True) - row.alignment = "CENTER" - row.operator("bim.save_selector_query", text="Save Query") - row.operator("bim.open_query_library", text="Load Query") - - def draw_query_group_ui(self, ifc_selector, layout): - for index, group in enumerate(ifc_selector.groups): - row = layout.row() - row.alignment = "CENTER" - row.label(text="or") if index != 0 else None - - box = layout.box() - row = box.row(align=True) - row.alignment = "CENTER" - row.label(text=f"Group #{str(index+1)}") - row.context_pointer_set(name="bim_prop_group", data=group) - op = row.operator("bim.edit_blender_collection", text="Add query", icon="PLUS") - op.option = "add" - op.collection = "queries" - - row.context_pointer_set(name="bim_prop_group", data=ifc_selector) - op = row.operator("bim.edit_blender_collection", text="Remove selection group") - op.option = "remove" - op.collection = "groups" - op.index = index - - self.draw_query_ui(group, box) - - def draw_query_ui(self, group, box): - for index, query in enumerate(group.queries): - row = box.row() - row.alignment = "LEFT" - - row.prop(query, "and_or", text="") if index != 0 else None - if query.and_or == "or": - row = box.row() - row.alignment = "LEFT" - row.prop(query, "selector", text="") - - if query.selector in ["IFC Class", "IfcSpatialElement", "IfcElementType"]: - row.label(text="Equals") - row.prop_search(query, "active_option", query, "options", text="") - row.prop_search(query, "active_sub_option", query, "sub_options", text="") if len( - query.sub_options - ) != 0 else None - self.draw_filter_ui(index, box, query) - - elif query.selector in ["GlobalId", "Attribute"]: - row.prop(query, "negation", text="") - row.prop(query, "comparison", text="") - row.prop(query, "value", text="") - - row.context_pointer_set(name="bim_prop_group", data=group) - op = row.operator("bim.edit_blender_collection", icon="REMOVE", text="") - op.option = "remove" - op.collection = "queries" - op.index = index - - row.context_pointer_set(name="bim_prop_group", data=query) - op = ( - row.operator("bim.edit_blender_collection", text="Add filter") - if query.selector == "IFC Class" - else None - ) - if op: - op.option = "add" - op.collection = "filters" - - def draw_filter_ui(self, index, box, query): - for filter_index, f in enumerate(query.filters): - row = box.row() - row.alignment = "LEFT" - row.label(text=" ↪") - row.prop(f, "and_or", text="") if filter_index != 0 else None - if f.and_or == "or": - row = box.row() - row.alignment = "LEFT" - row.label(text=" ↪") - row.prop(f, "selector", text="") - - if f.selector == "Attribute": - row.prop(f, "attribute", text="") - row.prop( - f, - "negation", - ) - row.prop(f, "comparison", text="") - row.prop(f, "value", text="") - - elif f.selector == "IfcPropertySet": - row.prop_search(f, "active_option", f, "options", text="") - row.prop_search(f, "active_sub_option", f, "sub_options", text="") - row.prop(f, "negation") - row.prop(f, "comparison", text="") - row.prop(f, "value", text="") - - row.context_pointer_set(name="bim_prop_group", data=query) - op = row.operator("bim.edit_blender_collection", icon="REMOVE", text="") - op.option = "remove" - op.collection = "filters" - op.index = filter_index + from . import ui + ui.IfcSelectorUI.draw(context, self.layout) class SaveSelectorQuery(Operator): @@ -719,11 +595,9 @@ class SaveSelectorQuery(Operator): def execute(self, context): ifc_selector = context.scene.IfcSelectorProperties - new = ifc_selector.query_library.add() new.name = self.save_name new.query = ifc_selector.selector_query_syntax - return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/search/ui.py b/src/blenderbim/blenderbim/bim/module/search/ui.py index 949389bd2b..01669337d0 100644 --- a/src/blenderbim/blenderbim/bim/module/search/ui.py +++ b/src/blenderbim/blenderbim/bim/module/search/ui.py @@ -121,3 +121,133 @@ class BIM_PT_IFCSelector(Panel): layout = self.layout layout.operator("bim.ifc_selector") + +# this doesn't inherit from Panel since it's just a class to abstract away UI code from the IfcSelector Operator +class IfcSelectorUI: + @classmethod + def draw(self, context, layout): + ifc_selector = context.scene.IfcSelectorProperties + row = layout.row() + + row.context_pointer_set(name="bim_prop_group", data=ifc_selector) + op = row.operator("bim.edit_blender_collection", text="Add selection group") + op.option = "add" + op.collection = "groups" + layout.separator() + + self.draw_query_group_ui(self, ifc_selector, layout) + + if len(ifc_selector.groups) != 0: + row = layout.row(align=True) + row.prop(ifc_selector, "selector_query_syntax", text="Query Syntax") + row.prop(ifc_selector, "manual_override", text="") + + select = row.operator("bim.filter_model_elements", text="", icon="RESTRICT_SELECT_OFF") + select.option = "select" + isolate = row.operator("bim.filter_model_elements", text="", icon="ZOOM_SELECTED") + isolate.option = "isolate" + hide = row.operator("bim.filter_model_elements", text="", icon="HIDE_ON") + hide.option = "hide" + row.operator("bim.unhide_all_elements", text="", icon="HIDE_OFF") + + row = layout.row(align=True) + row.alignment = "CENTER" + row.operator("bim.save_selector_query", text="Save Query") + row.operator("bim.open_query_library", text="Load Query") + + def draw_query_group_ui(self, ifc_selector, layout): + for index, group in enumerate(ifc_selector.groups): + row = layout.row() + row.alignment = "CENTER" + row.label(text="or") if index != 0 else None + + box = layout.box() + row = box.row(align=True) + row.alignment = "CENTER" + row.label(text=f"Group #{str(index+1)}") + row.context_pointer_set(name="bim_prop_group", data=group) + op = row.operator("bim.edit_blender_collection", text="Add query", icon="PLUS") + op.option = "add" + op.collection = "queries" + + row.context_pointer_set(name="bim_prop_group", data=ifc_selector) + op = row.operator("bim.edit_blender_collection", text="Remove selection group") + op.option = "remove" + op.collection = "groups" + op.index = index + + self.draw_query_ui(self, group, box) + + def draw_query_ui(self, group, box): + for index, query in enumerate(group.queries): + row = box.row() + row.alignment = "LEFT" + + row.prop(query, "and_or", text="") if index != 0 else None + if query.and_or == "or": + row = box.row() + row.alignment = "LEFT" + row.prop(query, "selector", text="") + + if query.selector in ["IFC Class", "IfcSpatialElement", "IfcElementType"]: + row.label(text="Equals") + row.prop_search(query, "active_option", query, "options", text="") + row.prop_search(query, "active_sub_option", query, "sub_options", text="") if len( + query.sub_options + ) != 0 else None + self.draw_filter_ui(self, box, query) + + elif query.selector in ["GlobalId", "Attribute"]: + row.prop(query, "negation", text="") + row.prop(query, "comparison", text="") + row.prop(query, "value", text="") + + row.context_pointer_set(name="bim_prop_group", data=group) + op = row.operator("bim.edit_blender_collection", icon="REMOVE", text="") + op.option = "remove" + op.collection = "queries" + op.index = index + + row.context_pointer_set(name="bim_prop_group", data=query) + op = ( + row.operator("bim.edit_blender_collection", text="Add filter") + if query.selector == "IFC Class" + else None + ) + if op: + op.option = "add" + op.collection = "filters" + + def draw_filter_ui(self, box, query): + for filter_index, f in enumerate(query.filters): + row = box.row() + row.alignment = "LEFT" + row.label(text=" ↪") + row.prop(f, "and_or", text="") if filter_index != 0 else None + if f.and_or == "or": + row = box.row() + row.alignment = "LEFT" + row.label(text=" ↪") + row.prop(f, "selector", text="") + + if f.selector == "Attribute": + row.prop(f, "attribute", text="") + row.prop( + f, + "negation", + ) + row.prop(f, "comparison", text="") + row.prop(f, "value", text="") + + elif f.selector == "IfcPropertySet": + row.prop_search(f, "active_option", f, "options", text="") + row.prop_search(f, "active_sub_option", f, "sub_options", text="") + row.prop(f, "negation") + row.prop(f, "comparison", text="") + row.prop(f, "value", text="") + + row.context_pointer_set(name="bim_prop_group", data=query) + op = row.operator("bim.edit_blender_collection", icon="REMOVE", text="") + op.option = "remove" + op.collection = "filters" + op.index = filter_index