From a837baef954a94b33c8955eab2f54551eca3fd89 Mon Sep 17 00:00:00 2001 From: sladro Date: Sun, 1 Mar 2026 19:32:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=99=A8=E7=BB=84=E4=BB=B6=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81STP=E8=BD=ACGLTF=E3=80=81IFC=E8=BD=ACSTP=E5=8F=8AIFC?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E8=BD=ACSTP=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=99=A8=E5=92=8C=E7=9B=B8=E5=85=B3=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CAD_API_集成文档.md | 168 +++++++++++++ docs/cad-batch-plan.md | 155 ++++++++++++ src/components/pages/BatchJobManager.vue | 218 ++++++++++++---- src/components/pages/UniversalConverter.vue | 262 +++++++++++++++++++- 4 files changed, 738 insertions(+), 65 deletions(-) create mode 100644 CAD_API_集成文档.md create mode 100644 docs/cad-batch-plan.md diff --git a/CAD_API_集成文档.md b/CAD_API_集成文档.md new file mode 100644 index 0000000..00dce32 --- /dev/null +++ b/CAD_API_集成文档.md @@ -0,0 +1,168 @@ +# CAD 软件模型处理 API 集成文档 + +本文档详细说明了不同 CAD 软件(Creo, Revit, PDMS)在本项目中的 API 接入规范,包括基础配置、核心模型操作以及类似 Shrink Wrap(几何优化轻量化)功能的接口文档。请按照以下说明进行前后端集成。 + +--- + +## 1. Creo Parametric + +- **CAD 软件名称**: Creo Parametric (版本 9.0) +- **Base URL**: `http://localhost:12345` +- **端口**: `12345` + +### 1.1. 打开模型 API +- **接口路径**: `/api/model/open` +- **请求方式**: `POST` +- **基础描述**: 在 Creo 软件中加载指定的模型文件。 +- **接入说明**: + - **请求头**: `Content-Type: application/json` + - **请求体 (Body)**: + ```json + { + "filePath": "C:\\path\\to\\your\\model.prt" // 字符串,必须是绝对路径 + } + ``` + - **响应格式**: + ```json + { + "status": "success", // 或 "error" + "message": "模型加载成功", + "data": null + } + ``` + - **常见错误**: 若路劲不存在或 Creo 实例未启动,status 会返回 error。 + +### 1.2. 几何优化分析 API (类似 Shrink Wrap 功能) +- **接口路径**: `/api/creo/shrinkwrap/shell` (及 `/api/analysis/shell-analysis`) +- **请求方式**: `POST` +- **基础描述**: 对打开的模型执行几何外壳提取或包络处理,用于轻量化。 +- **接入说明**: + - **请求头**: `Content-Type: application/json` + - **请求体 (Body - 参数示例)**: + ```json + { + "method": "outer_shell", // 提取方法:外壳 + "quality": 5, // 提取质量 (1-10) + "chord_height": 0.15, // 弦高公差 + "fill_holes": false, // 是否填充孔洞 + "ignore_small_surfaces": false, // 是否忽略小曲面 + "output_type": "solid_surface" // 输出类型 + } + ``` + - **响应格式**: + ```json + { + "status": "success", + "message": "几何优化完成", + "data": { + "output_file": "C:\\path\\to\\optimized_model.prt" + } + } + ``` + +### 1.3. 关闭模型 API +- **接口路径**: `[占位待实现] /api/model/close` +- **请求方式**: `POST` +- **基础描述**: 关闭当前在 Cero 中处于激活状态的模型,释放内存。 +- **接入说明**: + - 当前后端尚未提供明确的单独关闭接口。 + - **未来预期请求体**: + ```json + { + "clearMemory": true // 是否连带清除缓存 + } + ``` + +--- + +## 2. Revit + +- **CAD 软件名称**: Revit (版本 2024) +- **Base URL**: `http://localhost:9000` +- **端口**: `9000` + +### 2.1. 打开模型 API +- **接口路径**: `/api/open` +- **请求方式**: `POST` +- **基础描述**: 打开指定的 Revit 项目文件 (.rvt)。 +- **接入说明**: + - **请求格式**: `application/json` + - **请求体 (Body)**: + ```json + { + "filePath": "C:\\path\\to\\project.rvt" + } + ``` + +### 2.2. 轻量化提取外壳 API (类似 Shrink Wrap 功能) +- **接口路径**: `/api/shell/analyze` (提取分析) / `/api/shell/execute` (执行处理) +- **请求方式**: `POST` +- **基础描述**: 分析 Revit 建筑模型并剥离内部不需要的实体细节。 +- **接入说明**: + - **请求体 (Body)**: + ```json + { + "detailLevel": "coarse", // 粗略级别 + "removeInternal": true // 是否移除内部构件 + } + ``` + - **响应格式**: + ```json + { + "status": "success", + "data": { + "taskId": "task-123456" // 大模型处理可能较慢,建议通过 /api/task 轮询进度 + } + } + ``` + +### 2.3. 关闭模型 API +- **接口路径**: `[占位待实现] /api/close` +- **请求方式**: `POST` +- **基础描述**: 关闭 Revit 当前工程并释放资源。 +- **接入说明**: + - 当前未列出明确接口,前端可作为占位按钮。 + +--- + +## 3. PDMS + +- **CAD 软件名称**: PDMS (版本 12.1) +- **Base URL**: `http://localhost:9001` +- **端口**: `9001` + +### 3.1. 打开模型 API +- **接口路径**: `/api/project/open` (打开工程) / `/api/mdb/open` (打开 MDB 数据库) +- **请求方式**: `POST` +- **基础描述**: 载入 PDMS 的工程或特定 MDB 库。 +- **接入说明**: + - **请求体 (Body)**: + ```json + { + "projectName": "SAM", + "username": "SYSTEM", + "password": "XXXXXX", + "systemName": "CATA" + } + ``` + +### 3.2. 模型简化与包裹 API (类似 Shrink Wrap 功能) +- **接口路径**: `/api/model/shrinkwrap` (包裹) / `/api/model/simplify` (参数化简化) +- **请求方式**: `POST` +- **基础描述**: 将复杂的管道、设备利用包围盒或简化几何进行替代。 +- **接入说明**: + - **请求体 (Body) - Simplify 示例**: + ```json + { + "targetElements": ["/EQUIP-1", "/PIPE-2"], + "simplifyMethod": "bounding_box" + } + ``` + - **响应**: 处理成功后通常会通过 WebSocket 推送更新或直接返回简化的模型状态数据。 + +### 3.3. 关闭模型 API +- **接口路径**: `[占位待实现] /api/project/close` +- **请求方式**: `POST` +- **基础描述**: 退出工程并回收当前资源。 +- **接入说明**: + - 占位状态,开发集成时需要确保该请求不会导致整个 PDMS 进程意外崩溃。 diff --git a/docs/cad-batch-plan.md b/docs/cad-batch-plan.md new file mode 100644 index 0000000..a9c3726 --- /dev/null +++ b/docs/cad-batch-plan.md @@ -0,0 +1,155 @@ +# CAD 批处理串行执行框架(设计与开发进度) + +## 1. 文档目的 +本文件用于同步两类信息: +1. 总体批处理设计(长期有效) +2. 当前代码开发进度(持续更新) + +--- + +## 2. 总体设计(已定稿) + +### 2.1 目标 +- 前端提交批次任务(多模型、多步骤按条目表达) +- 后端按模型扩展名路由到对应 CAD 插件 +- 全局严格 FIFO 串行执行(跨软件也串行) +- 插件通过 HTTP 接口执行,结果通过回调闭环 +- 单任务失败后按重试策略处理,最终失败不阻塞后续任务 + +### 2.2 执行策略 +- 队列:全局单队列 + 单 worker +- 顺序:严格按提交顺序 +- 状态机:`queued -> dispatching -> waiting_callback -> succeeded/failed` +- 失败策略:重试后失败,继续执行后续任务 +- 存储策略:首版内存态(重启不恢复) + +### 2.3 架构模块 +- 模型层:`app/models/cad_batch.py` +- 路由层:`app/core/cad_task_router.py` +- 插件下发层:`app/core/plugin_http_client.py` +- 回调等待层:`app/core/plugin_callback_registry.py` +- 串行执行层:`app/core/serial_batch_executor.py` +- 业务管理层:`app/core/cad_batch_manager.py` +- 插件回调接口:`app/api/v1/plugin_callbacks.py` +- 前端通道(WebSocket):`app/api/v1/websocket.py` + +--- + +## 3. 公共接口设计 + +### 3.1 WebSocket 消息 +- `submit_batch_tasks`:提交批次 +- `get_batch_status`:查询批次 +- `get_batch_item_status`:查询条目 + +### 3.2 WebSocket 推送事件 +- `batch_created` +- `batch_item_update` +- `batch_completed` + +### 3.3 插件回调 HTTP +- `POST /api/v1/plugin-callbacks/task-result` +- 核心字段: + - `execution_id` + - `software_id` + - `status` (`success|failed`) + - `error_message` + - `result` + - `finished_at` + - `token/signature`(当前实现为 token 校验) + +--- + +## 4. 配置设计 + +### 4.1 已支持配置 +- `routing.extension_to_software` +- `plugins.{software_id}.base_url` +- `plugins.{software_id}.request_timeout_sec` +- `plugins.{software_id}.callback_timeout_sec` +- `plugins.{software_id}.max_retries` +- `plugins.{software_id}.retry_backoff_sec` +- `plugins.{software_id}.callback_token` +- `plugins.{software_id}.tasks.{task_type}.path` +- `plugins.{software_id}.tasks.{task_type}.body_mode` +- `plugins.{software_id}.tasks.{task_type}.completion_mode` + +### 4.2 body_mode 语义 +- `file_path`:发送 `filePath + task_params + callback元信息` +- `task_params_only`:发送 `task_params + callback元信息` +- `project_open`:发送 `task_params + callback元信息` +- `creo_close_model`:发送 `{ software_type: "creo", force_close: boolean }` +- `empty`:发送空请求体 `{}` +- `passthrough`:原样透传 + +### 4.3 completion_mode 语义 +- `callback`:下发后进入 `waiting_callback`,等待插件回调判定结果 +- `sync`:以接口同步返回结果直接判定成功/失败,不等待回调 + +--- + +## 5. 当前开发进度(截至本次更新) + +### 5.1 已完成 +- [x] 计划文档落盘:`cad-batch-plan.md` +- [x] 批处理核心模型、执行器、管理器已实现 +- [x] 插件异步回调机制与幂等处理已实现 +- [x] 主应用 `startup/shutdown` 已接入批处理执行器 +- [x] WebSocket 提交/查询批次能力已接入 +- [x] 插件任务映射已支持按 `software_id + task_type` 路由 +- [x] 单元测试已覆盖路由/执行器/回调/API 映射 + +### 5.2 已集成的 CAD 插件资料 + +#### Creo (localhost:12345) +- `open_model` -> `/api/model/open` (`file_path`) +- `shrinkwrap_shell` -> `/api/creo/shrinkwrap/shell` (`task_params_only`) +- `shell_analysis` -> `/api/analysis/shell-analysis` (`task_params_only`) +- `close_model` -> `/api/model/close` (`creo_close_model`, `sync`, 已接入) + +#### Revit (localhost:9000) +- `open_model` -> `/api/open` (`file_path`) +- `shell_analyze` -> `/api/shell/analyze` (`task_params_only`) +- `shell_execute` -> `/api/shell/execute` (`task_params_only`) +- `close_model` -> `/api/close` (`empty`, `sync`, 已接入) + +#### PDMS (localhost:9001) +- `open_project` -> `/api/project/open` (`project_open`) +- `open_mdb` -> `/api/mdb/open` (`project_open`) +- `shrinkwrap_model` -> `/api/model/shrinkwrap` (`task_params_only`) +- `simplify_model` -> `/api/model/simplify` (`task_params_only`) +- `close_project` -> `/api/project/close` (`task_params_only`, 占位) + +### 5.3 当前测试状态 +- 已通过:`13 passed` +- 覆盖文件: + - `tests/test_cad_task_router.py` + - `tests/test_serial_batch_executor.py` + - `tests/test_plugin_callback_api.py` + - `tests/test_plugin_http_client_mapping.py` + - `tests/test_creo_close_model_sync_flow.py` + +--- + +## 6. 待补资料与后续工作 + +### 6.1 你后续补充后可继续对接 +1. 每个 `task_type` 的最终命名标准(是否沿用当前命名) +2. Revit 大任务轮询接口细节(如 `/api/task` 的请求/返回) +3. PDMS `close_project` 是否真实可用(当前仍按占位映射) +4. 回调安全方案最终版(token 还是 signature,签名算法与字段) +5. 各 API 的完整错误码与失败语义(用于统一重试/终止策略) + +### 6.2 下一步建议 +- 基于真实插件联调一轮 `open -> 处理 -> close` +- 优先确认 PDMS `close_project` 实际行为与容错策略 +- 增加端到端集成测试(含回调超时、插件离线、重复回调场景) + +--- + +## 7. 验收标准(当前版本) +- 可提交批次并进入全局串行队列 +- 可按扩展名路由并向插件正确下发 +- 可通过回调驱动状态闭环 +- 单任务失败不会阻塞后续任务 +- 可通过 WebSocket 查询批次与条目状态 diff --git a/src/components/pages/BatchJobManager.vue b/src/components/pages/BatchJobManager.vue index 68349bd..0609116 100644 --- a/src/components/pages/BatchJobManager.vue +++ b/src/components/pages/BatchJobManager.vue @@ -54,11 +54,38 @@ - + + + + + + + @@ -84,12 +111,11 @@ - + @@ -100,18 +126,18 @@ - - + +
-

