ai blender流水线制作mod第一步,画个立方体

不就是类似blender-mcp的东西吗

ai blender流水线制作mod第一步,画个立方体_哔哩哔哩_bilibili

blender 开放exec接口的插件 连接ide vscode-CSDN博客

ai流水线式调用命令-CSDN博客

复制代码
{
  "tools": [
    {
      "name": "get_all_objects",
      "path": "blender_cline/blender_api_tool.py",
      "description": "获取Blender当前场景中的所有物体",
      "parameters": [],
      "examples": [
        "[TOOL:get_all_objects]"
      ]
    },
    {
      "name": "delete_all_objects",
      "path": "blender_cline/blender_api_tool.py",
      "description": "删除Blender当前场景中的所有物体",
      "parameters": [],
      "examples": [
        "[TOOL:delete_all_objects]"
      ]
    },
    {
      "name": "create_cube",
      "path": "blender_cline/blender_api_tool.py",
      "description": "在Blender场景中创建一个立方体",
      "parameters": [],
      "examples": [
        "[TOOL:create_cube]"
      ]
    },
    {
      "name": "activate_blender",
      "path": "blender_cline/blender_api_tool.py",
      "description": "激活Blender窗口,将Blender应用带到前台",
      "parameters": [],
      "examples": [
        "[TOOL:activate_blender]"
      ]
    }
  ]
}
python 复制代码
import sys
import os
import requests
import json
import subprocess
import platform


def call_blender_api(endpoint, code):
    """
    调用Blender API执行代码
    """
    url = f"http://localhost:8080{endpoint}"
    
    payload = {
        "code": code
    }
    
    try:
        response = requests.post(url, json=payload)
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"请求错误: {e}")
        return None


def activate_blender_window():
    """
    激活Blender窗口(精确匹配窗口标题)
    """
    try:
        import pygetwindow as gw
    except ImportError:
        print("pygetwindow未安装,请运行: pip install pygetwindow")
        return False
    
    try:
        # 获取所有窗口
        all_windows = gw.getAllWindows()
        blender_window = None
        
        for window in all_windows:
            window_title = window.title.strip()
            
            # 多种可能的Blender标题格式
            if (window_title == 'Blender' or  # 基础标题
                window_title.startswith('Blender') and 
                not any(exclude in window_title.lower() for exclude in ['vscode', 'visual studio', 'code'])):
                
                # 额外检查确保不是VSCode或其他编辑器
                if ' - ' not in window_title or 'blender.exe' in window_title.lower():
                    blender_window = window
                    break
        
        if blender_window:
            print(f"激活窗口: {blender_window.title}")
            
            try:
                import win32gui
                import win32con
                
                hwnd = blender_window._hWnd
                win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
                win32gui.SetForegroundWindow(hwnd)
                
                print(f"窗口已放到最前端: {blender_window.title}")
                return True
            except ImportError:
                print("pywin32未安装,请运行: pip install pywin32")
                if blender_window.isMinimized:
                    blender_window.restore()
                blender_window.activate()
                print("Blender窗口已激活(使用pygetwindow方法)")
                return True
        else:
            print("未找到Blender窗口")
            # 显示所有窗口标题用于调试
            all_titles = gw.getAllTitles()
            print("所有窗口标题(前10个):")
            for i, title in enumerate(all_titles[:10]):
                if title.strip():
                    print(f"  {i+1}. {title}")
            return False

    except Exception as e:
        print(f"激活Blender窗口时出错: {e}")
        return False


def main():
    if len(sys.argv) < 2:
       
        print("错误: 缺少工具名称参数")
        return
    
    tool_name = sys.argv[1]
    
    if tool_name == "get_all_objects":
        code = '''
import bpy

# 获取当前场景中的所有物体
all_objects = bpy.context.scene.objects

# 打印每个物体的名称
result = []
for obj in all_objects:
    obj_info = f"obj: {obj.name}"
    result.append(obj_info)
    print(obj_info)

result
'''
        response = call_blender_api('/api/exec', code)
        
    elif tool_name == "delete_all_objects":
        code = '''
import bpy

# 选择所有对象
bpy.ops.object.select_all(action='SELECT')

# 删除选中的对象
bpy.ops.object.delete()
"所有物体已删除"
'''
        response = call_blender_api('/api/exec', code)
        
    elif tool_name == "create_cube":
        code = '''
import bpy

# 添加一个立方体
bpy.ops.mesh.primitive_cube_add(
    location=(0, 0, 0)  # 设置立方体的位置
)

# 获取新创建的立方体对象
cube = bpy.context.active_object
cube.name = "MyCube"  # 重命名立方体

f"立方体已创建,名称: {cube.name}"
'''
        response = call_blender_api('/api/exec', code)
    
    elif tool_name == "activate_blender":
        activate_blender_window()
        return
    
    else:
        print(f"错误: 未知的Blender工具 '{tool_name}'")
        return
    
    if response:
        if response['status'] == 'success':
            print(f"{tool_name} 执行成功!")
            print(f"返回结果: {response['result']}")
        else:
            print(f"{tool_name} 执行失败: {response['message']}")
    else:
        print("无法连接到Blender服务器")


if __name__ == "__main__":
    main()
相关推荐
brave10253 小时前
LLMGuide 大模型面试指南
人工智能·ai·面试·ai编程
菩提小狗3 小时前
每日极客日报 · 2026年11月08日
ai·开源·极客日报·it热点·技术资讯
Martina_03214 小时前
AI生成3D场景从白模换成精模后镜头全偏了?用6步检查单位、枢轴与层级替换
图像处理·人工智能·3d·ai·自然语言处理·材质·1024程序员节
装不满的克莱因瓶6 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba
七夜zippoe7 小时前
Agent 数据安全实战:输入校验、PII 脱敏与输出过滤的三道防线
ai·agent·数据安全·校验·过滤·pii脱敏
xiezhr8 小时前
workbuddy接管我的浏览器,帮我干活了
ai·浏览器自动化·ai-agent·workbuddy
不吃紫菜17 小时前
LangGraph 体系实战(上):建图、状态管理、控制流与持久化
ai
七夜zippoe20 小时前
Agent 优雅降级实战:模型不可用时的后备方案设计
ai·agent·模型·降级·后备方案
七夜zippoe1 天前
Agent 超时与幂等性:重复请求、副作用控制与状态一致性
ai·agent·超时·控制·幂等性
秋饼1 天前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发