Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 工业软件 / Industrial Software

SAM 平台开发 / SAM Platform Development

1. SAM 二次开发总览与证据分级 / SAM Secondary Development Overview and Evidence Levels

2. 从 P0 到 P5:SAM 插件界面开发流程 / SAM Plugin Interface Development from P0 to P5

3. PYD 注册、Model Fragment 与 Part Fragment / PYD Registration, Model Fragments, and Part Fragments

4. Python 2 SAM API:已验证接口与失败清单 / Verified Python 2 SAM APIs and Known Failures

5. C++ SAM SDK:模型、网格与 ODB 接口 / C++ SAM SDK APIs for Models, Meshes, and ODB Data

6. SAM 参数化构件建模:从二维轮廓到三维网格 / SAM Parametric Component Modeling from 2D Profiles to 3D Meshes

7. Agent 接入 SAM:插件架构、工具注册与安全边界 / Integrating AI Agents into SAM with Plugins, Tools, and Safety Boundaries

8. SAM API 验证工作流:禁止猜测与七级验收门 / A Seven-Gate SAM API Validation Workflow Without Guesswork

9. 真实案例、当前边界与后续路线 / Validated Cases, Current Boundaries, and the Development Roadmap

10. SAM 二次开发指南:架构总览与系列索引 / SAM Secondary Development Architecture and Series Index

11. SAM GUI、Toolset 与交互类 API / SAM GUI, Toolset, and Interaction APIs

12. SAM 命令桥、Python 与 PYD 扩展 API / SAM Command Bridge, Python, and PYD Extension APIs

13. SAM 数据模型、Part 与 Mesh API / SAM Data Models, Parts, and Mesh APIs

14. SAM 场景、显示表示与渲染 API / SAM Scene, Display Representation, and Rendering APIs

15. SAM 插件编译、部署与故障排查 / Building, Deploying, and Troubleshooting SAM Plugins

16. SAM 二次开发旧入口 / Legacy Entry for SAM Secondary Development

17. SAM 二次开发知识体系 / SAM Secondary Development Knowledge System

本页目录

SAM GUI、Toolset 与交互类 API / SAM GUI, Toolset, and Interaction APIs ​

本篇只讨论 SAM 的窗口、模块、工具集、菜单、Form 和 Dialog。启动与插件扫描见 09-sam-secondary-development-guide.md,Python/PYD 见 11-sam-command-python-pyd-api.md。

1. GUI 类层次 ​

text
QApplication
  `-- SAMApp

RibbonMainWindow
  `-- SAMMainWindow
        `-- SAMBasicMainWindow

SAMGuiObjectManager
  +-- SAMModuleGui
  `-- SAMToolsetGui

