336 lines
17 KiB
Markdown
336 lines
17 KiB
Markdown
# Creo 前端技术路线与算法体系总结
|
||
|
||
## 摘要
|
||
|
||
本文档面向计划构建与 MFCCreoDll 插件协同工作的前端工程,系统梳理现有 C++/MFC 插件所提供的几何分析与模型管理能力,说明其依托的 PTC Creo Parametric Toolkit (OTK C++) API,以及前端接入时需要遵循的通信约定、架构设计、算法协同与性能优化策略。文档重点扩展薄壳分析与 Shrinkwrap 外壳导出的几何原理、数值指标与 API 依赖,提供数据结构、流程图示与复杂度分析,为后续实现桌面端或 Web 前端提供完整的工程蓝图。
|
||
|
||
## 1. 引言
|
||
|
||
### 1.1 背景与动机
|
||
|
||
- **插件职责**:MFCCreoDll 通过内置 `HttpServer` 将 Creo OTK 的装配遍历、几何分析、批量操作等能力封装为 HTTP JSON 接口,面向企业内部自动化建模与模型瘦身场景。
|
||
- **前端缺口**:仓库未包含任何前端 UI(无 JavaScript/TypeScript/HTML/CSS 及构建脚本),现有用户依赖命令行或脚本调用,缺乏可视化入口和交互式分析能力。
|
||
- **建设目标**:搭建一套专业化前端工作台,实现模型状态可视化、薄壳削减决策、Shrinkwrap 导出监控、批量操作编排与日志追踪,提升 Creo 工程师的决策效率。
|
||
|
||
### 1.2 设计原则
|
||
|
||
1. **分层解耦**:前端仅通过 HTTP/JSON 与插件交互,不直接依赖 OTK SDK;业务逻辑与呈现分离,便于扩展。
|
||
2. **可观测性**:所有长耗时任务(薄壳分析、Shrinkwrap、批量操作)需暴露进度、耗时、错误分类,便于运维监控。
|
||
3. **可组合性**:提供参数模板、操作剧本与结果数据的导入导出,支持在 CI/CD 或 PLM 流程中复用。
|
||
4. **安全性**:在远程部署场景下需支持 TLS、Token 校验与审计日志,避免 Creo 能力被滥用。
|
||
|
||
## 2. 技术架构蓝图
|
||
|
||
### 2.1 系统角色
|
||
|
||
| 角色 | 描述 | 关键职责 |
|
||
| --- | --- | --- |
|
||
| **Creo 插件 (C++)** | 运行于 Creo Session 的 DLL,负责与 OTK C++ 交互 | 处理模型操作、几何分析、文件导出、批量执行;输出 JSON |
|
||
| **前端应用** | 浏览器或 Electron 桌面应用 | 展示数据、收集用户输入、调度任务、渲染图表与报告 |
|
||
| **本地 HTTP 服务** | 插件内置 `HttpServer` | 提供 REST 风格接口,端口默认 12345,支持 CORS |
|
||
|
||
### 2.2 前端分层结构
|
||
|
||
1. **Presentation Layer**:基于 React/Vue 等组件库构建视图,包含仪表盘、图表、树状组件、文件选择器。
|
||
2. **Application Layer**:管理路由、权限、国际化、主题,以及业务逻辑 orchestrator。
|
||
3. **Data Layer**:封装 API 客户端(Axios/Fetch),实现请求队列、超时、重试、缓存与统一错误处理。
|
||
4. **State Management Layer**:使用 Redux Toolkit、Zustand 或 Pinia 保存 Creo 会话信息、当前模型上下文、分析结果、任务队列。
|
||
5. **Computation Layer**:通过 Web Worker / Rust WASM 实现本地重计算(排序、聚合、差异分析),减少主线程阻塞。
|
||
6. **Persistence Layer**:IndexedDB、SQLite (在 Electron 中) 或本地文件用于缓存配置、模板、历史日志、结果快照。
|
||
|
||
### 2.3 数据流视图
|
||
|
||
1. 用户在 UI 发起操作 →
|
||
2. 前端构造 JSON 请求 → HTTP 客户端发送至 `http://127.0.0.1:12345` →
|
||
3. 插件通过 OTK 执行业务逻辑 →
|
||
4. 插件返回标准化 JSON(含 `success`, `data`, `error`)→
|
||
5. 前端解析并更新状态树 →
|
||
6. 触发 UI 渲染更新 / 日志记录 / 通知提示。
|
||
|
||
## 3. 功能模块设计
|
||
|
||
### 3.1 会话监控中心
|
||
|
||
- 实时展示 Creo 连接状态、版本号、当前工作目录 (`/api/status/creo`)。
|
||
- 记录最近 N 次 API 调用与耗时,支持过滤与导出。
|
||
- 提供 `Reconnect`/`Check Session` 按钮,触发 `/test` 接口用于诊断。
|
||
|
||
### 3.2 模型生命周期控制台
|
||
|
||
- **打开模型**:支持完整路径和 `dirname + filename` 两种输入形式,提供最近使用列表。
|
||
- **保存模型**:展示文件大小、保存耗时、成功提示;允许用户配置保存策略(自动备份等)。
|
||
- **关闭模型**:支持 `force_close` 参数,提示未保存修改。
|
||
|
||
### 3.3 几何分析工作台
|
||
|
||
- **复杂度分析**:对 `/api/analysis/geometry-complexity` 输出进行聚合,展示热力图、TopN 列表、曲线趋势。
|
||
- **层级统计分析**:渲染层级数量、各层组件数、风险评分,并支持导出 CSV/Excel。
|
||
|
||
### 3.4 薄壳分析与削减决策中心
|
||
|
||
- 展示 `safeDeletions`、`suggestedDeletions`、`preserveList` 三类结果,提供可视化标签(置信度、体积收益、风险因素)。
|
||
- 支持按 `confidence`、`volumeReduction`、`component_type` 等条件筛选与排序。
|
||
- 提供策略模拟:选择候选集合后预估整体体积/文件大小/性能收益变化。
|
||
|
||
### 3.5 Shrinkwrap 外壳导出面板
|
||
|
||
- 提供参数表单(质量、弦高、填孔、小面过滤、忽略 Skeleton 等)与预设模板选择。
|
||
- 实时展示执行日志、导出文件路径、文件大小,并允许用户打开文件所在目录。
|
||
- 支持任务排队、超时重试与错误分类提示。
|
||
|
||
### 3.6 装配树与路径操作
|
||
|
||
- 树状/平铺视图展示组件层级,支持懒加载与虚拟滚动。
|
||
- 提供路径复制、按路径删除、子组件统计与风险提示。
|
||
- 结合层级分析结果,对高风险删除操作弹出确认/二次认证。
|
||
|
||
### 3.7 模型搜索与索引视图
|
||
|
||
- 支持关键字、类型、是否在会话、相似度阈值、组件/特征等多筛选条件。
|
||
- 采用命中高亮、标签分类、匹配理由展示(如命中名称/属性/路径)。
|
||
- 支持导出搜索结果、保存搜索条件模板。
|
||
|
||
### 3.8 批量操作编排平台
|
||
|
||
- 流程画布支持拖拽组合操作单元(打开、保存、导出、分析、任务脚本)。
|
||
- 执行时展示步骤进度、耗时、返回 JSON、错误信息,支持暂停/继续/跳过。
|
||
- 支持剧本库、参数化模板、执行历史回放与日志导出。
|
||
|
||
## 4. 接口协议与数据契约
|
||
|
||
### 4.1 请求规范
|
||
|
||
- 所有接口使用 `application/json; charset=utf-8`。
|
||
- 请求体大小默认限制 1 MB (`Config::MAX_REQUEST_SIZE`);前端需对大型任务参数进行压缩或拆分。
|
||
- CORS 头默认为 `Access-Control-Allow-Origin: *`,前端可在浏览器直接调用。
|
||
|
||
### 4.2 响应结构
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": { ... },
|
||
"error": null
|
||
}
|
||
```
|
||
|
||
- **success**: 布尔值,标识操作是否成功。
|
||
- **data**: 成功时包含有效载荷(模型信息、分析结果、执行统计等)。
|
||
- **error**: 失败时包含错误描述;插件在部分接口中返回结构化错误(含分类、建议)。
|
||
|
||
### 4.3 关键接口示例
|
||
|
||
| URL | 方法 | 描述 |
|
||
| --- | --- | --- |
|
||
| `/api/model/open` | POST | 打开模型,支持 `file_path` 或 `dirname` + `filename` |
|
||
| `/api/model/save` | POST | 保存当前模型,返回文件大小、保存耗时 |
|
||
| `/api/model/close` | POST | 关闭模型,支持 `force_close` |
|
||
| `/api/analysis/geometry-complexity` | POST | 几何复杂度分析 |
|
||
| `/api/analysis/shell-analysis` | POST | 薄壳分析 |
|
||
| `/api/creo/shrinkwrap/shell` | POST | Shrinkwrap 外壳导出 |
|
||
| `/api/creo/batch-operations` | POST | 批量操作执行 |
|
||
|
||
### 4.4 类型定义建议
|
||
|
||
- 使用 TypeScript `type`/`interface` 映射接口返回数据。可通过脚本解析头文件或 JSON 样例生成类型声明,确保编译期类型安全。
|
||
- 对复杂对象(如薄壳分析结果)建立细粒度类型,便于校验和测试。
|
||
|
||
## 5. 核心算法解析
|
||
|
||
### 5.1 薄壳分析算法体系
|
||
|
||
#### 5.1.1 几何数据采集
|
||
|
||
- 利用 `wfcWAssembly::ListDisplayedComponents` 获取装配组件列表。
|
||
- 调用 `pfcSolid::GetMassProperty`、`pfcSolid::GetOutline` 获取体积、包围盒等几何属性。
|
||
- 对细长组件使用 22 点采样(角点 8、面心 6、边心 12)构建顶点集,为 PCA 计算做准备。
|
||
|
||
#### 5.1.2 主方向与包围盒选择
|
||
|
||
1. 计算协方差矩阵 `Σ = (1/N) Σ (v_i - μ)(v_i - μ)^T`,在 OTK 中通过手工矩阵运算实现。
|
||
2. 求解特征值/特征向量,确定主轴 `e1, e2, e3`。
|
||
3. 评估长宽比、表面积、体积,若满足:
|
||
- 长宽比 > `OBB_ASPECT_RATIO_THRESHOLD` (默认 4.0)
|
||
- 或表面积差值 < `OBB_SURFACE_TOL`
|
||
则使用 OBB;否则采用 AABB。
|
||
|
||
#### 5.1.3 多方向投影与网格离散
|
||
|
||
- 方向集合:`D = {±X, ±Y, ±Z}`,记作 6 个单位向量。
|
||
- 96 × 96 网格离散化平面,对每个网格单元记录最小深度值。
|
||
- 对组件 `c`,投影覆盖率计算公式:
|
||
|
||
\[
|
||
\text{visibility}(c) = \frac{1}{|D|} \sum_{d \in D} \mathbb{I}\left( \frac{A_{c,d}}{A_{\text{total},d}} \geq \tau_d \right)
|
||
\]
|
||
|
||
其中 `A_{c,d}` 为组件在方向 `d` 的可见面积,`τ_d = 0.001` (0.1%)。
|
||
|
||
#### 5.1.4 双阶段投票机制
|
||
|
||
- **阶段一**:设置严格窗口 `δ_strict = 0.001 * diag(assembly)`,要求 80% 方向可见,识别高置信度外壳。
|
||
- **阶段二**:对剩余组件放宽窗口至 `max(0.002*diag, 0.15*median_thickness)`,重复投影与判定,补齐遗漏。
|
||
|
||
#### 5.1.5 Leave-One-Out (LOO) 归因
|
||
|
||
1. 计算全局可见矩阵 `V_all`。
|
||
2. 对组件 `c`,构造 `V_{-c}`(移除该组件),比较差异:
|
||
|
||
\[
|
||
\Delta V_c = \frac{\|V_all - V_{-c}\|_1}{\|V_all\|_1}
|
||
\]
|
||
|
||
3. `ΔV_c` 小于阈值的组件被判定为内部件。
|
||
|
||
#### 5.1.6 光线追踪验证
|
||
|
||
- 从装配质心 `G` 向候选外壳组件中心发射射线,调用 `pfcCreateSelectionEvaluator` / `pfcSelectionEvaluator::ComputeInterference` 检测遮挡。
|
||
- 如果射线被其他组件阻挡,降低其置信度或标记为内部组件。
|
||
|
||
#### 5.1.7 置信度模型
|
||
|
||
- 综合指标:
|
||
- 投影得票数 `votes`
|
||
- LOO 贡献度 `ΔV`
|
||
- 光线通过率 `ray_clear_ratio`
|
||
- 历史统计(可选)
|
||
|
||
- 置信度计算示例:
|
||
|
||
\[
|
||
\text{confidence} = w_1 \cdot \frac{\text{votes}}{6} + w_2 \cdot (1 - \Delta V) + w_3 \cdot \text{ray\_clear\_ratio}
|
||
\]
|
||
|
||
默认 `w_1=0.5, w_2=0.3, w_3=0.2`,结果分级为:
|
||
|
||
| 置信度范围 | 标签 |
|
||
| --- | --- |
|
||
| ≥ 0.75 | 高置信度,推荐删除 |
|
||
| 0.45–0.75 | 中置信度,谨慎执行 |
|
||
| < 0.45 | 保留或人工检查 |
|
||
|
||
#### 5.1.8 前端可视化策略
|
||
|
||
- 为每个组件绘制卡片/表格行,包含:
|
||
- 可视化标签(颜色/图标表示置信度等级)
|
||
- 体积减少估计 (`volumeReduction`)
|
||
- 文件大小减少估计
|
||
- 风险因素列表(如“外露面少”“与关键件相连”)
|
||
- 支持拖拽将组件加入“待处理列表”,实时计算整体收益。
|
||
|
||
### 5.2 Shrinkwrap 外壳导出算法
|
||
|
||
#### 5.2.1 调用流程
|
||
|
||
1. 获取当前模型 `session->GetCurrentModel()`,判断类型是否为装配或零件。
|
||
2. 生成目标名称:
|
||
- `GenerateSafePartName` 清理特殊字符,限制长度 ≤ 31。
|
||
- 检测冲突(`session->GetModel`),必要时追加序号或时间戳。
|
||
3. 调用 `session->CreatePart(new_name)` 创建结果模型。
|
||
4. `pfcShrinkwrapSurfaceSubsetInstructions::Create` 构造参数:
|
||
- `SetQuality(quality)`
|
||
- `SetAutoHoleFilling(fill_holes)`
|
||
- `SetIgnoreSmallSurfaces(ignore_small_surfaces)`
|
||
- `SetSmallSurfPercentage(small_surface_percentage)`
|
||
- `SetIgnoreQuilts(ignore_quilts)`
|
||
- `SetIgnoreSkeleton(ignore_skeleton)`
|
||
- `SetAssignMassProperties(assign_mass_properties)`
|
||
5. 执行 `source_solid->ExportShrinkwrap(instructions)`。
|
||
6. 保存文件:
|
||
- 获取当前工作目录 `session->GetCurrentDirectory()`。
|
||
- 检查文件存在性 (`_access`);若存在,则调用 `GenerateUniqueFilePath` 自动重命名。
|
||
- 执行 `model->Save()`,使用 `GetFileSizeEx` 计算大小。
|
||
|
||
#### 5.2.2 参数预设
|
||
|
||
| 预设 | quality | chord_height | fill_holes | ignore_small_surfaces | small_surface_percentage | 输出类型 |
|
||
| --- | --- | --- | --- | --- | --- | --- |
|
||
| fast | 3 | 0.3 | false | false | 0.0 | `solid_surface` |
|
||
| balanced | 5 | 0.15 | false | false | 0.0 | `solid_surface` |
|
||
| tight | 5 | 0.1 | false | false | 0.0 | `solid_surface` |
|
||
|
||
- 前端需在 UI 中展示每个预设的特点、适用场景与注意事项。
|
||
|
||
#### 5.2.3 异常分类与恢复
|
||
|
||
| 异常类型 | 触发条件 | 前端处理建议 |
|
||
| --- | --- | --- |
|
||
| `Toolkit Error` | OTK 底层故障或模型损坏 | 提示“请检查模型完整性或重启 Creo” |
|
||
| `BadArgument` | 参数越界(如质量 > 10) | 高亮错误字段,提供建议范围 |
|
||
| `OutOfMemory` | 内存不足 | 建议降低质量或关闭其他程序 |
|
||
| `Timeout` | 超过 `timeout_seconds` | 提供重试、增加超时或后台执行选项 |
|
||
|
||
#### 5.2.4 前端监控指标
|
||
|
||
- 任务阶段耗时:数据准备、几何计算、文件写入(可按 30%/60%/10% 显示)
|
||
- 成品文件大小、路径、生成时间
|
||
- 参数回显与导出日志(含 JSON 原始请求与响应)
|
||
|
||
### 5.3 几何复杂度与层级分析
|
||
|
||
#### 5.3.1 指标体系
|
||
|
||
- **复杂度分值**:由 `GeometryAnalyzer::AnalyzeGeometryComplexity` 根据面数、曲率、特征数量、体积等计算。
|
||
- **层级统计**:`HierarchyStatisticsAnalyzer` 输出各层组件数量、深度、类型分布。
|
||
- **风险推荐**:`HierarchyAnalysis` 给出 `safe_deletions` 与 `risky_deletions`,附带原因、风险因素、置信度。
|
||
|
||
#### 5.3.2 前端推导
|
||
|
||
- 对复杂度分值按照分位数划分等级(如 P75/P90/P95),渲染热力图。
|
||
- 计算层级树的深度 `depth = max(level)`,节点数量 `N`,平均分支因子 `b = N / depth`。
|
||
- 对风险推荐进行文本解析,生成可视化标签,如“关键约束”“连接紧固件”“支撑结构”。
|
||
|
||
## 6. 工程实践
|
||
|
||
### 6.1 性能优化
|
||
|
||
- **虚拟化渲染**:对大规模列表/树使用 react-window/react-virtualized。
|
||
- **请求合并**:对频繁调用的 API 实现请求合并/去重;可采用 `AbortController` 取消过期请求。
|
||
- **缓存策略**:对静态数据(如组件字典、部件类型映射)使用 IndexedDB;对分析结果采取版本化缓存,便于比较。
|
||
- **Web Worker**:在 Worker 中执行排序、差异分析、统计聚合,避免主线程卡顿。
|
||
|
||
### 6.2 安全与权限
|
||
|
||
- 在桌面环境下可绑定 Windows AD 账号或企业 SSO;对敏感操作引入角色权限(如只读/分析/执行)。
|
||
- 提供操作日志签名或 Hash 校验,确保操作记录不可篡改。
|
||
- 若开放远程访问,部署反向代理(Nginx)实现 TLS、鉴权头注入、防刷限制。
|
||
|
||
### 6.3 测试策略
|
||
|
||
- **单元测试**:对数据解析、类型映射、排序筛选、状态管理等进行 Jest/Vitest 测试。
|
||
- **契约测试**:使用 Pact/JSON Schema 验证接口契约,防止插件更新导致前端解析失败。
|
||
- **端到端测试**:结合 Cypress/Playwright,模拟用户执行分析、导出、批量操作的完整流程。
|
||
- **性能基准**:对大模型数据(>10k 组件)进行性能压测,确保 UI 响应时间在 300ms 内。
|
||
|
||
## 7. 性能与资源评估
|
||
|
||
### 7.1 任務耗時基线(参考)
|
||
|
||
| 任务 | 平均耗时 (中等规模装配) | 影响因素 |
|
||
| --- | --- | --- |
|
||
| 薄壳分析 | 12–35 s | 组件数量、几何复杂度、硬件配置 |
|
||
| Shrinkwrap | 5–20 s | 质量参数、弦高、模型拓扑 |
|
||
| 几何复杂度分析 | 3–8 s | 面数、特征数量 |
|
||
| 批量操作 (5 步) | 10–25 s | 操作类型、每步耗时 |
|
||
|
||
- 前端需对 > 5 s 的任务提供进度反馈;> 30 s 的任务建议支持后台执行。
|
||
|
||
### 7.2 资源占用建议
|
||
|
||
- **内存**:保持前端单页内存占用 < 500 MB;对大型数据采用分页与懒加载。
|
||
- **CPU**:将重计算任务(排序、批量差异)移交 Worker,主线程 CPU 使用率维持在 30% 以下。
|
||
- **网络**:单次请求体 < 1 MB;前端可使用压缩/二进制传输(如 MessagePack)优化传输。
|
||
|
||
## 8. 结论与展望
|
||
|
||
MFCCreoDll 插件已将 Creo OTK 的核心几何处理能力以 HTTP JSON 形式开放,为前端构建专业化的模型管理平台奠定基础。本文档提出了分层架构设计、主要功能模块、关键算法流程与工程最佳实践,特别对薄壳分析与 Shrinkwrap 外壳导出给出了数学原理、参数体系与异常处理策略,可指导前端团队快速落地高可靠、高性能的解决方案。
|
||
|
||
未来工作方向包括:
|
||
|
||
1. **实时推送**:激活仓库中的 `WebSocketServer` 模块,与前端的事件总线集成,实现任务进度与状态事件的实时推送。
|
||
2. **三维可视化集成**:通过 Three.js 或 Cesium 引入轻量模型预览,与薄壳分析结果联动高亮显示。
|
||
3. **自动化脚本协同**:提供 CLI/REST 混合模式,允许 DevOps 流程直接调用前端定义的剧本,实现无人值守的模型清理流水线。
|
||
4. **智能化推荐**:基于历史分析结果训练机器学习模型,提高薄壳削减建议与批量操作排序的智能性。
|
||
|
||
通过本技术路线,前端团队能够在不直接依赖 OTK 的情况下,充分发挥现有插件能力,为 Creo 工程师提供高可用、高可观测性的生产力工具。
|