Using the "Tools Palette" Toolbar for a Workbench-如何实现 CATIAfrPaletteOptions 接口

摘要

本示例旨在说明如何实现CATIAfrPaletteOptions接口,从而在指定工作台激活后即可加载对应的配置选项。

通过本示例你将掌握的内容

CAAAfrPaletteOptions 示例工程

  1. 示例功能说明
  2. 示例启动方法
  3. 源码存放路径

分步实现步骤

简要总结

参考资料

 

通过本案例您将学到的内容

工具面板是一类特殊工具栏,会在以下两种场景下动态刷新内容:
  1. 切换进入工作台时:由工作台实现 CATIAfrPaletteOptions 接口。
    工作台激活后,对应命令标题会载入工具面板;工作台退出激活状态后,这些命令标题随即从工具栏移除。
  2. 运行独占 / 共用型命令时:由命令实现 CATIAfrCmdPaletteOptions 接口。命令激活时可追加命令标题,取消命令时移除;针对状态命令,还能为某一特定状态单独挂载命令标题,切换离开该状态后自动删除。命令整体失效后,面板上对应的命令标题将置为不可用状态 [1]。
本案例用于演示CATIAfrPaletteOptions接口的实现方法。

CAAAfrPaletteOptions 示例程序

CAAAfrPaletteOptions 是CAAApplicationFrame.edu框架下的示例工程,用于演示应用框架(ApplicationFrame)的相关功能。

CAAAfrPaletteOptions 实现功能说明

CAAAfrPaletteOptions 在CAAGeometry 文档对应的工作台中完成了CATIAfrPaletteOptions接口的实现 [2],用以调出专属工具栏 ——工具面板(Tools Palette)。该工具栏与工作台、插件(Add-in)中自定义的普通工具栏一致,内部承载各类命令实例(命令头)[3]。
 
在本示例里,面板中挂载了一条命令,用于实时统计 CAAGeometry 文档中已创建的点与直线数量。
图 1 工具面板

图片

 

该命令头为自定义类型,控件样式并非带图标的复选按钮,而是由两个CATDlgEditor控件实例构成。如需了解该自定义命令头的完整实现细节,可参考示例工程 CAAAfrEltCountHeader[4]。
接下来,在实体工具栏中启动长方体(Cuboid)命令后,如图 2 所示,工具面板会追加新增配置项;该命令同样依托工具面板选项机制实现自身交互逻辑 [1]。
图 2 长方体命令

图片

 长方体命令执行完毕后,工具面板恢复原有状态,重新显示两个编辑框控件。

如何启动 CAAAfrPaletteOptions

有关本示例的详细启动步骤,请查阅「CAAGeometry 示例」文档里标题为如何启动 CAAGeometry 示例的章节。
随后在执行 mkrun 命令的终端窗口中,命令行不要输入模块名,改用 CNEXT 启动程序。CATIA 程序加载完成后,按下述步骤操作:
  • 在【开始】菜单中,鼠标指向【基础架构(Infrastructure)】,随后点击 CAA V5:几何建模
  • 点击【点】命令,创建若干点;
  • 点击【直线】命令,创建若干直线;
  • 点击【长方体】命令。
    • 选择一个点  
    • 点击图片
    •  选择第二个点

    • 单击图片(图标不再高亮显示)
    • 指定一点以定义深度(即高度)

CAAAfrPaletteOptions 代码存放路径

CAAAfrPaletteOptions 示例仅由单个类 CAAEAfrPaletteOptions 组成,代码置于CAAApplicationFrame.edu框架下的CAAAfrPaletteOptions.m模块中:
  • Windows 系统路径: 安装根目录\CAAApplicationFrame.edu\CAAAfrPaletteOptions.m\
  • Unix 系统路径:安装根目录/CAAApplicationFrame.edu/CAAAfrPaletteOptions.m/
其中InstallRootDirectory指代 CAA 安装光盘的根安装目录。

分步实现

CAAAfrPaletteOptions 示例分为两大逻辑开发步骤:
  1. 编写头文件
  2. 编写源文件

 

编写头文件

下面是 CAAEAfrPaletteOptions.h 头文件代码:
...
#include "CATBaseUnknown.h"    
#include "CATListOfCATCommandHeader.h"       

class CAAEAfrPaletteOptions: public CATBaseUnknown
{
  CATDeclareClass;

