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

相关推荐
总线通信小百科1 小时前
CAN、LIN、汽车以太网同时采集,车载数据记录设备该怎么选?
经验分享
小HANN4 小时前
高可用架构实战:Keepalived+LVS(DR)+MariaDB主主集群搭建指南
linux·运维·服务器·经验分享
loopne4 小时前
AI网文写作实验笔记(十三):系列总结——12 篇实验、8 条核心结论,把“AI 写小说“每一步拆开验证
人工智能·经验分享·笔记·ai写作·智能写作
manongdashu1884 小时前
本地静态建站工具自带页面自适应功能,良好适配手机移动端浏览。
经验分享·seo·独立站·静态站·静态网站
叠层归一研究院5 小时前
螺旋时空:E框架的整合宇宙论
人工智能·经验分享·算法·机器学习·agi
君顾16 小时前
AI新零售线上商城系统实战指南:架构设计与开发经验分享
人工智能·经验分享·零售
sweetone6 小时前
可能这是该低音炮的通病——JAMO尊宝A3SUB.5低音炮破音故障之彻底排除
经验分享·音视频
德思特7 小时前
大规模MIMO测试方案:衰减矩阵如何实现多通道同步控制?
经验分享
wbcq_cqg7 小时前
万伯1500方双膜气柜沼气项目案例
经验分享·安全
恒锐丰科技林技术员8 小时前
SS6286L:大电流双向有刷电机驱动芯片,赋能电机控制多元场景
经验分享·嵌入式硬件·硬件工程