Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions __init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
from . import preferences, public
from .tool.addon_search import remember_expanded

from . import registration
bl_info = {
"name": "Development Kit Tool",
"version": (1, 0, 1),
Expand All @@ -14,11 +12,8 @@


def register():
public.PublicClass.clear_cache()
preferences.register()
registration.register()


def unregister():
remember_expanded()
public.PublicClass.clear_cache()
preferences.unregister()
registration.unregister()
87 changes: 87 additions & 0 deletions keymap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import bpy

from mathutils import Vector, Euler, Matrix


def get_keymap(keymap_name) -> "bpy.types.KeyMap":
kc = bpy.context.window_manager.keyconfigs
addon = kc.addon
keymap = kc.default.keymaps.get(keymap_name, None)
return addon.keymaps.new(
keymap_name,
space_type=keymap.space_type,
region_type=keymap.region_type
)


def get_kmi_operator_properties(kmi: 'bpy.types.KeyMapItem') -> dict:
"""获取kmi操作符的属性"""
properties = kmi.properties
prop_keys = dict(properties.items()).keys()
dictionary = {i: getattr(properties, i, None) for i in prop_keys}
del_key = []
for item in dictionary:
prop = getattr(properties, item, None)
typ = type(prop)
if prop:
if typ == Vector:
# 属性阵列-浮点数组
dictionary[item] = dictionary[item].to_tuple()
elif typ == Euler:
dictionary[item] = dictionary[item][:]
elif typ == Matrix:
dictionary[item] = tuple(i[:] for i in dictionary[item])
elif typ == bpy.types.bpy_prop_array:
dictionary[item] = dictionary[item][:]
elif typ in (str, bool, float, int, set, list, tuple):
...
elif typ.__name__ in [
'TRANSFORM_OT_shrink_fatten',
'TRANSFORM_OT_translate',
'TRANSFORM_OT_edge_slide',
'NLA_OT_duplicate',
'ACTION_OT_duplicate',
'GRAPH_OT_duplicate',
'TRANSFORM_OT_translate',
'OBJECT_OT_duplicate',
'MESH_OT_loopcut',
'MESH_OT_rip_edge',
'MESH_OT_rip',
'MESH_OT_duplicate',
'MESH_OT_offset_edge_loops',
'MESH_OT_extrude_faces_indiv',
]: # 一些奇怪的操作符属性,不太好解析也用不上
...
del_key.append(item)
else:
print('emm 未知属性,', typ, dictionary[item])
del_key.append(item)
for i in del_key:
dictionary.pop(i)
return dictionary


def draw_key(layout: bpy.types.UILayout):
"""在偏好设置绘制插件快捷键"""
import rna_keymap_ui
from .tool.development_key import register_keymap_items

kc = bpy.context.window_manager.keyconfigs.user

for km, kmi in register_keymap_items:
kmm = kc.keymaps.get(km.name)
if kmm:
is_find = False
for kmii in kmm.keymap_items:
if kmi.idname == kmii.idname:
if get_kmi_operator_properties(kmi) == get_kmi_operator_properties(kmii):
col = layout.column(align=True)
if (not kmii.is_user_defined) and kmii.is_user_modified:
col.context_pointer_set("keymap", kmm)
is_find = True
rna_keymap_ui.draw_kmi(["ADDON", "USER", "DEFAULT"], kc, kmm, kmii, col, 0)
break # 找到了,但有可能会找到多个
if not is_find:
column = layout.column(align=True)
column.label(text="Not Found Keymap, Please check the shortcut keys that have been changed")
draw_restore_keymap_button(column)
160 changes: 59 additions & 101 deletions preferences.py
Original file line number Diff line number Diff line change
@@ -1,130 +1,88 @@
import bpy.utils
from bpy.props import BoolProperty, IntProperty, StringProperty, CollectionProperty
from bpy.types import AddonPreferences
import bpy

from .public import PublicClass
from .tool import (auto_reload_script,
custom_key,
fast_open_addon_code,
restart_blender,
addon_search,
)
from .tool import update_by_tool_name
from .tool.auto_reload_script import AutoReloadScriptPreferences

tool_mod = {'fast_open_addon_code': fast_open_addon_code,
'enabled_reload_script': auto_reload_script,
'restart_blender': restart_blender,
'custom_key': custom_key,
'save_addon_search': addon_search
}

class ShowExpandedItem(bpy.types.PropertyGroup):
"""Used to record the expansion status of the addon"""
show_expanded: bpy.props.BoolProperty(default=False)

def update_tool(un_register=False):
pref = PublicClass.pref_()
for prop_name, tool in tool_mod.items():
is_enable = getattr(pref, prop_name, False)
if un_register or (not is_enable):
tool.unregister()
elif is_enable:
tool.register()


class ShowExpanded(bpy.types.PropertyGroup):
show_expanded: BoolProperty(default=False)


class ToolPreferences(AddonPreferences):
class ToolPreferences(bpy.types.AddonPreferences, AutoReloadScriptPreferences):
bl_idname = __package__

@staticmethod
def update_by_tool_name(tool_name):
"""Change prop update tool"""

def update(self, context):
prop = getattr(self, tool_name, None)
if prop:
tool_mod[tool_name].register()
elif prop is False:
tool_mod[tool_name].unregister()
activate_auto_reload_script: bpy.props.BoolProperty(
default=True,
name="ReLoad Script",
description="Automatically reload scripts and run them",
update=update_by_tool_name("auto_reload_script"),
)

return update
activate_development_key: bpy.props.BoolProperty(
default=True,
name="Development Keymap",
description="Commonly used Keymaps to speed up the development process",
update=update_by_tool_name("development_key"),
)

fast_open_addon_code: BoolProperty(
activate_open_addon_script: bpy.props.BoolProperty(
default=False,
name='Feat Open Addon Script or Folder',
description='Rewrite the drawing method of the addon section,'
' and display it in the expansion of the addon',
update=update_by_tool_name('fast_open_addon_code'), )
restart_blender: BoolProperty(
default=True,
name='Restart Blender',
description='Enabled Multiple Blender,or Restart Blender',
update=update_by_tool_name('restart_blender'),
name="Addon Open",
description="Rewrite the drawing method of the addon section, and display it in the expansion of the addon",
update=update_by_tool_name("open_addon_script")
)
custom_key: BoolProperty(
activate_remember_addon_expanded: bpy.props.BoolProperty(
default=True,
name='Development Key',
description='alt+Space Toggle Full Screen'
'ctrl+alt+MiddleMouse Show Console'
'ctrl+alt+RightMouse Switch User Translate Interface'
'ctrl+alt+AccentGrave Save Home File',
update=update_by_tool_name('custom_key'),
name="Remember addon expanded",
description="Record the expanded Addon and restore it the next time you open Blender",
update=update_by_tool_name("remember_addon_expanded"),
)
save_addon_search: BoolProperty(

activate_remember_addon_search: bpy.props.BoolProperty(
default=True,
name='Save addon search',
description='',
update=update_by_tool_name('save_addon_search'),
name="Remember addon search",
description="Record the Addon search and restore it the next time you start Blender",
update=update_by_tool_name("remember_addon_search"),
)
addon_search: StringProperty()
addon_show_expanded: CollectionProperty(type=ShowExpanded)

enabled_reload_script: BoolProperty(
activate_restart_blender: bpy.props.BoolProperty(
default=True,
name='ReLoad Script Tool',
description='',
update=update_by_tool_name('enabled_reload_script'),
name="Restart Blender",
description="Enable multiple Blenders or restart Blender, please be careful to save the edit file!!!!",
update=update_by_tool_name("restart_blender"),
)

# Auto Reload
def update_reload_script(self, context):
text = context.space_data.text
try:
bpy.ops.text.reload()
if self.auto_run_script:
try:
bpy.ops.text.run_script()
print(f'Reload Script {text.name},and Run Script!!!')
except Exception as e:
print('Run Error!!', e.args)
except Exception as e:
print(f'Reload Script {text.name} Error,Perhaps this script does not exist', e.args)
self.auto_reload_script = False

reload_script_number: IntProperty(default=True,
update=update_reload_script)
auto_run_script: BoolProperty(name='Auto run script switch, only when auto reload script is turned on can it run',
options={'SKIP_SAVE'},
default=False)

auto_reload_script: BoolProperty(name="Whether to automatically reload scripts", default=True, )
# Other Property
addon_show_expanded: bpy.props.CollectionProperty(type=ShowExpandedItem)
addon_search: bpy.props.StringProperty(default="")

def draw(self, context):
for i in ('fast_open_addon_code',
'enabled_reload_script',
'restart_blender',
'custom_key',
'save_addon_search',
):
self.layout.prop(self, i)
from .keymap import draw_key

column = self.layout.column(align=True)
for prop in self.bl_rna.properties:
if prop.identifier.startswith("activate_"):
self.draw_prop(column, prop.identifier)

if self.activate_development_key:
column.separator()
col = column.box().column(align=True)
col.label(text="Keymap")
draw_key(col)

def draw_prop(self, layout, identifier) -> None:
split = layout.row(align=True).split(factor=.2, align=True)
prop = self.bl_rna.properties[identifier]
split.prop(self, identifier, toggle=True, expand=True)
split.label(text=prop.description)


def register():
bpy.utils.register_class(ShowExpanded)
bpy.utils.register_class(ShowExpandedItem)
bpy.utils.register_class(ToolPreferences)
update_tool()


def unregister():
bpy.utils.unregister_class(ToolPreferences)
bpy.utils.unregister_class(ShowExpanded)
update_tool(un_register=True)
bpy.utils.unregister_class(ShowExpandedItem)
99 changes: 0 additions & 99 deletions public.py

This file was deleted.

Loading