freecad二开 xmlrpc接口api qtgui

别人做好现成的:freecad-mcp · PyPI

-----------------------------------------------------------------------

我改的:

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

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

init.py不会带qt的界面,要加入InitGui.py里面

InitGui.py(开freecd自动启动,可以去freecad-mcp pipy别人的代码里面找命令栏版本):


class StartRPCServerCommand:
    def GetResources(self):
        return {"MenuText": ""}

    def Activated(self):
        from xmlrpc.server import SimpleXMLRPCServer


        
        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 execute(self, module_name,task_name, args):
                import FreeCAD 
                import FreeCADGui 
                import sys
                module = getattr(sys.modules[__name__], module_name, None)
                print(f"Received RPC request: {module_name}.{task_name} with args: {args}")
                task_function = getattr(module, task_name, None)
                rpc_request_queue.put(lambda: task_function(*args))
                res = rpc_response_queue.get()
                return res

        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)

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

Gui.runCommand("a_Server")

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

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


from mcp_server import newDocument

newDocument()

 如果想接mcp:

from mcp.server.fastmcp import FastMCP


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

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


@mcp.tool()
def newDocument():
    """
        创建一个freecad的基础文档。
    参数:不需要参数
    返回:
        函数执行结果
    """
    return  proxy.execute("FreeCAD","newDocument", ["name"])

@mcp.tool()
def activateSMWorkbench():
    """
    激活钣金工作台。
    参数: 不需要参数
    返回:
        函数执行结果
    """
    return  proxy.execute("FreeCADGui","activateWorkbench", ["SMWorkbench"])
@mcp.tool()
def SheetMetal_BaseShape():
    """
    运行钣金基础形状(Sheet Metal Base Shape)命令。
    运行前需要先创建一个freecad的基础文档+激活钣金工作台
    参数: 不需要参数
    返回:
        函数执行结果
    
    """
    return  proxy.execute("FreeCADGui","runCommand", ["SheetMetal_BaseShape"])

if __name__ == "__main__":
     mcp.run()
 

{
  "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"
    }}

r

连别的工作台用

FreeCADGui.activateWorkbench(name)

就行了

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值