Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 18:18:51 +08:00
commit d80558b1cf
52 changed files with 12920 additions and 0 deletions

134
skills/addon/__init__.py Normal file
View File

@@ -0,0 +1,134 @@
"""
Blender Toolkit WebSocket Server
Claude Code와 통신하기 위한 WebSocket 서버 애드온
설치 방법:
1. Blender > Edit > Preferences > Add-ons > Install
2. 이 파일 선택
3. "Blender Toolkit WebSocket Server" 활성화
"""
# flake8: noqa: E402
# Blender addon requires bl_info at top of file
bl_info = { # type: ignore[misc]
"name": "Blender Toolkit WebSocket Server",
"author": "Dev GOM",
"version": (1, 0, 0),
"blender": (4, 0, 0),
"location": "View3D > Sidebar > Blender Toolkit",
"description": (
"WebSocket server for Claude Code integration "
"with animation retargeting"
),
"category": "Animation",
}
# Add bundled dependencies to sys.path
import sys
import os
_addon_dir = os.path.dirname(os.path.realpath(__file__))
_libs_dir = os.path.join(_addon_dir, 'libs')
if os.path.exists(_libs_dir) and _libs_dir not in sys.path:
sys.path.insert(0, _libs_dir)
import bpy
# Logging utilities
from .utils.logger import get_logger
# WebSocket Server
from .websocket_server import BlenderWebSocketServer
# UI Classes
from .ui import (
BoneMappingItem,
BLENDERTOOLKIT_PT_Panel,
BLENDERTOOLKIT_PT_BoneMappingPanel,
BLENDERTOOLKIT_OT_StartServer,
BLENDERTOOLKIT_OT_StopServer,
BLENDERTOOLKIT_OT_AutoRemap,
BLENDERTOOLKIT_OT_ApplyRetargeting,
)
# 모듈 로거 초기화
logger = get_logger('addon')
# ============================================================================
# 등록/해제
# ============================================================================
def register():
"""Blender 애드온 클래스 및 속성 등록."""
# Register property groups first
bpy.utils.register_class(BoneMappingItem)
# Register UI panels
bpy.utils.register_class(BLENDERTOOLKIT_PT_Panel)
bpy.utils.register_class(BLENDERTOOLKIT_PT_BoneMappingPanel)
# Register operators
bpy.utils.register_class(BLENDERTOOLKIT_OT_StartServer)
bpy.utils.register_class(BLENDERTOOLKIT_OT_StopServer)
bpy.utils.register_class(BLENDERTOOLKIT_OT_AutoRemap)
bpy.utils.register_class(BLENDERTOOLKIT_OT_ApplyRetargeting)
# 포트 설정 속성
bpy.types.Scene.blender_toolkit_port = bpy.props.IntProperty(
name="Port",
description="WebSocket server port",
default=9400,
min=1024,
max=65535
)
# 본 매핑 속성
bpy.types.Scene.bone_mapping_items = bpy.props.CollectionProperty(
type=BoneMappingItem,
name="Bone Mapping Items"
)
bpy.types.Scene.bone_mapping_source_armature = bpy.props.StringProperty(
name="Source Armature",
description="Source armature name"
)
bpy.types.Scene.bone_mapping_target_armature = bpy.props.StringProperty(
name="Target Armature",
description="Target armature name"
)
bpy.types.Scene.bone_mapping_status = bpy.props.StringProperty(
name="Bone Mapping Status",
description="Current status of bone mapping operation",
default=""
)
print("✅ Blender Toolkit WebSocket Server registered")
def unregister():
"""Blender 애드온 클래스 및 속성 등록 해제."""
# Unregister operators
bpy.utils.unregister_class(BLENDERTOOLKIT_OT_ApplyRetargeting)
bpy.utils.unregister_class(BLENDERTOOLKIT_OT_AutoRemap)
bpy.utils.unregister_class(BLENDERTOOLKIT_OT_StopServer)
bpy.utils.unregister_class(BLENDERTOOLKIT_OT_StartServer)
# Unregister UI panels
bpy.utils.unregister_class(BLENDERTOOLKIT_PT_BoneMappingPanel)
bpy.utils.unregister_class(BLENDERTOOLKIT_PT_Panel)
# Unregister property groups
bpy.utils.unregister_class(BoneMappingItem)
# Delete properties
del bpy.types.Scene.bone_mapping_status
del bpy.types.Scene.bone_mapping_target_armature
del bpy.types.Scene.bone_mapping_source_armature
del bpy.types.Scene.bone_mapping_items
del bpy.types.Scene.blender_toolkit_port
print("🔌 Blender Toolkit WebSocket Server unregistered")
if __name__ == "__main__":
register()