mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 14:41:25 +00:00
abstract away ui code from operator
This commit is contained in:
@@ -577,132 +577,8 @@ class IfcSelector(Operator):
|
|||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
ifc_selector = context.scene.IfcSelectorProperties
|
from . import ui
|
||||||
layout = self.layout
|
ui.IfcSelectorUI.draw(context, 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
|
|
||||||
|
|
||||||
|
|
||||||
class SaveSelectorQuery(Operator):
|
class SaveSelectorQuery(Operator):
|
||||||
@@ -719,11 +595,9 @@ class SaveSelectorQuery(Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
ifc_selector = context.scene.IfcSelectorProperties
|
ifc_selector = context.scene.IfcSelectorProperties
|
||||||
|
|
||||||
new = ifc_selector.query_library.add()
|
new = ifc_selector.query_library.add()
|
||||||
new.name = self.save_name
|
new.name = self.save_name
|
||||||
new.query = ifc_selector.selector_query_syntax
|
new.query = ifc_selector.selector_query_syntax
|
||||||
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -121,3 +121,133 @@ class BIM_PT_IFCSelector(Panel):
|
|||||||
layout = self.layout
|
layout = self.layout
|
||||||
layout.operator("bim.ifc_selector")
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user