6.0 KiB
6.0 KiB
OTK(C++)单一方案重构计划(Shrinkwrap)
目标
把项目重构为单一技术栈:Creo Object TOOLKIT C++(OTK / pfc),实现并稳定交付以下最小闭环:
- Creo 启动后插件可正常加载(不再出现 foreign program failed to initialize)。
- 在 Ribbon 自定义/菜单中能看到一个命令(例如:
Lightweight(轻量化))。 - 命令在无活动模型时置灰;打开 Part/Assembly 后可点击。
- 点击后对当前模型或用户指定的子装配执行 Shrinkwrap。
- 支持参数填写(质量、忽略骨架/曲面、补洞、小面等)并执行导出保存。
为什么选 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)
- 增加一个参数对话框(选项:
- uifc 对话框(.ui)
- Creo 自带输入面板/对话框 API )
- 参数持久化:
- 写入
text/下的配置文件(ini/json)或 Creo 配置项(取决于部署约束) - 规则:启动读、修改写、异常回退默认
- 写入
代码与工程重构步骤
Phase 0:冻结与基线
- 保留当前能编译的最后状态(用于对比)。
- 明确目标平台:Creo 9.0 + VS2022 + x64。
Phase 1:删减到“OTK 核心插件骨架”
- 工程只保留:
dllmain.cpp(仅做:创建 OTK command + designate)pch.*(可选;若继续出宏/编译怪问题,建议移除 PCH)
- 删除/移除编译单元:HTTP/Json/ToolkitTasks 等与 shrinkwrap 无关内容。
- 统一 include:只使用 OTK 头(
pfc*,wfc*)和必要的 Windows 头。
验收:Creo 启动无初始化失败;命令可在 Customize Ribbon 中看到。
Phase 2:实现 Shrinkwrap 对当前模型
- ActionListener::OnCommand:
- 校验当前模型是 Part/Assembly
- 选择输出路径(UISaveFile)
- 创建 shrinkwrap 指令并导出
- 弹出结果(
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 内执行)
- VS2022:
Debug|x64编译成功。 - Creo 启动:不弹初始化失败。
- 打开 Part/Assembly:按钮可点。
- 点击导出:生成 shrinkwrap prt,消息提示正确。
- 装配选择子装配:导出对象符合预期。