CreoPluging9.0/REFACTOR_PLAN_OTK.md
2026-01-15 16:23:23 +08:00

149 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OTKC++单一方案重构计划Shrinkwrap
## 目标
把项目重构为**单一技术栈Creo Object TOOLKIT C++OTK / pfc**,实现并稳定交付以下最小闭环:
1. Creo 启动后插件可正常加载(不再出现 *foreign program failed to initialize*)。
2. 在 Ribbon 自定义/菜单中能看到一个命令(例如:`Lightweight(轻量化)`)。
3. 命令在无活动模型时置灰;打开 Part/Assembly 后可点击。
4. 点击后对**当前模型**或**用户指定的子装配**执行 Shrinkwrap。
5. 支持参数填写(质量、忽略骨架/曲面、补洞、小面等)并执行导出保存。
## 为什么选 OTKC++
后续需求包含:
- 参数交互(对话框/持久化上次参数)
- 在装配中选择某个子装配/组件路径后执行
这些都属于**交互 + 选择 + 模型对象链路**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 3Access 逻辑与按钮“灰/不灰”稳定
- AccessListener::OnCommandAccess
- 无模型UNAVAILABLE
- 有模型但非 solidUNAVAILABLE
- 有 Part/AssemblyAVAILABLE
**验收**:按钮状态与模型状态一致,不出现“有模型但仍灰”的情况。
### 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. 装配选择子装配:导出对象符合预期。