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 @@
+
+
+
+