mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-27 10:51:13 +00:00
Minor code review for module visibility feature. See #1798.
This commit is contained in:
@@ -17,10 +17,59 @@
|
|||||||
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
from . import handler, ui, prop, operator, modules, helper
|
import importlib
|
||||||
|
from . import handler, ui, prop, operator, helper
|
||||||
|
|
||||||
modules = modules.get_modules()
|
modules = {
|
||||||
module_property_group = helper.create_module_property_group(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}")
|
||||||
|
|
||||||
|
|
||||||
classes = [
|
classes = [
|
||||||
@@ -37,6 +86,7 @@ classes = [
|
|||||||
operator.ConfigureVisibility,
|
operator.ConfigureVisibility,
|
||||||
prop.StrProperty,
|
prop.StrProperty,
|
||||||
prop.Attribute,
|
prop.Attribute,
|
||||||
|
prop.ModuleVisibility,
|
||||||
prop.BIMProperties,
|
prop.BIMProperties,
|
||||||
prop.IfcParameter,
|
prop.IfcParameter,
|
||||||
prop.PsetQto,
|
prop.PsetQto,
|
||||||
@@ -44,7 +94,6 @@ classes = [
|
|||||||
prop.BIMObjectProperties,
|
prop.BIMObjectProperties,
|
||||||
prop.BIMMaterialProperties,
|
prop.BIMMaterialProperties,
|
||||||
prop.BIMMeshProperties,
|
prop.BIMMeshProperties,
|
||||||
module_property_group,
|
|
||||||
ui.BIM_PT_section_plane,
|
ui.BIM_PT_section_plane,
|
||||||
ui.BIM_UL_generic,
|
ui.BIM_UL_generic,
|
||||||
ui.BIM_UL_topics,
|
ui.BIM_UL_topics,
|
||||||
@@ -80,7 +129,6 @@ def register():
|
|||||||
bpy.types.Camera.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties)
|
bpy.types.Camera.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties)
|
||||||
bpy.types.PointLight.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_PT_unit.append(ui.ifc_units)
|
||||||
bpy.types.Scene.module_state = bpy.props.CollectionProperty(type= module_property_group)
|
|
||||||
|
|
||||||
for mod in modules.values():
|
for mod in modules.values():
|
||||||
mod.register()
|
mod.register()
|
||||||
@@ -100,7 +148,6 @@ def unregister():
|
|||||||
del bpy.types.Curve.BIMMeshProperties
|
del bpy.types.Curve.BIMMeshProperties
|
||||||
del bpy.types.Camera.BIMMeshProperties
|
del bpy.types.Camera.BIMMeshProperties
|
||||||
del bpy.types.PointLight.BIMMeshProperties
|
del bpy.types.PointLight.BIMMeshProperties
|
||||||
del bpy.types.Scene.module_state
|
|
||||||
bpy.types.SCENE_PT_unit.remove(ui.ifc_units)
|
bpy.types.SCENE_PT_unit.remove(ui.ifc_units)
|
||||||
|
|
||||||
for mod in reversed(list(modules.values())):
|
for mod in reversed(list(modules.values())):
|
||||||
|
|||||||
@@ -97,29 +97,3 @@ def export_attributes(props, callback=None):
|
|||||||
continue # Our job is done
|
continue # Our job is done
|
||||||
attributes[prop.name] = prop.get_value()
|
attributes[prop.name] = prop.get_value()
|
||||||
return attributes
|
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)
|
|
||||||
}}
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
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
|
|
||||||
@@ -22,12 +22,11 @@ import json
|
|||||||
import webbrowser
|
import webbrowser
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import blenderbim.bim.handler
|
import blenderbim.bim.handler
|
||||||
from . import schema, modules
|
from . import schema
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
from mathutils import Vector, Matrix, Euler
|
from mathutils import Vector, Matrix, Euler
|
||||||
from math import radians
|
from math import radians
|
||||||
|
|
||||||
modules = modules.get_modules()
|
|
||||||
|
|
||||||
class OpenUri(bpy.types.Operator):
|
class OpenUri(bpy.types.Operator):
|
||||||
bl_idname = "bim.open_uri"
|
bl_idname = "bim.open_uri"
|
||||||
@@ -490,29 +489,30 @@ class CopyAttributeToSelection(bpy.types.Operator):
|
|||||||
|
|
||||||
class ConfigureVisibility(bpy.types.Operator):
|
class ConfigureVisibility(bpy.types.Operator):
|
||||||
bl_idname = "bim.configure_visibility"
|
bl_idname = "bim.configure_visibility"
|
||||||
bl_label = "Toggle availability of modules in BlenderBIM"
|
bl_label = "Configure module UI visibility in BlenderBIM"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
|
from blenderbim.bim import modules
|
||||||
|
|
||||||
wm = context.window_manager
|
wm = context.window_manager
|
||||||
if not context.scene.module_state:
|
if not len(context.scene.BIMProperties.module_visibility):
|
||||||
for module in sorted(modules.keys()):
|
for module in sorted(modules.keys()):
|
||||||
new = bpy.context.scene.module_state.add()
|
new = context.scene.BIMProperties.module_visibility.add()
|
||||||
new.module_name = module
|
new.name = module
|
||||||
return wm.invoke_props_dialog(self, width=450)
|
return wm.invoke_props_dialog(self, width=450)
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
grid = layout.column_flow(columns=3)
|
grid = layout.column_flow(columns=3)
|
||||||
|
|
||||||
for module in bpy.context.scene.module_state:
|
for module in context.scene.BIMProperties.module_visibility:
|
||||||
split = grid.split()
|
split = grid.split()
|
||||||
col = split.column()
|
col = split.column()
|
||||||
#col.enabled = False
|
col.label(text=module.name.capitalize())
|
||||||
col.label(text=module.module_name.capitalize())
|
|
||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
col.prop(module, "state", text="")
|
col.prop(module, "is_visible", text="")
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
return {'FINISHED'}
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -41,6 +41,29 @@ cwd = os.path.dirname(os.path.realpath(__file__))
|
|||||||
materialpsetnames_enum = []
|
materialpsetnames_enum = []
|
||||||
|
|
||||||
|
|
||||||
|
def update_is_visible(self, context):
|
||||||
|
from blenderbim.bim import modules
|
||||||
|
|
||||||
|
# TODO: Pset depends on sequence module as an edge case.
|
||||||
|
if self.name == "sequence" and not self.is_visible:
|
||||||
|
context.scene.BIMProperties.module_visibility["pset"].is_visible = False
|
||||||
|
|
||||||
|
for cls in modules[self.name].classes:
|
||||||
|
if not issubclass(cls, bpy.types.Panel):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if self.is_visible:
|
||||||
|
try:
|
||||||
|
bpy.utils.register_class(cls)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
bpy.utils.unregister_class(cls)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def getAttributeEnumValues(self, context):
|
def getAttributeEnumValues(self, context):
|
||||||
# Support weird buildingSMART dictionary mappings which behave like enums
|
# Support weird buildingSMART dictionary mappings which behave like enums
|
||||||
data = json.loads(self.enum_items)
|
data = json.loads(self.enum_items)
|
||||||
@@ -49,13 +72,13 @@ def getAttributeEnumValues(self, context):
|
|||||||
return [(e, e, "") for e in data]
|
return [(e, e, "") for e in data]
|
||||||
|
|
||||||
|
|
||||||
def updateSchemaDir(self, context):
|
def update_schema_dir(self, context):
|
||||||
import blenderbim.bim.schema
|
import blenderbim.bim.schema
|
||||||
|
|
||||||
blenderbim.bim.schema.ifc.schema_dir = context.scene.BIMProperties.schema_dir
|
blenderbim.bim.schema.ifc.schema_dir = context.scene.BIMProperties.schema_dir
|
||||||
|
|
||||||
|
|
||||||
def updateDataDir(self, context):
|
def update_data_dir(self, context):
|
||||||
import blenderbim.bim.schema
|
import blenderbim.bim.schema
|
||||||
|
|
||||||
blenderbim.bim.schema.ifc.data_dir = context.scene.BIMProperties.data_dir
|
blenderbim.bim.schema.ifc.data_dir = context.scene.BIMProperties.data_dir
|
||||||
@@ -170,12 +193,19 @@ class Attribute(PropertyGroup):
|
|||||||
setattr(self, self.get_value_name(), value)
|
setattr(self, self.get_value_name(), value)
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleVisibility(PropertyGroup):
|
||||||
|
name: StringProperty(name="Name")
|
||||||
|
is_visible: BoolProperty(name="Value", default=True, update=update_is_visible)
|
||||||
|
# is_visible: BoolProperty(name="Value", update=update_is_visible)
|
||||||
|
|
||||||
|
|
||||||
class BIMProperties(PropertyGroup):
|
class BIMProperties(PropertyGroup):
|
||||||
|
module_visibility: CollectionProperty(name="Module Visibility", type=ModuleVisibility)
|
||||||
schema_dir: StringProperty(
|
schema_dir: StringProperty(
|
||||||
default=os.path.join(cwd, "schema") + os.path.sep, name="Schema Directory", update=updateSchemaDir
|
default=os.path.join(cwd, "schema") + os.path.sep, name="Schema Directory", update=update_schema_dir
|
||||||
)
|
)
|
||||||
data_dir: StringProperty(
|
data_dir: StringProperty(
|
||||||
default=os.path.join(cwd, "data") + os.path.sep, name="Data Directory", update=updateDataDir
|
default=os.path.join(cwd, "data") + os.path.sep, name="Data Directory", update=update_data_dir
|
||||||
)
|
)
|
||||||
ifc_file: StringProperty(name="IFC File", update=update_ifc_file)
|
ifc_file: StringProperty(name="IFC File", update=update_ifc_file)
|
||||||
export_schema: EnumProperty(items=[("IFC4", "IFC4", ""), ("IFC2X3", "IFC2X3", "")], name="IFC Schema")
|
export_schema: EnumProperty(items=[("IFC4", "IFC4", ""), ("IFC2X3", "IFC2X3", "")], name="IFC Schema")
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
|
|||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.operator("bim.configure_visibility")
|
row.operator("bim.configure_visibility")
|
||||||
|
|
||||||
|
|
||||||
def ifc_units(self, context):
|
def ifc_units(self, context):
|
||||||
scene = context.scene
|
scene = context.scene
|
||||||
props = scene.BIMProperties
|
props = scene.BIMProperties
|
||||||
|
|||||||
Reference in New Issue
Block a user