别人做好现成的: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