FreeCAD.ConfigGet("UserAppData") 文件夹下创建mod文件夹
mod文件夹底下创建插件文件夹my_server:
freecad_server.py:
from xmlrpc.server import SimpleXMLRPCServer
import FreeCADGui
import FreeCADimport 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 Truedef 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:可以用这个测试服务有没有装上
import xmlrpc.client# 连接到服务器
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")# 调用函数
result = proxy.create_document()
如果想接mcp:
from mcp.server.fastmcp import FastMCPmcp = 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()
{"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