diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 529fc28676..cff7dd9022 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -16,11 +16,15 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +import os import bpy +import bpy.utils.previews import blenderbim import importlib from . import handler, ui, prop, operator, helper +cwd = os.path.dirname(os.path.realpath(__file__)) + modules = { "project": None, "search": None, @@ -143,6 +147,9 @@ for mod in modules.values(): classes.extend(mod.classes) +icons = None + + def on_register(scene): handler.setDefaultProperties(scene) if not bpy.app.background: @@ -177,8 +184,24 @@ def register(): for mod in modules.values(): mod.register() + global icons + + icons_dir = os.path.join(cwd, "data", "icons") + icon_preview = bpy.utils.previews.new() + for filename in os.listdir(icons_dir): + if filename.endswith(".png"): + icon_name = os.path.splitext(filename)[0] + icon_path = os.path.join(icons_dir, filename) + icon_preview.load(icon_name, icon_path, "IMAGE") + + icons = icon_preview + def unregister(): + global icons + + bpy.utils.previews.remove(icons) + for cls in reversed(classes): if getattr(cls, "is_registered", None) is None: bpy.utils.unregister_class(cls) diff --git a/src/blenderbim/blenderbim/bim/data/icons/IFC.png b/src/blenderbim/blenderbim/bim/data/icons/IFC.png new file mode 100644 index 0000000000..fa6a5a8ef8 Binary files /dev/null and b/src/blenderbim/blenderbim/bim/data/icons/IFC.png differ diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index 4755308c35..29407e29cf 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -74,25 +74,38 @@ def register(): if wm.keyconfigs.addon: km = wm.keyconfigs.addon.keymaps.new(name="Object Mode", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_object_join", "J", "PRESS", ctrl=True) + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_object_duplicate_move_macro", "D", "PRESS", shift=True) + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_object_duplicate_move_linked_macro", "D", "PRESS", alt=True) + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_object_duplicate_move_aggregate_macro", "D", "PRESS", ctrl=True, shift=True) + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_paste_buffer", "V", "PRESS", ctrl=True) + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_mode_set_edit", "TAB", "PRESS") + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_object_delete", "X", "PRESS") + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_object_delete", "DEL", "PRESS") kmi.properties.confirm = False + addon_keymaps.append((km, kmi)) km = wm.keyconfigs.addon.keymaps.new(name="Mesh", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") + addon_keymaps.append((km, kmi)) km = wm.keyconfigs.addon.keymaps.new(name="Curve", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") + addon_keymaps.append((km, kmi)) km = wm.keyconfigs.addon.keymaps.new(name="Outliner", space_type="OUTLINER") kmi = km.keymap_items.new("bim.override_paste_buffer", "V", "PRESS", ctrl=True) + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_outliner_delete", "X", "PRESS") + addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("bim.override_outliner_delete", "DEL", "PRESS") + addon_keymaps.append((km, kmi)) def unregister(): diff --git a/src/blenderbim/blenderbim/bim/module/project/__init__.py b/src/blenderbim/blenderbim/bim/module/project/__init__.py index bbdf565d10..94ff8d5b02 100644 --- a/src/blenderbim/blenderbim/bim/module/project/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/project/__init__.py @@ -49,6 +49,7 @@ classes = ( prop.FilterCategory, prop.Link, prop.BIMProjectProperties, + ui.BIM_MT_new_project, ui.BIM_MT_project, ui.BIM_PT_project, ui.BIM_PT_project_library, @@ -59,11 +60,28 @@ classes = ( ) +addon_keymaps = [] + + def register(): bpy.types.Scene.BIMProjectProperties = bpy.props.PointerProperty(type=prop.BIMProjectProperties) bpy.types.TOPBAR_MT_file.prepend(ui.file_menu) + wm = bpy.context.window_manager + if wm.keyconfigs.addon: + km = wm.keyconfigs.addon.keymaps.get("Window") + if not km: + km = wm.keyconfigs.addon.keymaps.new("Window") + kmi = km.keymap_items.new("wm.call_menu", "N", "PRESS", ctrl=True) + kmi.properties.name = "BIM_MT_new_project" + addon_keymaps.append((km, kmi)) def unregister(): bpy.types.TOPBAR_MT_file.remove(ui.file_menu) del bpy.types.Scene.BIMProjectProperties + wm = bpy.context.window_manager + kc = wm.keyconfigs.addon + if kc: + for km, kmi in addon_keymaps: + km.keymap_items.remove(kmi) + addon_keymaps.clear() diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index c962fcf8df..6c64239a04 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import os +import blenderbim.bim from blenderbim.bim.helper import prop_with_search from bpy.types import Panel, Menu, UIList from blenderbim.bim.ifc import IfcStore @@ -28,12 +29,32 @@ class BIM_MT_project(Menu): bl_label = "New IFC Project" def draw(self, context): - layout = self.layout - layout.operator("bim.new_project", text="New Metric (m) Project").preset = "metric_m" - layout.operator("bim.new_project", text="New Metric (mm) Project").preset = "metric_mm" - layout.operator("bim.new_project", text="New Imperial (ft) Project").preset = "imperial_ft" - layout.operator("bim.new_project", text="New Demo Project").preset = "demo" - layout.operator("bim.new_project", text="New Project Wizard").preset = "wizard" + self.layout.operator("bim.new_project", text="New Metric (m) Project").preset = "metric_m" + self.layout.operator("bim.new_project", text="New Metric (mm) Project").preset = "metric_mm" + self.layout.operator("bim.new_project", text="New Imperial (ft) Project").preset = "imperial_ft" + self.layout.operator("bim.new_project", text="New Demo Project").preset = "demo" + self.layout.operator("bim.new_project", text="New Project Wizard").preset = "wizard" + + +class BIM_MT_new_project(Menu): + bl_idname = "BIM_MT_new_project" + bl_label = "New Project" + + def draw(self, context): + self.layout.label(text="New IFC Project", icon_value=blenderbim.bim.icons["IFC"].icon_id) + self.layout.operator("bim.new_project", text="Metric (m) Project").preset = "metric_m" + self.layout.operator("bim.new_project", text="Metric (mm) Project").preset = "metric_mm" + self.layout.operator("bim.new_project", text="Imperial (ft) Project").preset = "imperial_ft" + self.layout.operator("bim.new_project", text="Demo Project").preset = "demo" + self.layout.operator("bim.new_project", text="Project Wizard").preset = "wizard" + self.layout.separator() + self.layout.label(text="New Blender Project", icon="BLENDER") + # In theory we can dynamically grab the list from list(bpy.utils.app_template_paths()) + self.layout.operator("wm.read_homefile", text="General Project").app_template = "" + self.layout.operator("wm.read_homefile", text="2D Animation Project").app_template = "2D_Animation" + self.layout.operator("wm.read_homefile", text="Sculpting Project").app_template = "Sculpting" + self.layout.operator("wm.read_homefile", text="VFX Project").app_template = "VFX" + self.layout.operator("wm.read_homefile", text="Video Editing Project").app_template = "Video_Editing" def file_menu(self, context): @@ -205,7 +226,7 @@ class BIM_PT_project(Panel): row = self.layout.row(align=True) row.operator("bim.create_project") - row.operator("bim.load_project").should_start_fresh_session = False + row.operator("bim.load_project").should_start_fresh_session = True class BIM_PT_project_library(Panel): diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index d192394b69..690b4ae39d 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -30,8 +30,9 @@ from ifcopenshell.util.doc import ( get_property_doc, get_predefined_type_doc, ) -import blenderbim.bim.handler +import blenderbim.bim import blenderbim.bim.schema +import blenderbim.bim.handler from blenderbim.bim.ifc import IfcStore import blenderbim.tool as tool from collections import defaultdict @@ -335,22 +336,22 @@ class ModuleVisibility(PropertyGroup): is_visible: BoolProperty(name="Value", default=True, update=update_is_visible) +def get_tab(self, context): + return [ + ("PROJECT", "Project Overview", "", blenderbim.bim.icons["IFC"].icon_id, 0), + ("OBJECT", "Object Information", "", "FILE_3D", 1), + ("MATERIALS", "Materials and Styles", "", "MATERIAL", 2), + ("DRAWINGS", "Drawings and Documents", "", "DOCUMENTS", 3), + ("SERVICES", "Services and Systems", "", "NETWORK_DRIVE", 4), + ("STRUCTURE", "Structural Analysis", "", "EDITMODE_HLT", 5), + ("SCHEDULING", "Construction Scheduling", "", "NLA", 6), + ("FM", "Facility Management", "", "PACKAGE", 7), + ("OTHER", "Other Properties", "", "COLLAPSEMENU", 8), + ] + + class BIMAreaProperties(PropertyGroup): - tab: EnumProperty( - default="PROJECT", - items=[ - ("PROJECT", "Project Overview", "", "VIEW3D", 1), - ("OBJECT", "Object Information", "", "FILE_3D", 2), - ("MATERIALS", "Materials and Styles", "", "MATERIAL", 3), - ("DRAWINGS", "Drawings and Documents", "", "DOCUMENTS", 4), - ("SERVICES", "Services and Systems", "", "NETWORK_DRIVE", 5), - ("STRUCTURE", "Structural Analysis", "", "EDITMODE_HLT", 6), - ("SCHEDULING", "Construction Scheduling", "", "NLA", 7), - ("FM", "Facility Management", "", "PACKAGE", 8), - ("OTHER", "Other Properties", "", "COLLAPSEMENU", 9), - ], - name="Tab", - ) + tab: EnumProperty(default=0, items=get_tab, name="Tab") class BIMProperties(PropertyGroup): diff --git a/src/blenderbim/scripts/icons.svg b/src/blenderbim/scripts/icons.svg new file mode 100644 index 0000000000..ad622f3f07 --- /dev/null +++ b/src/blenderbim/scripts/icons.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + +