[Bf-extensions-cvs] [f3de3177] xr-actions-D9124: VR: Enable import/export of "XR Session" keymap

Peter Kim noreply at git.blender.org
Sun Nov 22 11:38:41 CET 2020


Commit: f3de3177a67c2a8cfb36db2c3dc8246cbb4348e4
Author: Peter Kim
Date:   Sun Nov 22 18:58:33 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rBAf3de3177a67c2a8cfb36db2c3dc8246cbb4348e4

VR: Enable import/export of "XR Session" keymap

The "XR Session" add-on keymap, which contains op properties for XR
actions is saved to a python file on blend file save. This file has
the same name as the blend file plus a ".xrkey" suffix.

===================================================================

M	viewport_vr_preview.py

===================================================================

diff --git a/viewport_vr_preview.py b/viewport_vr_preview.py
index 32daeaa6..4381692f 100644
--- a/viewport_vr_preview.py
+++ b/viewport_vr_preview.py
@@ -36,6 +36,11 @@ from bpy.props import (
 from bpy.app.handlers import persistent
 import mathutils
 from mathutils import Quaternion
+import os.path, importlib.util
+from bl_keymap_utils.io import (
+    keyconfig_export_as_data_exec,
+    keyconfig_import_from_data_exec,
+)
 
 bl_info = {
     "name": "VR Scene Inspection",
@@ -62,10 +67,31 @@ def vr_load_action_properties(context: bpy.context):
     if not (kc and kc_addon):
         return
 
+    # Remove previous XR Session add-on key map.
     km_addon = kc_addon.keymaps.find("XR Session", space_type='EMPTY', region_type='XR')
-    if not km_addon:
-        return
+    if km_addon:
+        kc_addon.keymaps.remove(km_addon)
+
+    # Import XR Session key map.
+    if bpy.data.is_saved:
+        dirpath = bpy.path.abspath("//")
+        filename = bpy.path.display_name_from_filepath(bpy.data.filepath) + ".xrkey"
+        filepath = dirpath + filename + ".py"
+
+        if os.path.exists(filepath):                
+            spec = importlib.util.spec_from_file_location(filename, filepath)
+            xr_keymap = importlib.util.module_from_spec(spec)
+            spec.loader.exec_module(xr_keymap)
+
+            keyconfig_import_from_data_exec(kc_addon, xr_keymap.keyconfig_data, keyconfig_version=xr_keymap.keyconfig_version)
 
+    # Add any properties not found in key map file.
+    km_addon = kc_addon.keymaps.find("XR Session", space_type='EMPTY', region_type='XR')
+    if not km_addon:
+        km_addon = kc_addon.keymaps.new(name="XR Session", space_type='EMPTY', region_type='XR')
+        if not km_addon:
+            return
+        
     km = kc.keymaps.find("XR", space_type='EMPTY', region_type='XR')
     km_session = kc.keymaps.find("XR Session", space_type='EMPTY', region_type='XR')
     if not (km or km_session):
@@ -97,6 +123,30 @@ def vr_load_action_properties(context: bpy.context):
                 kmi_addon.xr_action = action.name
 
 
+# Similar to keyconfig_export_as_data() from release/scripts/modules/bl_keymap_utils/io.py
+# but only exports the "XR Session" add-on key map.
+ at persistent
+def vr_save_action_properties(context: bpy.context):
+    if not bpy.data.is_saved:
+        return
+
+    wm = bpy.context.window_manager
+    kc = wm.keyconfigs.addon
+    if not kc:
+        return
+
+    km = kc.keymaps.find("XR Session", space_type='EMPTY', region_type='XR')
+    if not km or len(km.keymap_items) < 1:
+        return
+
+    export_keymaps = [(km, kc)]
+    filepath = bpy.path.abspath("//") + bpy.path.display_name_from_filepath(bpy.data.filepath) + ".xrkey.py"
+
+    keyconfig_export_as_data_exec(export_keymaps, filepath)
+
+    print("Saved XR keymap: " + filepath)
+
+
 def vr_get_keymap(context, from_prefs):
     if from_prefs:
         kc = context.window_manager.keyconfigs.user
@@ -2359,6 +2409,7 @@ def register():
 
     bpy.app.handlers.load_post.append(vr_ensure_default_landmark)
     bpy.app.handlers.load_post.append(vr_load_action_properties)
+    bpy.app.handlers.save_post.append(vr_save_action_properties)
     bpy.app.handlers.xr_session_start_pre.append(vr_create_actions)
 
     # Register add-on key map.
@@ -2394,6 +2445,7 @@ def unregister():
 
     bpy.app.handlers.load_post.remove(vr_ensure_default_landmark)
     bpy.app.handlers.load_post.remove(vr_load_action_properties)
+    bpy.app.handlers.save_post.remove(vr_save_action_properties)
     bpy.app.handlers.xr_session_start_pre.remove(vr_create_actions)



More information about the Bf-extensions-cvs mailing list