参数输入输出模型文件
This commit is contained in:
171
run_blender_input.py
Normal file
171
run_blender_input.py
Normal file
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
运行脚本 - 使用Blender生成3D光学系统模型
|
||||
|
||||
使用方法:
|
||||
1. 确保已安装Blender
|
||||
2. 运行此脚本: python run_blender_input.py -i jsonfile.json
|
||||
|
||||
输出文件:
|
||||
- optical_system.obj - 3D模型文件
|
||||
- optical_system.glb - Web友好格式
|
||||
- optical_system.blend - Blender工程文件
|
||||
- optical_system_render.png - 渲染图像
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import os
|
||||
import platform
|
||||
import argparse
|
||||
|
||||
def find_blender():
|
||||
"""查找Blender可执行文件"""
|
||||
system = platform.system()
|
||||
|
||||
common_paths = []
|
||||
if system == "Windows":
|
||||
common_paths = [
|
||||
r"C:\Program Files\Blender Foundation\Blender 3.6\blender.exe",
|
||||
r"C:\Program Files\Blender Foundation\Blender 4.0\blender.exe",
|
||||
r"C:\Program Files (x86)\Blender Foundation\Blender 3.6\blender.exe",
|
||||
]
|
||||
elif system == "Darwin": # macOS
|
||||
common_paths = [
|
||||
"/Applications/Blender.app/Contents/MacOS/Blender",
|
||||
"/usr/local/bin/blender",
|
||||
]
|
||||
elif system == "Linux":
|
||||
common_paths = [
|
||||
"/usr/bin/blender",
|
||||
"/usr/local/bin/blender",
|
||||
"/snap/bin/blender",
|
||||
]
|
||||
|
||||
# 首先尝试从PATH中找到blender
|
||||
try:
|
||||
result = subprocess.run(["which", "blender"], capture_output=True, text=True)
|
||||
if result.returncode == 0:
|
||||
return result.stdout.strip()
|
||||
except:
|
||||
pass
|
||||
|
||||
# 尝试常见路径
|
||||
for path in common_paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
|
||||
return None
|
||||
|
||||
def run_blender_script(json_file):
|
||||
"""运行Blender脚本"""
|
||||
blender_path = find_blender()
|
||||
|
||||
if not blender_path:
|
||||
print("❌ 错误:未找到Blender安装")
|
||||
print("\n请确保已安装Blender并且可以从命令行访问")
|
||||
print("下载地址: https://www.blender.org/download/")
|
||||
return False
|
||||
|
||||
print(f"✅ 找到Blender: {blender_path}")
|
||||
|
||||
script_path = os.path.abspath("toModel.py")
|
||||
if not os.path.exists(script_path):
|
||||
print(f"❌ 错误:未找到脚本文件 {script_path}")
|
||||
return False
|
||||
|
||||
json_path = os.path.abspath(json_file)
|
||||
if not os.path.exists(json_path):
|
||||
print(f"❌ 错误:未找到JSON数据文件 {json_path}")
|
||||
return False
|
||||
|
||||
print(f"📄 使用JSON文件: {json_path}")
|
||||
print("🚀 开始运行Blender脚本...")
|
||||
print("这可能需要几分钟时间,请耐心等待...")
|
||||
|
||||
try:
|
||||
# 运行Blender脚本,传递JSON文件路径
|
||||
cmd = [
|
||||
blender_path,
|
||||
"--background", # 后台运行
|
||||
"--python", script_path,
|
||||
"--", # 分隔符,后面的参数会传递给Python脚本
|
||||
json_path
|
||||
]
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=300)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("✅ Blender脚本执行成功!")
|
||||
print("\n输出信息:")
|
||||
print(result.stdout)
|
||||
|
||||
# 检查生成的文件
|
||||
expected_files = [
|
||||
"optical_system.obj",
|
||||
"optical_system.glb",
|
||||
"optical_system.blend",
|
||||
"optical_system_render.png"
|
||||
]
|
||||
|
||||
print("\n📁 生成的文件:")
|
||||
for filename in expected_files:
|
||||
if os.path.exists(filename):
|
||||
size = os.path.getsize(filename)
|
||||
print(f"✅ {filename} ({size:,} bytes)")
|
||||
else:
|
||||
print(f"❌ {filename} (未找到)")
|
||||
|
||||
return True
|
||||
else:
|
||||
print("❌ Blender脚本执行失败")
|
||||
print("错误输出:")
|
||||
print(result.stderr)
|
||||
if result.stdout:
|
||||
print("标准输出:")
|
||||
print(result.stdout)
|
||||
return False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
print("❌ 脚本执行超时(超过5分钟)")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ 执行时出错: {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
# 设置命令行参数解析
|
||||
parser = argparse.ArgumentParser(
|
||||
description="使用Blender生成3D光学系统模型",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
使用示例:
|
||||
python run_blender_input.py -i data.json
|
||||
python run_blender_input.py --input config.json
|
||||
"""
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-i", "--input",
|
||||
required=True,
|
||||
help="输入的JSON文件路径"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
print("🎨 Blender 3D光学系统建模脚本")
|
||||
print("=" * 40)
|
||||
|
||||
if run_blender_script(args.input):
|
||||
print("\n🎉 任务完成!")
|
||||
print("\n您可以:")
|
||||
print("1. 使用Blender打开 optical_system.blend 文件进行编辑")
|
||||
print("2. 在3D软件中导入 optical_system.obj 文件")
|
||||
print("3. 在Web浏览器中查看 optical_system.glb 文件")
|
||||
print("4. 查看渲染图像 optical_system_render.png")
|
||||
else:
|
||||
print("\n❌ 任务失败,请检查错误信息")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user