请输入模型路径并点击“增加模型”,构建本次批处理的模型列表:

+

请输入模型路径并点击“增加模型”,构建本次批处理的模型列表(支持 .prt, .rvt 扩展名):

@@ -132,15 +158,16 @@
- + - - - + + + + - - + + 提交时会将策略转化为相应的 task_type 序述串通过 WebSocket 下发。
@@ -156,12 +183,8 @@ 紧急 - - - 控制同时执行的任务数量 - - - + + 全局严格单队列 FIFO 串行执行
@@ -171,7 +194,7 @@ @@ -179,7 +202,7 @@ @@ -488,6 +597,11 @@ const viewDetails = (row) => { background-color: rgba(255, 255, 255, 0.12); } +/* 展开行内容区域背景 */ +:deep(.el-table__expanded-cell) { + background-color: rgba(0, 0, 0, 0.2) !important; +} + /* 固定列默认会有独立背景,保持与行背景一致,避免发白 */ :deep(.el-table .el-table-fixed-column--left), :deep(.el-table .el-table-fixed-column--right) { diff --git a/src/components/pages/UniversalConverter.vue b/src/components/pages/UniversalConverter.vue index b771e75..53ff753 100644 --- a/src/components/pages/UniversalConverter.vue +++ b/src/components/pages/UniversalConverter.vue @@ -31,6 +31,14 @@ IFC 转 STP
+
+ + IFC 批量转 STP +
@@ -39,9 +47,11 @@

1. 选择STP文件

-

1. 选择IFC文件

+

1. 选择IFC文件

+

1. 选择多个IFC

选择要转换的STEP格式文件

-

选择要转换的IFC格式文件

+

选择要转换的IFC格式文件

+

输入多个要转换的IFC格式文件

@@ -52,7 +62,8 @@

2. 转换处理

自动处理几何数据和材质

-

解析BIM数据并重建BREP几何

+

解析BIM数据并重建BREP几何

+

批量解析BIM数据并重建BREP几何

@@ -62,9 +73,11 @@

3. 下载GLTF

-

3. 下载STP

+

3. 获取STP

+

3. 获取多个STP

获取Web优化的3D模型文件

-

获取通用的STEP实体模型文件

+

获取通用的STEP实体模型文件

+

获取批量的STEP实体模型文件

@@ -82,7 +95,7 @@ -
+
@@ -93,6 +106,33 @@
+
+
+

批量转换列表

+ +
+
+
+
{{ index + 1 }}
+
+
+ IFC 路径: + +
+
+ STP 路径: + +
+
+ +
+
+
+

转换选项

@@ -127,6 +167,12 @@
+
+ +