From f6b7201bc48f57ffdc7503514b338e2211c28e51 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 Mar 2023 14:51:39 +0500 Subject: [PATCH] Added default blender selection behaviour to CAD Tool Similarly to BIM Tool (85bba9d) Now it works exactly as default blender selection - supports box selection etc --- .../blenderbim/bim/module/cad/workspace.py | 2 +- .../blenderbim/bim/module/model/workspace.py | 38 +------------ src/blenderbim/blenderbim/tool/blender.py | 56 +++++++++++++++++-- 3 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cad/workspace.py b/src/blenderbim/blenderbim/bim/module/cad/workspace.py index 729c505423..57cf375436 100644 --- a/src/blenderbim/blenderbim/bim/module/cad/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/cad/workspace.py @@ -34,7 +34,7 @@ class CadTool(WorkSpaceTool): bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.cad") bl_widget = None # https://docs.blender.org/api/current/bpy.types.KeyMapItems.html - bl_keymap = ( + bl_keymap = tool.Blender.get_default_selection_keypmap() + ( ("bim.cad_hotkey", {"type": "C", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_C")]}), ("bim.cad_hotkey", {"type": "E", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_E")]}), ("bim.cad_hotkey", {"type": "F", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_F")]}), diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 2ceaab3e6a..06e5e2a170 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -39,46 +39,10 @@ class BimTool(WorkSpaceTool): bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.bim") bl_widget = None # https://docs.blender.org/api/current/bpy.types.KeyMapItems.html - bl_keymap = ( + bl_keymap = tool.Blender.get_default_selection_keypmap() + ( # ("bim.wall_tool_op", {"type": 'MOUSEMOVE', "value": 'ANY'}, {"properties": []}), # ("mesh.add_wall", {"type": 'LEFTMOUSE', "value": 'PRESS'}, {"properties": []}), # ("bim.sync_modeling", {"type": 'MOUSEMOVE', "value": 'ANY'}, {"properties": []}), - # Replicate default blender selection behaviour with click and box selection - # code below comes from blender_default.py which is part of default blender scripts licensed under GPL v2 - # https://github.com/blender/blender/blob/master/release/scripts/presets/keyconfig/keymap_data/blender_default.py - # the code is the data from evaluating km_3d_view_tool_select() and km_3d_view_tool_select_box() - # - # You can run the snippet below in Blender console - # to regenerate those keybindings in case of errors in the future - # ``` - # import os - # version = ".".join(bpy.app.version_string.split(".")[:2]) - # fl = os.path.join(os.getcwd(), version, "scripts/presets/keyconfig/keymap_data/blender_default.py") - # def_keymap = bpy.utils.execfile(fl) - # params = def_keymap.Params - # box_keymap = def_keymap.km_3d_view_tool_select_box(def_keymap.Params(), fallback=None)[2]["items"] - # click_keymap = def_keymap.km_3d_view_tool_select(def_keymap.Params(select_mouse="LEFTMOUSE"), fallback=None)[2]["items"] - # ``` - # box selection keymap - ("view3d.select_box", {"type": "LEFTMOUSE", "value": "CLICK_DRAG"}, None), - ( - "view3d.select_box", - {"type": "LEFTMOUSE", "value": "CLICK_DRAG", "shift": True}, - {"properties": [("mode", "ADD")]}, - ), - ( - "view3d.select_box", - {"type": "LEFTMOUSE", "value": "CLICK_DRAG", "ctrl": True}, - {"properties": [("mode", "SUB")]}, - ), - ( - "view3d.select_box", - {"type": "LEFTMOUSE", "value": "CLICK_DRAG", "shift": True, "ctrl": True}, - {"properties": [("mode", "AND")]}, - ), - # left-click selection keymap - ("view3d.select", {"type": "LEFTMOUSE", "value": "PRESS"}, {"properties": [("deselect_all", True)]}), - ("view3d.select", {"type": "LEFTMOUSE", "value": "PRESS", "shift": True}, {"properties": [("toggle", True)]}), ("bim.hotkey", {"type": "A", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_A")]}), ("bim.hotkey", {"type": "C", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_C")]}), ("bim.hotkey", {"type": "E", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_E")]}), diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 78bbc21aea..2fee26dbd2 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -105,14 +105,60 @@ class Blender: area = next(area for area in bpy.context.screen.areas if area.type == "VIEW_3D") context_override = {"area": area} return context_override - + @classmethod - def update_viewport(cls): + def update_viewport(cls): # if it stops working in future Blender versions # there is an alternative: # bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1) - tool.Blender.get_viewport_context()['area'].tag_redraw() + tool.Blender.get_viewport_context()["area"].tag_redraw() + + @classmethod + def get_default_selection_keypmap(cls): + """keymap to replicate default blender selection behaviour with click and box selection""" + # code below comes from blender_default.py which is part of default blender scripts licensed under GPL v2 + # https://github.com/blender/blender/blob/master/release/scripts/presets/keyconfig/keymap_data/blender_default.py + # the code is the data from evaluating km_3d_view_tool_select() and km_3d_view_tool_select_box() + # + # You can run the snippet below in Blender console + # to regenerate those keybindings in case of errors in the future + # ``` + # import os + # version = ".".join(bpy.app.version_string.split(".")[:2]) + # fl = os.path.join(os.getcwd(), version, "scripts/presets/keyconfig/keymap_data/blender_default.py") + # def_keymap = bpy.utils.execfile(fl) + # params = def_keymap.Params + # box_keymap = def_keymap.km_3d_view_tool_select_box(def_keymap.Params(), fallback=None)[2]["items"] + # click_keymap = def_keymap.km_3d_view_tool_select(def_keymap.Params(select_mouse="LEFTMOUSE"), fallback=None)[2]["items"] + # ``` + keymap = ( + # box selection keymap + ("view3d.select_box", {"type": "LEFTMOUSE", "value": "CLICK_DRAG"}, None), + ( + "view3d.select_box", + {"type": "LEFTMOUSE", "value": "CLICK_DRAG", "shift": True}, + {"properties": [("mode", "ADD")]}, + ), + ( + "view3d.select_box", + {"type": "LEFTMOUSE", "value": "CLICK_DRAG", "ctrl": True}, + {"properties": [("mode", "SUB")]}, + ), + ( + "view3d.select_box", + {"type": "LEFTMOUSE", "value": "CLICK_DRAG", "shift": True, "ctrl": True}, + {"properties": [("mode", "AND")]}, + ), + # left-click selection keymap + ("view3d.select", {"type": "LEFTMOUSE", "value": "PRESS"}, {"properties": [("deselect_all", True)]}), + ( + "view3d.select", + {"type": "LEFTMOUSE", "value": "PRESS", "shift": True}, + {"properties": [("toggle", True)]}, + ), + ) + return keymap ## BMESH UTILS ## @classmethod @@ -137,7 +183,7 @@ class Blender: # until you restart EDIT mode # which may result in errors when some other scripts will try to get bmesh bm.free() - + mesh.update() @classmethod @@ -167,4 +213,4 @@ class Blender: if callback: callback(bm_a, new_verts, new_edges, new_faces) - return bm_a \ No newline at end of file + return bm_a