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

相关推荐
跨境卫士情报站7 小时前
高阶亚马逊运营秘籍:关键词矩阵打法深度解析与应用
经验分享·教育电商
axinawang10 小时前
极域电子教室出现问题如何处理
经验分享
技术小赵1 天前
优化Facebook广告投放的五大关键策略
经验分享
智者知已应修善业1 天前
【51单片机节日彩灯控制器设计】2022-6-11
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
Yo_Becky1 天前
【PyTorch】PyTorch预训练模型缓存位置迁移,也可拓展应用于其他文件的迁移
人工智能·pytorch·经验分享·笔记·python·程序人生·其他
ONETHING_CLOUD_21 天前
电脑系统重装有什么用?
经验分享·科技·计算机·电脑·数码
会的全对٩(ˊᗜˋ*)و1 天前
【数据挖掘】数据挖掘综合案例—银行精准营销
人工智能·经验分享·python·数据挖掘
future14121 天前
每日问题总结
经验分享·笔记
LilySesy2 天前
ABAP+&SFSY-FORMPAGES&变成星号
经验分享·sap·abap·erp系统·smartforms
Allen_LVyingbo2 天前
数智读书笔记系列035《未来医疗:医疗4.0引领第四次医疗产业变革》
人工智能·经验分享·笔记·健康医疗