freecad二开 xmlrpc接口api qtgui

FreeCAD.ConfigGet("UserAppData") 文件夹下创建mod文件夹

mod文件夹底下创建插件文件夹my_server:

freecad_server.py:

python 复制代码
from xmlrpc.server import SimpleXMLRPCServer
import FreeCADGui
import FreeCAD

import queue
from PySide2.QtCore import QTimer
import threading
# 定义一个类来封装API方法



# GUI task queue
rpc_request_queue = queue.Queue()
rpc_response_queue = queue.Queue()


def process_gui_tasks():
    while not rpc_request_queue.empty():
       
        task = rpc_request_queue.get()
        res = task()
        if res is not None:
            rpc_response_queue.put(res)
    QTimer.singleShot(500, process_gui_tasks)

class FreeCADRPC:
    """RPC server for FreeCAD"""

    def ping(self):
        return True

    def create_document(self, name="New_Document"):
    
       
        rpc_request_queue.put(lambda: self._create_document_gui(name))
        res = rpc_response_queue.get()
        if res is True:
            return {"success": True, "document_name": name}
        else:
            return {"success": False, "error": res}
        
    def _create_document_gui(self, name):
        
        doc = FreeCAD.newDocument(name)
        doc.recompute()
        print(f"Document '{name}' created via RPC.\n")
        return True
def start_rpc_server(host="localhost", port=8000):
   

    print(f"Starting RPC server at {host}:{port}...")
    rpc_server_instance = SimpleXMLRPCServer(
        (host, port), allow_none=True, logRequests=False
    )
    rpc_server_instance.register_instance(FreeCADRPC())

    def server_loop():
        
        rpc_server_instance.serve_forever()

    rpc_server_thread = threading.Thread(target=server_loop, daemon=True)
    rpc_server_thread.start()

    QTimer.singleShot(500, process_gui_tasks)

    return f"RPC Server started at {host}:{port}."

class StartRPCServerCommand:
    def GetResources(self):
        return {"MenuText": "なんで好きか――?"}

    def Activated(self):
        msg = start_rpc_server()

    def IsActive(self):
        return True
FreeCADGui.addCommand("a_Server", StartRPCServerCommand())

如果不在gui里加入服务器操作的话,比如说直接调用freecad.newdocument() 会在闪退前出现以下报错

有试过在init.py里面直接跑,不行,还是只能加在任务栏上

test.py:可以用这个测试服务有没有装上

python 复制代码
import xmlrpc.client

# 连接到服务器
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")

# 调用函数
result = proxy.create_document()

如果想接mcp:

python 复制代码
from mcp.server.fastmcp import FastMCP


mcp = FastMCP("Demo")
import xmlrpc.client

# 连接到服务器
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")


@mcp.tool()
def create_document():
    """
        创建一个freecad的基础文档。

    参数:不需要参数
        

    返回:
        函数执行结果

    示例:
        >>> proxy.create_document()
    """
    return  proxy.create_document()


if __name__ == "__main__":
     mcp.run()
 
python 复制代码
{
  "mcpServers": {
    "freecad_mcp": {
      "autoApprove": [],
      "disabled": false,
      "timeout": 60,
      "command": "/home/chen/anaconda3/envs/freecad_mcp/bin/python",
      "args": [
        "/home/chen/snap/freecad/common/Mod/freecad_mcp_my/mcp_server.py"
      ],
      "transportType": "stdio"
    }}

outpu

他这个只能调用基础的工作台,我想给他连到别的工作台

gitee:sato77711/freecad_mcp_addon可以直接下载后丢入FreeCAD.ConfigGet("UserAppData") 文件夹下创建的mod文件夹

参考:https://wiki.freecad.org/Workbench_creation/zh-hant

FreeCAD二次开发-基于PyQT对话框与FC交互的开发_51CTO博客_freecad二次开发

代码来自:
freecad-mcp · PyPI

相关推荐
gcbjoy7 分钟前
dbaseIII或foxplus的简化的弹出菜单实现方式
开发语言·经验分享
三流架构师14 分钟前
初中化学资源合集
经验分享
三流架构师32 分钟前
初中物理资源合集
经验分享
北岛寒沫33 分钟前
北京大学国家发展研究院 经济学原理课程笔记(第十九课 长期经济增长)
经验分享·笔记·学习
luming-022 小时前
java报错解决:sun.net.utils不存
java·经验分享·bug·.net·intellij-idea
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-01-06
人工智能·经验分享·深度学习·神经网络·产品运营
北岛寒沫3 小时前
北京大学国家发展研究院 经济学原理课程笔记(第二十五课 开放宏观基本概念)
经验分享·笔记·学习
小白探索世界欧耶!~3 小时前
用iframe实现单个系统页面在多个系统中复用
开发语言·前端·javascript·vue.js·经验分享·笔记·iframe
测绘小沫-北京云升智维4 小时前
大疆无人机常见故障提示及应对指南
经验分享·无人机
qq_337599464 小时前
FPGA知识点
经验分享·fpga开发