当前位置: 首页 > news >正文

freecad二开 xmlrpc接口api qtgui

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

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

freecad_server.py:

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:可以用这个测试服务有没有装上

import xmlrpc.client

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

# 调用函数
result = proxy.create_document()

 如果想接mcp:

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()
 

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

相关文章:

  • 使用夜莺 + Elasticsearch进行日志收集和处理
  • 【论文阅读】Self-Correcting Clustering
  • 深入剖析二叉树路径和问题:从暴力法到前缀和优化(C++实现)
  • 自然语言处理(29:(终章Attention 5.)Attention的应用)(完结)
  • HTML实现图片上添加水印的工具
  • Spring 相关知识点
  • DirectX修复工具(DirectX Repair)官网免费下载
  • 科研论文word格式参考文献自动编码脚本
  • 力扣HOT100之链表:141. 环形链表
  • 数据结构4
  • 论文笔记:Instruction-Tuning Llama-3-8B Excels in City-Scale MobilityPrediction
  • vuex和pinia区别
  • 16 网络服务应用
  • 软考中级-软件设计师 2023年上半年上午题真题解析:通关秘籍+避坑指南
  • 在 Ubuntu 22.04 上安装 Docker Compose 的步骤
  • 帕累托分布的均值和方差
  • 【第一节】Python爬虫基础-HTTP基本原理
  • 基于 Hough 变换的直线检测
  • 高性能计算面经
  • Docker学习之容器虚拟化与虚拟机的区别(day11)
  • 网站开发合同范本/百度百科官网入口
  • 洪山网站建设公司/广告竞价排名
  • 灵山网站建设/营销策划书
  • 微商做网站/企业关键词优化公司
  • 荣成网站建设/搜索引擎营销的作用
  • 美橙做过网站案例/会计培训班需要学多长时间