# SUWImpl Blender 测试指南 ## 📋 概述 本指南介绍如何在Blender中测试SUWImpl Python功能。SUWImpl是从Ruby版本翻译而来的木工设计系统核心实现。 ## 🛠 环境要求 - **Blender 版本**: 2.8+ (推荐 3.0+) - **Python 版本**: 3.7+ (Blender内置) - **操作系统**: Windows/Linux/macOS ## 📁 文件结构 ``` blenderpython/ ├── suw_impl.py # 核心实现文件 ├── suw_constants.py # 常量定义 ├── suw_client.py # 网络客户端 ├── suw_menu.py # 菜单系统 ├── suw_*.py # 其他模块文件 ├── blender_test.py # 测试脚本 └── BLENDER_TEST_GUIDE.md # 本指南 ``` ## 🚀 快速开始 ### 方案1: Blender脚本编辑器 (推荐) 1. **打开Blender** - 启动Blender应用程序 - 切换到 `Scripting` 工作空间 2. **加载测试脚本** ```python # 在Blender脚本编辑器中粘贴以下代码 import sys import os # 修改此路径为你的blenderpython目录 blender_python_path = r"D:\XL\code\blender\blenderpython" if blender_python_path not in sys.path: sys.path.append(blender_python_path) # 导入并运行测试 exec(open(os.path.join(blender_python_path, "blender_test.py")).read()) ``` 3. **运行测试** - 点击 `Run Script` 按钮 - 在控制台中查看测试结果 ### 方案2: Blender Python控制台 1. **打开Python控制台** - 在Blender中按 `Shift + F4` 或切换到 `Scripting` 工作空间 - 选择 `Python Console` 面板 2. **设置路径并导入** ```python import sys sys.path.append(r"D:\XL\code\blender\blenderpython") # 快速测试导入 from suw_impl import SUWImpl, Point3d, Vector3d # 创建实例 impl = SUWImpl.get_instance() impl.startup() # 测试几何类 p1 = Point3d(0, 0, 0) p2 = Point3d(10, 10, 10) print(f"点1: {p1}, 点2: {p2}") ``` ### 方案3: 外部脚本文件 1. **创建启动脚本** ```python # 保存为 start_test.py import bpy import sys import os # 添加路径 script_dir = r"D:\XL\code\blender\blenderpython" if script_dir not in sys.path: sys.path.append(script_dir) # 运行完整测试 import blender_test blender_test.run_comprehensive_test() ``` 2. **在Blender中运行** - `File` → `Open` → 选择脚本文件 - 或者用文本编辑器打开并运行 ## 🧪 测试功能 ### 基础功能测试 ```python # 1. 基本导入测试 from suw_impl import SUWImpl, Point3d, Vector3d, Transformation # 2. 实例创建测试 impl = SUWImpl.get_instance() impl.startup() # 3. 几何类测试 p1 = Point3d(1.0, 2.0, 3.0) v1 = Vector3d(1.0, 0.0, 0.0).normalize() t1 = Transformation(p1, v1, Vector3d(0,1,0), Vector3d(0,0,1)) ``` ### 命令系统测试 ```python # 测试各种命令 impl = SUWImpl.get_instance() # c00: 清空选择 impl.c00({"uid": "test_001"}) # c01: 单位设置 impl.c01({ "uid": "test_001", "unit_drawing": "test.dwg", "drawing_name": "测试图纸" }) # c02: 区域操作 impl.c02({ "uid": "test_001", "zones": {"z001": {"name": "测试区域"}} }) ``` ### 几何创建测试 ```python # 创建测试面 test_surface = { "segs": [ ["0,0,0", "100,0,0"], # 底边 ["100,0,0", "100,100,0"], # 右边 ["100,100,0", "0,100,0"], # 顶边 ["0,100,0", "0,0,0"] # 左边 ], "vx": "1,0,0", "vy": "0,1,0", "vz": "0,0,1" } # 如果方法存在,则测试 if hasattr(impl, 'create_face'): face = impl.create_face(None, test_surface, "mat_normal") print(f"面创建结果: {face}") ``` ### 材质系统测试 ```python # 添加自定义材质 impl.add_mat_rgb("custom_red", 1.0, 255, 0, 0) impl.add_mat_rgb("custom_blue", 0.8, 0, 0, 255) # 获取材质 texture = impl.get_texture("mat_normal") print(f"默认材质: {texture}") ``` ## 🎯 高级测试场景 ### 场景1: 木工零件创建 ```python # 模拟c03命令 - 零件创建 part_data = { "uid": "furniture_001", "parts": { "p001": { "name": "桌面板", "finals": { "f001": { "typ": 1, # 板材类型 "obv": { "segs": [ ["0,0,0", "1200,0,0"], ["1200,0,0", "1200,600,0"], ["1200,600,0", "0,600,0"], ["0,600,0", "0,0,0"] ], "vz": "0,0,1" }, "color": "mat_wood", "thickness": 18 } } } } } impl.c03(part_data) ``` ### 场景2: 批量零件处理 ```python # 创建多个零件 for i in range(3): part_data = { "uid": f"batch_test_{i:03d}", "parts": { f"p{i:03d}": { "name": f"零件_{i}", "finals": { f"f{i:03d}": { "typ": 1, "obv": { "segs": [ [f"{i*100},0,0", f"{(i+1)*100},0,0"], [f"{(i+1)*100},0,0", f"{(i+1)*100},50,0"], [f"{(i+1)*100},50,0", f"{i*100},50,0"], [f"{i*100},50,0", f"{i*100},0,0"] ] } } } } } } impl.c03(part_data) ``` ## 🔧 调试技巧 ### 1. 启用详细日志 ```python # 在测试前设置 import logging logging.basicConfig(level=logging.DEBUG) ``` ### 2. 检查Blender控制台 - Windows: `Window` → `Toggle System Console` - 查看详细的错误信息和调试输出 ### 3. 分步测试 ```python # 逐步测试每个功能 def step_by_step_test(): print("步骤1: 导入模块") from suw_impl import SUWImpl print("步骤2: 创建实例") impl = SUWImpl.get_instance() print("步骤3: 初始化") impl.startup() print("步骤4: 测试命令") impl.c00({"uid": "debug_test"}) print("✅ 分步测试完成") step_by_step_test() ``` ### 4. 错误处理 ```python def safe_test(): try: # 测试代码 impl = SUWImpl.get_instance() impl.startup() except ImportError as e: print(f"导入错误: {e}") print("请检查文件路径和Python路径设置") except AttributeError as e: print(f"属性错误: {e}") print("可能是方法名称错误或版本不匹配") except Exception as e: print(f"未知错误: {e}") import traceback traceback.print_exc() safe_test() ``` ## 📊 性能测试 ### 内存使用监控 ```python import psutil import time def monitor_memory(): process = psutil.Process() print("开始内存监控...") start_memory = process.memory_info().rss / 1024 / 1024 # MB # 运行测试 impl = SUWImpl.get_instance() impl.startup() # 创建大量数据进行压力测试 for i in range(100): test_data = {"uid": f"stress_test_{i}"} impl.c00(test_data) end_memory = process.memory_info().rss / 1024 / 1024 # MB print(f"内存使用: {start_memory:.1f}MB → {end_memory:.1f}MB") print(f"内存增长: {end_memory - start_memory:.1f}MB") monitor_memory() ``` ### 执行时间测试 ```python import time def benchmark_commands(): impl = SUWImpl.get_instance() commands = ['c00', 'c01', 'c02'] test_data = {"uid": "benchmark_test"} for cmd_name in commands: if hasattr(impl, cmd_name): start_time = time.time() # 执行100次 for _ in range(100): getattr(impl, cmd_name)(test_data) end_time = time.time() avg_time = (end_time - start_time) / 100 * 1000 # ms print(f"{cmd_name}: 平均执行时间 {avg_time:.2f}ms") benchmark_commands() ``` ## 🐛 常见问题 ### Q1: 导入模块失败 **问题**: `ModuleNotFoundError: No module named 'suw_impl'` **解决方案**: ```python import sys import os # 确保路径正确 blender_python_path = r"你的实际路径\blenderpython" if os.path.exists(blender_python_path): sys.path.append(blender_python_path) print(f"✅ 路径添加成功: {blender_python_path}") else: print(f"❌ 路径不存在: {blender_python_path}") ``` ### Q2: Blender API不可用 **问题**: 在非Blender环境中运行报错 **解决方案**: SUWImpl设计为兼容模式,会自动检测并使用存根模式 ### Q3: 性能问题 **问题**: 大量数据处理时Blender卡顿 **解决方案**: ```python # 批量处理时禁用视图更新 bpy.context.view_layer.update() # 手动控制更新时机 # 或者使用后台模式 bpy.app.use_event_simulate = True ``` ### Q4: 中文编码问题 **问题**: 中文字符显示乱码 **解决方案**: ```python import sys # 确保编码设置 sys.stdout.reconfigure(encoding='utf-8') ``` ## 📚 扩展资源 ### 相关文档 - [Blender Python API](https://docs.blender.org/api/current/) - [SUWood 原始项目文档](../ruby/) ### 示例项目 - 检查 `test_data.json` 了解数据格式 - 参考 `client.py` 了解网络通信 ### 开发工具 - **VS Code**: 安装Blender插件进行开发 - **PyCharm**: 配置Blender Python解释器 - **Blender**: 内置脚本编辑器 ## 🎉 结语 通过本指南,你应该能够在Blender中成功测试SUWImpl的所有功能。如果遇到问题,请检查: 1. ✅ Python路径设置正确 2. ✅ 所有必需文件存在 3. ✅ Blender版本兼容 4. ✅ 语法错误已修复 祝测试顺利!🚀