17 KiB
17 KiB
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 设计原则
- 分层解耦:前端仅通过 HTTP/JSON 与插件交互,不直接依赖 OTK SDK;业务逻辑与呈现分离,便于扩展。
- 可观测性:所有长耗时任务(薄壳分析、Shrinkwrap、批量操作)需暴露进度、耗时、错误分类,便于运维监控。
- 可组合性:提供参数模板、操作剧本与结果数据的导入导出,支持在 CI/CD 或 PLM 流程中复用。
- 安全性:在远程部署场景下需支持 TLS、Token 校验与审计日志,避免 Creo 能力被滥用。
2. 技术架构蓝图
2.1 系统角色
| 角色 | 描述 | 关键职责 |
|---|---|---|
| Creo 插件 (C++) | 运行于 Creo Session 的 DLL,负责与 OTK C++ 交互 | 处理模型操作、几何分析、文件导出、批量执行;输出 JSON |
| 前端应用 | 浏览器或 Electron 桌面应用 | 展示数据、收集用户输入、调度任务、渲染图表与报告 |
| 本地 HTTP 服务 | 插件内置 HttpServer |
提供 REST 风格接口,端口默认 12345,支持 CORS |
2.2 前端分层结构
- Presentation Layer:基于 React/Vue 等组件库构建视图,包含仪表盘、图表、树状组件、文件选择器。
- Application Layer:管理路由、权限、国际化、主题,以及业务逻辑 orchestrator。
- Data Layer:封装 API 客户端(Axios/Fetch),实现请求队列、超时、重试、缓存与统一错误处理。
- State Management Layer:使用 Redux Toolkit、Zustand 或 Pinia 保存 Creo 会话信息、当前模型上下文、分析结果、任务队列。
- Computation Layer:通过 Web Worker / Rust WASM 实现本地重计算(排序、聚合、差异分析),减少主线程阻塞。
- Persistence Layer:IndexedDB、SQLite (在 Electron 中) 或本地文件用于缓存配置、模板、历史日志、结果快照。
2.3 数据流视图
- 用户在 UI 发起操作 →
- 前端构造 JSON 请求 → HTTP 客户端发送至
http://127.0.0.1:12345→ - 插件通过 OTK 执行业务逻辑 →
- 插件返回标准化 JSON(含
success,data,error)→ - 前端解析并更新状态树 →
- 触发 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 响应结构
{
"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/N) Σ (v_i - μ)(v_i - μ)^T,在 OTK 中通过手工矩阵运算实现。 - 求解特征值/特征向量,确定主轴
e1, e2, e3。 - 评估长宽比、表面积、体积,若满足:
- 长宽比 >
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) 归因
-
计算全局可见矩阵
V_all。 -
对组件
c,构造V_{-c}(移除该组件),比较差异:\Delta V_c = \frac{\|V_all - V_{-c}\|_1}{\|V_all\|_1} -
Δ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 调用流程
- 获取当前模型
session->GetCurrentModel(),判断类型是否为装配或零件。 - 生成目标名称:
GenerateSafePartName清理特殊字符,限制长度 ≤ 31。- 检测冲突(
session->GetModel),必要时追加序号或时间戳。
- 调用
session->CreatePart(new_name)创建结果模型。 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)
- 执行
source_solid->ExportShrinkwrap(instructions)。 - 保存文件:
- 获取当前工作目录
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 外壳导出给出了数学原理、参数体系与异常处理策略,可指导前端团队快速落地高可靠、高性能的解决方案。
未来工作方向包括:
- 实时推送:激活仓库中的
WebSocketServer模块,与前端的事件总线集成,实现任务进度与状态事件的实时推送。 - 三维可视化集成:通过 Three.js 或 Cesium 引入轻量模型预览,与薄壳分析结果联动高亮显示。
- 自动化脚本协同:提供 CLI/REST 混合模式,允许 DevOps 流程直接调用前端定义的剧本,实现无人值守的模型清理流水线。
- 智能化推荐:基于历史分析结果训练机器学习模型,提高薄壳削减建议与批量操作排序的智能性。
通过本技术路线,前端团队能够在不直接依赖 OTK 的情况下,充分发挥现有插件能力,为 Creo 工程师提供高可用、高可观测性的生产力工具。