149 lines
6.0 KiB
Markdown
149 lines
6.0 KiB
Markdown
# OTK(C++)单一方案重构计划(Shrinkwrap)
|
||
|
||
## 目标
|
||
|
||
把项目重构为**单一技术栈:Creo Object TOOLKIT C++(OTK / pfc)**,实现并稳定交付以下最小闭环:
|
||
|
||
1. Creo 启动后插件可正常加载(不再出现 *foreign program failed to initialize*)。
|
||
2. 在 Ribbon 自定义/菜单中能看到一个命令(例如:`Lightweight(轻量化)`)。
|
||
3. 命令在无活动模型时置灰;打开 Part/Assembly 后可点击。
|
||
4. 点击后对**当前模型**或**用户指定的子装配**执行 Shrinkwrap。
|
||
5. 支持参数填写(质量、忽略骨架/曲面、补洞、小面等)并执行导出保存。
|
||
|
||
## 为什么选 OTK(C++)
|
||
|
||
后续需求包含:
|
||
|
||
- 参数交互(对话框/持久化上次参数)
|
||
- 在装配中选择某个子装配/组件路径后执行
|
||
|
||
这些都属于**交互 + 选择 + 模型对象链路**,OTK 的 `pfcSession / pfcSelect / pfcUICommand / pfcShrinkwrap` 更适合长期扩展;并且重构后只保留 OTK(避免 Pro/Toolkit C API 与 OTK 混用导致的宏/typedef/编译链路问题)。
|
||
|
||
## 约束与非目标
|
||
|
||
- 本阶段不做 HTTP Server/JSON/外部接口。
|
||
- 不做与 Shrinkwrap 无关的命令与菜单项。
|
||
- 不追求一次性完善全部 UI 细节;优先保证稳定加载与核心链路。
|
||
|
||
## 总体设计
|
||
|
||
### 1) 命令注册(OTK)
|
||
|
||
- 入口仍由 Creo 加载机制触发(`user_initialize`/`user_terminate`),但**命令创建/访问控制/执行回调全部使用 OTK**:
|
||
- `pfcSession::UICreateCommand` 创建命令
|
||
- 绑定 `pfcUICommandActionListener::OnCommand`
|
||
- 绑定 `pfcUICommandAccessListener::OnCommandAccess`
|
||
- `pfcUICommand::Designate` 让命令在 *Customize Ribbon* 可被放置(参考:`otk_cpp_doc/objecttoolkit_Creo/manual0/otk_ribbon.html`)
|
||
- 可选:`pfcUICommand::SetIcon` 绑定图标
|
||
|
||
> 注:OTK 文档提到 Ribbon 工作流与异步模式相关(`otk_ribbon.html`)。本项目作为 Creo 内加载 DLL 的场景,优先采用 “Designate + 用户自定义放置” 方案;如需自动装载 ribbon 定义文件,再评估 `pfcSession::RibbonDefinitionfileLoad` 的使用和部署路径。
|
||
|
||
### 2) Shrinkwrap 执行(OTK)
|
||
|
||
- 对当前模型:
|
||
- `session->GetCurrentModel()` → cast 到 `pfcSolid`(Part/Assembly)
|
||
- 对子装配:
|
||
- 通过选择:`pfcSelect` + `pfcSelectionOptions`,限制可选类型为组件/子装配
|
||
- 从 `pfcSelection` 获取:`GetSelModel()` / `GetPath()`(组件路径)
|
||
- 将选中对象解析为需要 shrinkwrap 的 `pfcSolid`
|
||
|
||
- Shrinkwrap 指令:
|
||
- 使用 `pfcShrinkwrapMergedSolidInstructions`(或未来扩展到 Faceted/Surf Subset)
|
||
- 把 UI 参数映射到指令对象(质量、忽略骨架、忽略 quilts、补洞、小面等)
|
||
- 调用 `source->ExportShrinkwrap(exportInstr)`
|
||
- 生成/备份输出零件(`Backup`/descriptor/path)
|
||
|
||
### 3) 参数填写与持久化
|
||
|
||
分两步走:
|
||
|
||
**阶段 A(快速可用)**
|
||
|
||
- 先用简单交互:
|
||
- 输出路径:`pfcSession::UISaveFile(pfcFileSaveOptions)`
|
||
- 其他参数:先用默认值 + 未来再加 UI
|
||
|
||
**阶段 B(完整 UI)**
|
||
|
||
- 增加一个参数对话框(选项:
|
||
1) uifc 对话框(.ui)
|
||
2) Creo 自带输入面板/对话框 API
|
||
)
|
||
- 参数持久化:
|
||
- 写入 `text/` 下的配置文件(ini/json)或 Creo 配置项(取决于部署约束)
|
||
- 规则:启动读、修改写、异常回退默认
|
||
|
||
## 代码与工程重构步骤
|
||
|
||
### Phase 0:冻结与基线
|
||
|
||
- 保留当前能编译的最后状态(用于对比)。
|
||
- 明确目标平台:Creo 9.0 + VS2022 + x64。
|
||
|
||
### Phase 1:删减到“OTK 核心插件骨架”
|
||
|
||
1. 工程只保留:
|
||
- `dllmain.cpp`(仅做:创建 OTK command + designate)
|
||
- `pch.*`(可选;若继续出宏/编译怪问题,建议移除 PCH)
|
||
2. 删除/移除编译单元:HTTP/Json/ToolkitTasks 等与 shrinkwrap 无关内容。
|
||
3. 统一 include:只使用 OTK 头(`pfc*`, `wfc*`)和必要的 Windows 头。
|
||
|
||
**验收**:Creo 启动无初始化失败;命令可在 Customize Ribbon 中看到。
|
||
|
||
### Phase 2:实现 Shrinkwrap 对当前模型
|
||
|
||
- ActionListener::OnCommand:
|
||
1) 校验当前模型是 Part/Assembly
|
||
2) 选择输出路径(UISaveFile)
|
||
3) 创建 shrinkwrap 指令并导出
|
||
4) 弹出结果(`UIShowMessageDialog` 或 `UIDisplayMessage`)
|
||
|
||
**验收**:打开一个零件/装配,点击命令能导出 prt。
|
||
|
||
### Phase 3:Access 逻辑与按钮“灰/不灰”稳定
|
||
|
||
- AccessListener::OnCommandAccess:
|
||
- 无模型:UNAVAILABLE
|
||
- 有模型但非 solid:UNAVAILABLE
|
||
- 有 Part/Assembly:AVAILABLE
|
||
|
||
**验收**:按钮状态与模型状态一致,不出现“有模型但仍灰”的情况。
|
||
|
||
### Phase 4:支持选择子装配/组件
|
||
|
||
- 若当前是装配:
|
||
- 允许用户选择“当前装配”或“选中子装配”
|
||
- 通过 `pfcSelect` 限制可选对象为组件/子装配
|
||
- 从 selection 获取目标 `pfcSolid`
|
||
|
||
**验收**:能对指定子装配执行 shrinkwrap。
|
||
|
||
### Phase 5:参数 UI + 映射 + 持久化
|
||
|
||
- UI:质量(1-10)、忽略骨架、忽略 quilts、补洞、小面百分比等
|
||
- 映射到 `pfcShrinkwrap*Instructions`
|
||
- 保存上次参数(文件或 Creo 配置)
|
||
|
||
**验收**:参数可控、可复现、重启后仍保留。
|
||
|
||
## 交付物
|
||
|
||
- 精简后的源码结构(仅 OTK)。
|
||
- 一个可放置到 Ribbon 的命令:`Lightweight(轻量化)`。
|
||
- Shrinkwrap 成功/失败提示信息。
|
||
- 后续扩展(子装配、参数 UI)在同一结构上迭代。
|
||
|
||
## 风险清单
|
||
|
||
- Ribbon 自动加载(.rbn)与异步模式/部署路径:先以“Designate + 用户自定义”方案落地。
|
||
- 选择子装配时的路径解析:需要严格限制 selection filter 并处理组件路径。
|
||
- OTK/Creo 版本差异:所有 API 调用以本仓库 `otk_cpp_doc` 为准。
|
||
|
||
## 验证清单(你在 VS2022/Creo 内执行)
|
||
|
||
1. VS2022:`Debug|x64` 编译成功。
|
||
2. Creo 启动:不弹初始化失败。
|
||
3. 打开 Part/Assembly:按钮可点。
|
||
4. 点击导出:生成 shrinkwrap prt,消息提示正确。
|
||
5. 装配选择子装配:导出对象符合预期。
|