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