suwoodblender/blenderpython/blender_test.py

317 lines
8.5 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Blender中测试SUWImpl功能的脚本
使用方式在Blender的Python控制台中运行这个脚本
"""
import sys
import os
# 添加当前目录到Python路径
current_dir = os.path.dirname(os.path.abspath(__file__))
if current_dir not in sys.path:
sys.path.append(current_dir)
try:
import bpy
print("✅ Blender API 可用")
BLENDER_AVAILABLE = True
except ImportError:
print("⚠️ Blender API 不可用,使用模拟模式")
BLENDER_AVAILABLE = False
def clear_scene():
"""清空场景"""
if BLENDER_AVAILABLE:
# 删除所有网格对象
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
# 删除所有材质
for material in bpy.data.materials:
bpy.data.materials.remove(material)
# 删除所有集合
for collection in bpy.data.collections:
bpy.data.collections.remove(collection)
print("🧹 场景已清空")
def test_basic_import():
"""测试基本导入"""
try:
from suw_impl import SUWImpl, Point3d, Vector3d, Transformation
print("✅ 成功导入 SUWImpl 和几何类")
return True
except Exception as e:
print(f"❌ 导入失败: {e}")
return False
def test_suw_impl_initialization():
"""测试SUWImpl初始化"""
try:
from suw_impl import SUWImpl
# 获取实例
impl = SUWImpl.get_instance()
print(f"✅ SUWImpl 实例创建成功: {type(impl)}")
# 初始化
impl.startup()
print("✅ SUWImpl 启动成功")
return impl
except Exception as e:
print(f"❌ SUWImpl 初始化失败: {e}")
return None
def test_geometry_classes():
"""测试几何类"""
try:
from suw_impl import Point3d, Vector3d, Transformation
# 测试Point3d
p1 = Point3d(1.0, 2.0, 3.0)
p2 = Point3d.parse("4.5,5.6,6.7")
print(f"✅ Point3d 测试: {p1}, {p2}")
# 测试Vector3d
v1 = Vector3d(1.0, 0.0, 0.0)
v2 = Vector3d.parse("0,1,0")
v3 = v1.normalize()
print(f"✅ Vector3d 测试: {v1}, {v2}, normalized: {v3}")
# 测试Transformation
t1 = Transformation(p1, v1, v2, Vector3d(0, 0, 1))
print(f"✅ Transformation 测试: origin={t1.origin}")
return True
except Exception as e:
print(f"❌ 几何类测试失败: {e}")
return False
def test_basic_commands():
"""测试基本命令"""
try:
from suw_impl import SUWImpl
impl = SUWImpl.get_instance()
# 测试c00命令清空选择
test_data = {"uid": "test_uid_001"}
impl.c00(test_data)
print("✅ c00 命令测试成功")
# 测试c01命令单位设置
test_data = {
"uid": "test_uid_001",
"unit_drawing": "test_drawing.dwg",
"drawing_name": "测试图纸"
}
impl.c01(test_data)
print("✅ c01 命令测试成功")
return True
except Exception as e:
print(f"❌ 基本命令测试失败: {e}")
return False
def test_geometry_creation():
"""测试几何创建"""
try:
from suw_impl import SUWImpl, Point3d
impl = SUWImpl.get_instance()
# 创建测试surface数据
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"
}
# 测试create_face方法
if hasattr(impl, 'create_face'):
face = impl.create_face(None, test_surface, "mat_normal")
if face:
print("✅ create_face 测试成功")
else:
print("⚠️ create_face 返回 None")
else:
print("⚠️ create_face 方法不存在")
return True
except Exception as e:
print(f"❌ 几何创建测试失败: {e}")
return False
def test_material_system():
"""测试材质系统"""
try:
from suw_impl import SUWImpl
impl = SUWImpl.get_instance()
# 测试添加材质
impl.add_mat_rgb("test_mat", 1.0, 255, 128, 64)
print("✅ 材质添加测试成功")
# 测试获取纹理
texture = impl.get_texture("mat_normal")
print(f"✅ 纹理获取测试: {texture}")
return True
except Exception as e:
print(f"❌ 材质系统测试失败: {e}")
return False
def create_test_scene():
"""创建测试场景"""
if not BLENDER_AVAILABLE:
print("⚠️ 非Blender环境跳过场景创建")
return
try:
# 添加一些基本几何体作为测试
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
cube = bpy.context.active_object
cube.name = "SUW_Test_Cube"
# 创建测试材质
mat = bpy.data.materials.new(name="SUW_Test_Material")
mat.use_nodes = True
# 安全设置材质颜色兼容不同Blender版本
try:
# 尝试找到Principled BSDF节点
bsdf = None
for node in mat.node_tree.nodes:
if "BSDF" in node.type:
bsdf = node
break
if bsdf and hasattr(bsdf, 'inputs'):
# 尝试设置基础颜色
if "Base Color" in bsdf.inputs:
bsdf.inputs["Base Color"].default_value = (
0.8, 0.2, 0.2, 1.0)
elif len(bsdf.inputs) > 0:
bsdf.inputs[0].default_value = (0.8, 0.2, 0.2, 1.0)
except Exception as e:
print(f"⚠️ 设置材质颜色失败: {e}")
cube.data.materials.append(mat)
print("✅ 测试场景创建成功")
except Exception as e:
print(f"❌ 测试场景创建失败: {e}")
def run_comprehensive_test():
"""运行完整测试"""
print("🚀 开始 SUWImpl Blender 测试")
print("=" * 50)
# 清空场景
clear_scene()
# 测试步骤
tests = [
("基本导入", test_basic_import),
("几何类", test_geometry_classes),
("SUWImpl初始化", test_suw_impl_initialization),
("基本命令", test_basic_commands),
("材质系统", test_material_system),
("几何创建", test_geometry_creation),
]
results = []
for test_name, test_func in tests:
print(f"\n📝 测试: {test_name}")
print("-" * 30)
try:
result = test_func()
results.append((test_name, result))
if result:
print(f"{test_name} 测试通过")
else:
print(f"{test_name} 测试失败")
except Exception as e:
print(f"💥 {test_name} 测试异常: {e}")
results.append((test_name, False))
# 创建测试场景
print(f"\n📝 测试: 场景创建")
print("-" * 30)
create_test_scene()
# 总结
print("\n" + "=" * 50)
print("📊 测试结果总结:")
passed = sum(1 for _, result in results if result)
total = len(results)
for test_name, result in results:
status = "✅ 通过" if result else "❌ 失败"
print(f" {test_name}: {status}")
print(f"\n🎯 总体结果: {passed}/{total} 测试通过")
if passed == total:
print("🎉 所有测试通过SUWImpl 在 Blender 中运行正常")
else:
print("⚠️ 部分测试失败,需要进一步调试")
def quick_demo():
"""快速演示"""
print("🎭 SUWImpl 快速演示")
print("=" * 30)
try:
from suw_impl import SUWImpl, Point3d, Vector3d
# 创建实例
impl = SUWImpl.get_instance()
impl.startup()
# 演示几何类
p1 = Point3d(0, 0, 0)
p2 = Point3d(10, 10, 10)
v1 = Vector3d(1, 0, 0)
print(f"📍 点1: {p1}")
print(f"📍 点2: {p2}")
print(f"📏 向量: {v1}")
print(f"📏 归一化向量: {v1.normalize()}")
# 演示命令
test_data = {"uid": "demo_001"}
impl.c00(test_data)
print("✅ 快速演示完成")
except Exception as e:
print(f"❌ 演示失败: {e}")
if __name__ == "__main__":
# 如果直接运行此脚本,执行完整测试
run_comprehensive_test()