From 56ff0e74725afc796a8aaf61643724253e10eb8c Mon Sep 17 00:00:00 2001 From: Vukas Pajic <83825269+vulevukusej@users.noreply.github.com> Date: Sat, 23 Oct 2021 09:16:11 +0200 Subject: [PATCH] BlenderBIM: added dropdown in addon preferences to toggle module visibility (#1798) * added dropdown in addon preferences to toggle module visibility * Update ui.py * updated ui to allow individual toggling of modules * working * code cleanup and update * fix issue where non relevant operators shown * update based on review comments * add contingency for intermodule panel dependancy * removed 'magic' operators :) * clean up some leftover lines * updated to only register/deregister panel classes --- src/blenderbim/blenderbim/bim/__init__.py | 57 +++-------------------- src/blenderbim/blenderbim/bim/helper.py | 26 +++++++++++ src/blenderbim/blenderbim/bim/modules.py | 54 +++++++++++++++++++++ src/blenderbim/blenderbim/bim/operator.py | 33 ++++++++++++- src/blenderbim/blenderbim/bim/ui.py | 3 +- 5 files changed, 121 insertions(+), 52 deletions(-) create mode 100644 src/blenderbim/blenderbim/bim/modules.py diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 4ab53bd41d..0cb84dc766 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -17,58 +17,11 @@ # along with BlenderBIM Add-on. If not, see . import bpy -import importlib -from . import handler, ui, prop, operator +from . import handler, ui, prop, operator, modules, helper -modules = { - "project": None, - "search": None, - "bcf": None, - "root": None, - "unit": None, - "model": None, - "georeference": None, - "context": None, - "drawing": None, - "misc": None, - "attribute": None, - "type": None, - "spatial": None, - "void": None, - "aggregate": None, - "geometry": None, - "cobie": None, - "resource": None, - "cost": None, - "sequence": None, - "group": None, - "system": None, - "structural": None, - "boundary": None, - "profile": None, - "material": None, - "style": None, - "layer": None, - "owner": None, - "pset": None, - "qto": None, - "classification": None, - "constraint": None, - "document": None, - "pset_template": None, - "clash": None, - "lca": None, - "csv": None, - "bimtester": None, - "diff": None, - "patch": None, - "covetool": None, - "augin": None, - "debug": None, -} +modules = modules.get_modules() +module_property_group = helper.create_module_property_group(modules) -for name in modules.keys(): - modules[name] = importlib.import_module(f"blenderbim.bim.module.{name}") classes = [ operator.OpenUri, @@ -81,6 +34,7 @@ classes = [ operator.ReloadIfcFile, operator.AddIfcFile, operator.RemoveIfcFile, + operator.ConfigureVisibility, prop.StrProperty, prop.Attribute, prop.BIMProperties, @@ -90,6 +44,7 @@ classes = [ prop.BIMObjectProperties, prop.BIMMaterialProperties, prop.BIMMeshProperties, + module_property_group, ui.BIM_PT_section_plane, ui.BIM_UL_generic, ui.BIM_UL_topics, @@ -125,6 +80,7 @@ def register(): bpy.types.Camera.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties) bpy.types.PointLight.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties) bpy.types.SCENE_PT_unit.append(ui.ifc_units) + bpy.types.Scene.module_state = bpy.props.CollectionProperty(type= module_property_group) for mod in modules.values(): mod.register() @@ -144,6 +100,7 @@ def unregister(): del bpy.types.Curve.BIMMeshProperties del bpy.types.Camera.BIMMeshProperties del bpy.types.PointLight.BIMMeshProperties + del bpy.types.Scene.module_state bpy.types.SCENE_PT_unit.remove(ui.ifc_units) for mod in reversed(list(modules.values())): diff --git a/src/blenderbim/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py index 04d07e0386..713525a67e 100644 --- a/src/blenderbim/blenderbim/bim/helper.py +++ b/src/blenderbim/blenderbim/bim/helper.py @@ -97,3 +97,29 @@ def export_attributes(props, callback=None): continue # Our job is done attributes[prop.name] = prop.get_value() return attributes + +def create_module_property_group(modules): + def change_state(self, context): + module_specific_classes = list(filter(lambda cls: issubclass(cls, bpy.types.Panel), modules[self.module_name].classes)) + try: + for cls in reversed(module_specific_classes): + bpy.utils.unregister_class(cls) + + except RuntimeError: #class isn't registered + #check for edge-case where pset panels inherit from sequence module + sequence= list(filter(lambda prop: prop.module_name=="sequence", context.scene.module_state)) + if self.module_name == "pset" and not sequence[0].state: + print("Pset can not be activated while Sequence is disabled") + self["state"] = False + else: + for cls in module_specific_classes: + bpy.utils.register_class(cls) + + return type( + "ModuleState", + (bpy.types.PropertyGroup,), + {'__annotations__':{ + "module_name": bpy.props.StringProperty(), + "state": bpy.props.BoolProperty(default=True, update=change_state) + }} + ) diff --git a/src/blenderbim/blenderbim/bim/modules.py b/src/blenderbim/blenderbim/bim/modules.py new file mode 100644 index 0000000000..d13c11a62a --- /dev/null +++ b/src/blenderbim/blenderbim/bim/modules.py @@ -0,0 +1,54 @@ +import importlib + +modules = { + "project": None, + "search": None, + "bcf": None, + "root": None, + "unit": None, + "model": None, + "georeference": None, + "context": None, + "drawing": None, + "misc": None, + "attribute": None, + "type": None, + "spatial": None, + "void": None, + "aggregate": None, + "geometry": None, + "cobie": None, + "resource": None, + "cost": None, + "sequence": None, + "group": None, + "system": None, + "structural": None, + "boundary": None, + "profile": None, + "material": None, + "style": None, + "layer": None, + "owner": None, + "pset": None, + "qto": None, + "classification": None, + "constraint": None, + "document": None, + "pset_template": None, + "clash": None, + "lca": None, + "csv": None, + "bimtester": None, + "diff": None, + "patch": None, + "covetool": None, + "augin": None, + "debug": None, +} + +for name in modules.keys(): + modules[name] = importlib.import_module(f"blenderbim.bim.module.{name}") + +def get_modules(): + return modules \ No newline at end of file diff --git a/src/blenderbim/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py index d859d85fde..632074ec8e 100644 --- a/src/blenderbim/blenderbim/bim/operator.py +++ b/src/blenderbim/blenderbim/bim/operator.py @@ -22,11 +22,12 @@ import json import webbrowser import ifcopenshell import blenderbim.bim.handler -from . import schema +from . import schema, modules from blenderbim.bim.ifc import IfcStore from mathutils import Vector, Matrix, Euler from math import radians +modules = modules.get_modules() class OpenUri(bpy.types.Operator): bl_idname = "bim.open_uri" @@ -485,3 +486,33 @@ class CopyAttributeToSelection(bpy.types.Operator): a.name() for a in self.schema.declaration_by_name(ifc_class).all_attributes() ] return self.applicable_attributes_cache[ifc_class] + + +class ConfigureVisibility(bpy.types.Operator): + bl_idname = "bim.configure_visibility" + bl_label = "Toggle availability of modules in BlenderBIM" + bl_options = {"REGISTER", "UNDO"} + + def invoke(self, context, event): + wm = context.window_manager + if not context.scene.module_state: + for module in sorted(modules.keys()): + new = bpy.context.scene.module_state.add() + new.module_name = module + return wm.invoke_props_dialog(self, width=450) + + def draw(self, context): + layout = self.layout + grid = layout.column_flow(columns=3) + + for module in bpy.context.scene.module_state: + split = grid.split() + col = split.column() + #col.enabled = False + col.label(text=module.module_name.capitalize()) + + col = split.column() + col.prop(module, "state", text="") + + def execute(self, context): + return {'FINISHED'} \ No newline at end of file diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 639d8411fa..19aa221c92 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -110,7 +110,8 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row.prop(self, "should_hide_empty_props") row = layout.row() row.prop(self, "should_play_chaching_sound") - + row = layout.row() + row.operator("bim.configure_visibility") def ifc_units(self, context): scene = context.scene