SAMMode
  `-- SAMGuiMode
        `-- SAMForm
              `-- SAMCreateEditForm

QDialog
  `-- SAMDialog
        `-- SAMDataDialog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Module 表示 Part、Mesh、Job 等工作环境;Toolset 表示可复用的菜单、工具栏和业务工具;Form/Mode 控制一次操作的生命周期;Dialog 只负责界面和输入。

2. 应用和主窗口 ​

2.1 SAMApp ​

继承 QApplication,管理 SAM GUI 生命周期和 Kernel 初始化。

cpp
static SAMApp* getSAMApp();
SAMMainWindow* getSAMMainWindow();
QString getProductName() const;
void getVersionNumbers(int&, int&, int&) const;
QString getKernelInitializationCommand() const;
void init();
void create();
void lock();
void unlock();
bool isLocked() const;
int run();
void refreshWindow();
void refresh();
int completeStartup();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • init():初始化 Kernel、Python 和基础服务。
  • create():完成主窗口、模块和插件 GUI 的创建。
  • run():进入 Qt 事件循环。
  • lock()/unlock():控制 GUI 可操作状态,不能代替线程管理。

2.2 SAMMainWindow ​

SAM 主窗口高层接口,管理 Module、Toolset、消息区、CLI、画布和 Form。

cpp
void registerToolset(SAMGuiObjectManager*, uint opts);
SAMModuleGui* getModule(const QString&) const;
QObjectList getModules() const;
void writeToMessageArea(...);
void printPyLog(...);
void writeToCliOutput(...);
SAMForm* i_getForm(...);
SAMProcedureForm* i_getProcedureForm(...);
SAMGuiMode* i_getProcedure(...);
void i_showToolsets();
1
2
3
4
5
6
7
8
9
10

2.3 SAMBasicMainWindow ​

customApp.py 实际创建的主窗口实现。

cpp
void create();
void registerModule(const QString& displayedName,
                    const QString& moduleName,
                    const QString& initCommand);
void registerModule(const QString& displayedName,
                    const QString& moduleName);
SAMModuleGui* getModule(const QString&) const;
int getNumModules() const;
QMenuBar* getMenubar() const;
SAMMenu* getToolMenuPane() const;
QWidget* getToolbox() const;
SAMPromptArea* getPromptArea() const;
void writeToMessageArea(const QString&);
void printPyLog(const QString&);
void writeToCliOutput(const QString&);
void hideCli();
void showCli();
void hideMessageArea();
void showMessageArea();
QWidget* appendTreeTab(...);
QWidget* i_getCanvas() const;
void addCanvasArea(...);
void setCanvasArea(...);
void i_showToolsets();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

3. Module 与 Toolset ​

3.1 SAMGuiObjectManager ​

Module 和 Toolset 共用的 GUI 管理基类。

位置标志:

text
GUI_IN_NONE
GUI_IN_MENUBAR
GUI_IN_TOOL_PANE
GUI_IN_TOOLBAR
GUI_IN_TOOLBOX
GUI_IN_ALL
1
2
3
4
5
6

主要 API:

cpp
void hide(uint location);
void show(uint location);
QString getKernelInitializationCommand() const;
SAMForm* getForm(...);
SAMProcedureForm* getProcedureForm(...);
SAMGuiMode* getProcedure(...);
void i_addForm(SAMForm*);
void i_cancelAllForms();
static bool i_addImportModule(const char*);
SAMToolbarGroup* getToolbarGroup(...);
void sendCommandString(const QString&, bool replay, bool journal);
1
2
3
4
5
6
7
8
9
10
11

3.2 SAMModuleGui ​

代表一个工作模块。Module 切换时会控制相应 Toolset、菜单、树页签和显示对象类型。

cpp
QString getModuleName() const;
static SAMModuleGui* getCurrentModuleGui();
void hide(uint);
void show(uint);
void doCustomTasks();
QObjectList getToolsets() const;
SAMForm* getForm(...);
SAMProcedureForm* getProcedureForm(...);
SAMGuiMode* getProcedure(...);
QString getToolsetKernelInitializationCommands() const;
void registerToolset(SAMToolsetGui*, uint opts);
void unregisterToolset(const QString&);
uint getTypesToDisplay() const;
1
2
3
4
5
6
7
8
9
10
11
12
13

常见显示类型包括 PART、ASSEMBLY、ODB、XY_PLOT、SKETCH。

3.3 SAMToolsetGuiInterface ​

Qt 插件壳必须实现的接口:

cpp
class SAMToolsetGuiInterface
{
public:
    virtual ~SAMToolsetGuiInterface() {}
    virtual void registerToolset() = 0;
};

#define SAMToolsetGuiPlugin_iid "SAM.Pre.ToolsetGuiPlguin"
Q_DECLARE_INTERFACE(SAMToolsetGuiInterface,
                    SAMToolsetGuiPlugin_iid)
1
2
3
4
5
6
7
8
9
10

registerToolset() 是插件被发现后进入 SAM 注册流程的入口。

3.4 SAMToolsetGui ​

业务工具集的基类。

cpp
SAMToolsetGui(const QString& toolsetName);
void addMenuObject(QMenu*);
void addToolbarGroup(QToolBar*);
void addToolboxGroup(QWidget*);
void hide(uint location);
void show(uint location);
void activate();
void deactivate();
QString getToolsetName() const;
void i_suspendFormsAndDialogs();
1
2
3
4
5
6
7
8
9
10

典型派生类负责:

  1. 创建菜单和 Action;
  2. 创建工具栏/Toolbox;
  3. 连接 Qt 信号槽;
  4. 创建或激活业务 Form;
  5. 随 Module 切换显示或隐藏。

4. 菜单类 ​

4.1 SAMMenu ​

继承 QMenu:

cpp
SAMMenu(SAMGuiObjectManager* owner,
        const QString& title,
        SAMMenu* parent = nullptr);
1
2
3

owner 让菜单进入 SAM 的可见性、生命周期和快捷键管理体系。

4.2 SAMMenuCommand ​

继承 QAction:

cpp
SAMMenuCommand(owner, parent, label, icon);
SAMMenuCommand(owner, parent, label);
void i_setAccelerator(const QString&);
1
2
3

注册菜单的基本写法:

cpp
SAMMenu* toolsMenu = new SAMMenu(this, tr("&Tools"));
SAMMenuCommand* command =
    new SAMMenuCommand(this, toolsMenu, tr("&Run Command"));

toolsMenu->addAction(command);

connect(command, &QAction::triggered,
        this, &YourToolsetGui::onRunCommand);
1
2
3
4
5
6
7
8

菜单注册本身由 DLL 完成。槽函数可以只弹 Qt 窗口,也可以启动 Form,或向 Kernel 发送 Python 命令。

5. Mode 与 Form ​

5.1 SAMGuiMode ​

Mode 是一次交互操作的控制器,拥有命令列表、当前 Dialog 和状态。

cpp
SAMGuiMode(SAMGuiObjectManager* owner);
SAMGuiObjectManager* getOwner() const;
virtual void activate();
virtual void deactivate();
virtual int commit() = 0;
virtual int continueMode() = 0;
virtual void cancel(QObject* target = 0,
                    const char* message = 0);
void setModeName(const QString&);
QString getModeName() const;
SAMDialog* getCurrentDialog() const;
bool isKeyword(QObject*) const;
virtual bool okToCancel();
virtual int onCmdCommit(int);
virtual int onCmdGetNext(int);
virtual bool issueCommands(bool replay = true,
                           bool journal = false);
virtual QString getCommandString();
virtual void sendCommandString(const QString&,
                               bool replay,
                               bool journal);
virtual bool doCustomChecks();
virtual void doCustomTasks();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

典型生命周期:

text
activate
  -> 创建/显示第一个 Dialog
  -> 用户修改输入
  -> Apply/OK
  -> onCmdCommit
  -> verifyKeywordValues/doCustomChecks
  -> getCommandString
  -> issueCommands/sendCommandString
  -> Kernel 返回
  -> doCustomTasks
  -> 保持 Dialog 或 deactivate
1
2
3
4
5
6
7
8
9
10
11

5.2 SAMForm ​

继承 SAMGuiMode,用于有 Dialog 的命令流程。

cpp
SAMForm(SAMGuiObjectManager* owner);
void activate();
int commit();
int continueMode();
void cancel(...);
void setModal(bool);
int onCmdActivate(...);
int onCmdSuspend(...);
int onCmdResume(...);
virtual SAMDialog* getFirstDialog() = 0;
virtual SAMDialog* getNextDialog(...);
bool issueCommands(...);
1
2
3
4
5
6
7
8
9
10
11
12

5.3 SAMCreateEditForm ​

为创建和编辑两种场景提供公共参数处理:

cpp
enum Mode { CREATE, EDIT };
SAMCreateEditForm(SAMGuiObjectManager*, Mode);
Mode getExecutionMode() const;
int getNumArguments() const;
QString getArgument(int) const;
QString getArguments() const;
1
2
3
4
5
6

6. Dialog ​

6.1 SAMDialog ​

继承 QDialog,负责标准 Action Area。

标准按钮:

text
APPLY, CANCEL, CONTINUE, DEFAULTS, DISMISS,
NO, OK, YES, YES_TO_ALL
1
2

点击结果 ID:

text
ID_CLICKED_OK
ID_CLICKED_CONTINUE
ID_CLICKED_APPLY
ID_CLICKED_DEFAULTS
ID_CLICKED_CANCEL
ID_CLICKED_DISMISS
1
2
3
4
5
6

主要 API:

cpp
virtual void showModal();
virtual void show();
virtual void onActionButtonClicked(int);
virtual void onCmdDismiss(int);
virtual bool bailout();
QAbstractButton* appendActionButton(ButtonID);
QAbstractButton* appendActionButton(const QString&);
QAbstractButton* getActionButton(int id) const;
1
2
3
4
5
6
7
8

创建 OK、Apply、Cancel:

cpp
SAMDialog(owner,
          tr("Parameters"),
          SAMDialog::OK |
          SAMDialog::APPLY |
          SAMDialog::CANCEL);
1
2
3
4
5

6.2 SAMDataDialog ​

继承 SAMDialog,保存宿主 SAMGuiMode,把按钮操作交给 Mode。

cpp
SAMGuiMode* getMode() const;
virtual void onActionButtonClicked(int);
virtual void onCmdApply(int);
virtual void onCmdCancel(int);
virtual void onCmdContinue(int);
virtual void onCmdDefaults(int);
virtual void onCmdOk(int);
virtual bool bailout();
virtual void reject();
virtual void processUpdates();
void setMode(SAMGuiMode*);
void updateKeywordActivationState();
1
2
3
4
5
6
7
8
9
10
11
12

Apply 和 OK 的重要区别:

  • Apply:提交当前输入,通常不关闭 Dialog。
  • OK:提交当前输入,成功后通常关闭 Dialog 或进入下一阶段。
  • 按钮只负责触发,真正业务提交应由 Mode/Form 管理。

7. GUI 开发边界 ​

GUI DLL 适合:

  • 菜单、按钮、面板、弹窗;
  • 参数输入、控件联动;
  • 当前 Module、Viewport、选区上下文;
  • 命令发送、结果弹窗和 Message Area;
  • 临时显示、高亮与视口刷新。

GUI DLL 不适合直接堆放:

  • 大规模网格遍历;
  • 跨多个 Model/Part 的复杂持久修改;
  • 需要脚本重复调用的核心算法;
  • 长时间阻塞 Qt 主线程的任务。

这些逻辑应放到 Python 编排层、PYD 或独立算法库。

最后更新于:

Pager
上一篇10. SAM 二次开发指南:架构总览与系列索引 / SAM Secondary Development Architecture and Series Index
下一篇12. SAM 命令桥、Python 与 PYD 扩展 API / SAM Command Bridge, Python, and PYD Extension APIs

持续记录,持续成长

Copyright © Tidenflow