  public:

    CAAEAfrPaletteOptions();
    virtual ~CAAEAfrPaletteOptions();
 
    CATLISTP(CATCommandHeader) GetPaletteOptions();


  private:
    CAAEAfrPaletteOptions(const CAAEAfrPaletteOptions &iObjectToCopy);
    CAAEAfrPaletteOptions & operator = (const CAAEAfrPaletteOptions &iObjectToCopy);
     
};
...
CAAEAfrPaletteOptions 类继承自 CATBaseUnknownGetPaletteOptionsCATIAfrPaletteOptions 接口里唯一的纯虚函数。
 
CATDeclareClass 宏用于声明该类是 CATIA 组件类。
 
注意:拷贝构造函数与赋值运算符重载被定义为私有成员,且不在源文件中实现;该写法可以避免编译器自动生成公有版本的拷贝函数,防止无意触发对象拷贝。

 

编写源文件

以下为 CAAEAfrPaletteOptions.cpp 源文件:
...
#include <TIE_CATIAfrPaletteOptions.h>
TIE_CATIAfrPaletteOptions(CAAEAfrPaletteOptions);

CATImplementClass(CAAEAfrPaletteOptions,
                  DataExtension,
                  CATBaseUnknown,
                  CAAAfrGeoCreationWkb_Palette);

CAAEAfrPaletteOptions::CAAEAfrPaletteOptions():CATBaseUnknown(){}

CAAEAfrPaletteOptions::~CAAEAfrPaletteOptions(){}
...
借助TIE_CATIAfrPaletteOptions宏,CAAEAfrPaletteOptions类完成CATIAfrPaletteOptions 接口的绑定实现。
 
CATImplementClass宏通过关键字DataExtension声明:本类是一个数据扩展类,用于扩展标识CAAAfrGeoCreationWkb_Palette对象。所有扩展类的第三个入参固定填写CATBaseUnknownCATNull
CAAAfrGeoCreationWkb_Palette命名规则:工作台内部标识名 + _Palette拼接而成。
 
该接口仅允许在开发者自定义的工作台中实现,禁止在达索原厂内置工作台上挂载此接口。工作台内部名称,是NewAccess宏第一个参数为CATCmdWorkbench时的第三个入参 [5]。
...
NewAccess(CATCmdWorkbench,pCAAAfrGeoCreationWkb,CAAAfrGeoCreationWkb);
接下来我们看一下 GetPaletteOptions 函数的实现代码。
...
// 实现CATIAfrPaletteOptions接口的获取面板命令头列表方法
CATLISTP(CATCommandHeader) CAAEAfrPaletteOptions::GetPaletteOptions()
{
    // 定义用于返回的命令头指针列表
    CATLISTP(CATCommandHeader) TheListToReturn ;

    CATCommandHeader *pMyCommand = NULL ;
    // 通过命令资源ID从系统缓存获取自定义命令头
    HRESULT rc= ::CATAfrGetCommandHeader("CAAAfrEltCountHdr",pMyCommand);

    // 获取失败或指针为空时,新建自定义命令头实例
    if ( FAILED(rc) || ( NULL ==pMyCommand) )
    {
        pMyCommand = new CAAAfrEltCountHeader("CAAAfrEltCountHdr");
    }

    // 有效命令头加入返回列表
    if ( NULL != pMyCommand)
    {
       TheListToReturn.Append(pMyCommand);
    }

    // 将命令头列表返回给工具面板
    return TheListToReturn ;
}
...
该方法的作用是向返回列表中添加命令头实例,重点需要管控命令头的实例化逻辑。用户每次切换进入对应工作台时,本函数都会被触发调用。因此在实例化命令头类之前,必须先校验该实例是否已经存在。如需深入理解命令头实例的生命周期,可查阅命令头相关技术文档里的「命令头管理」章节 [6]。
校验逻辑依靠全局函数CATAfrGetCommandHeader实现,该函数能够获取绑定当前编辑器(和文档关联的CATFrmEditor类实例)的已有命令头实例。若查询不到实例,也就是函数第二个入参pMyCommand为空指针时,再新建命令头实例。

简要总结

本示例讲解了如何实现CATIAfrPaletteOptions接口,从而在自定义工作台的工具面板中添加功能选项。
posted @ 2026-06-04 13:44  Breadss  阅读(5)  评论(0)    收藏  举报