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

6.0 KiB
Raw Permalink Blame History

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 到 pfcSolidPart/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. 弹出结果(UIShowMessageDialogUIDisplayMessage

验收:打开一个零件/装配,点击命令能导出 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. VS2022Debug|x64 编译成功。
  2. Creo 启动:不弹初始化失败。
  3. 打开 Part/Assembly按钮可点。
  4. 点击导出:生成 shrinkwrap prt消息提示正确。
  5. 装配选择子装配:导出对象符合预期。