最近查阅CAADoc时发现了一种用XML语言描述创建按钮的方式,即创建XML语言格式的Declarative File(声明式afr文件),这种创建按钮的方式有如下优势:
- 声明式应用程序框架可以隐藏创建应用程序或插件的所有C++代码,只需定义想要公开的命令以及可以访问它们的位置。
- 声明性语法比C++代码灵活得多,XML语言可以很容易地描述层次模型。
- 声明性文件是一种资源,它可以在不停止运行应用程序的情况下被修改。
其中比较有趣的一点是并不需要重启CATIA即可修改按钮并及时生效,遂进行深入研究。
若想进行上述创建方法,首先请确保自己的CATIA、CAA API、RADE均已在r2016x的FP1629修正补丁等级之上,因为只有在此补丁版本才正式推出了MkDAfrTool工具。
如何使用
第一步:修改Framework的IdentityCard文件
需要添加一行启用工具的代码
<toolPrerequisite name="MkDAfrTool"/>
第二步:创建单独的声明式Module并修改Imakefile.mk文件
把mk文件修改为如下内容
BUILT_OBJECT_TYPE=RUNTIME DATA
SCRAMBLING_KEY=2
第三步:创建必要的文件结构
声明性文件必须在一个特定的文件夹层次结构中定义,这个层次结构应该严格遵守,因为它包含了创建新应用程序所需的所有信息。
FrameworkName
|
|
-------- ModuleName
|
|
-------------- Imakefile.mk
|
|
-------------- src
|
|
------ resources
|
|
-----ApplicationFrame
- 在src文件夹下,必须有一个名为resources的文件夹,在其文件夹下必须有另一个名为ApplicationFrame的文件夹(此命名和层次结构是必需的)。
ApplicationFrame
|
|
----------- AfrWorkshop
|
|
------- PrtWks
|
|
----- AfrAddin
- ApplicationFrame是我们之前在模块的src文件夹中创建的文件夹。
- AfrWorkshop意味着我们正在为一个数据模型添加一个声明性文件,也称为Workshop。
- PrtWks是我们正在扩展的几何模型的WorkShopId。该文件夹必须具有Id的准确名称。具体ID可以通过CATIA的Command命令查到,如下图。
- AfrAddin表示我们正在创建一个Addin。
第四步:创建声明文件
声明文件描述了Addin的具体内容。它必须有afr扩展名,以便被mkmk正确处理。
<?xml version="1.0" encoding="utf-8"?>
<Styles xmlns:syp = "http://www.3ds.com/xsd/SYP">
<Template syp:name = "TSTAddinHeaders" Target = "CATCmdHeadersList">
<!-- Define here the command headers of your addin -->
<CATCmdHeadersList>
<CATCommandHeader
ID = "BasicCmd" ClassName = "TSTCommand" SharedLibraryName = "TSTModule" ResourceFile = "TSTAddinHeader" Available = "1"/>
</CATCmdHeadersList>
</Template>
<Template syp:name = "TSTAddinAccess" Target = "CATCmdAddin">
<!-- Define here the layout of your commands. -->
<CATCmdAddin>
<!-- Commands visible in a new section -->
<CATCmdContainer Name = "TSTSection">
<CATCmdContainer Name = "TSTToolbar">
<CATCmdStarter Name = "BasicCmdStr" Command = "BasicCmd"/>
</CATCmdContainer>
</CATCmdContainer>
</CATCmdAddin>
</Template>
</Styles>
第一行添加了一个基本的XML标记,表明该文件是XML文件。接下来添加XML文件的根节点:Styles节点。该节点向解析器表明,它必须将该文件作为声明性文件进行分析。
XML文件的主要内容由两部分组成:
- CATCmdHeadersList部分:允许定义命令绑定的command
- CATCmdAddin部分:允许定义命令的布局
第五步:创建命令头(CATCmdHeadersList部分)
<Template syp:name = "TSTAddinHeaders" Target = "CATCmdHeadersList">
<!-- Define here the command headers of your addin -->
<CATCmdHeadersList>
<CATCommandHeader
ID = "BasicCmd" ClassName = "TSTCommand" SharedLibraryName = "TSTModule" ResourceFile = "TSTAddinHeader" Available = "1"/>
</CATCmdHeadersList>
</Template>
- 描述命令头的部分由一个以syp:name属性为值的名称引用。这个名称必须遵循一个命名约定:xxxHeaders,其中xxx是addin的名称(与XML文件的名称相同)。
- Target属性的值必须为CATCmdHeadersList。
- CATCmdHeadersList标记可以有任意多个子标记,可以为addin声明命令头。
CATCommandHeader标记通过提供以下信息来声明命令头:
- ID:该ID用于引用命令头(例如,在定义框架中命令的布局时引用特定的命令头)。
- ClassName:该属性是要实例化以启动命令的类(该类应该使用CATCreateClass宏)。
- SharedLibraryName:该属性对应于包含命令代码的共享库的名称。
- ResourceFile:该属性对应于与命令相关联的资源文件的名称。
- Available:该属性表示命令在正常模式下是否可用(1表示可用,0表示隐藏)。最好使用属性AvailabilityMode,它允许为每个模式定义命令头可用性(Available="1 "类似于AvailabilityMode="Normal=YES ")。
AvailabilityMode:为每种模式指定命令头的可用性。此属性采用以下语法作为参数“模式1 =是模式2 =否模式3= ...”。请注意,如果您没有为特定模式指定可用性,该模式将使用其默认可用性。可用性可定制的不同模式如下:
- Normal
- Editability
- SmallScale
- LargeScale
- Offline
第六步:创建命令布局(CATCmdAddin部分)
<Template syp:name = "TSTAddinAccess" Target = "CATCmdAddin">
<!-- Define here the layout of your commands. -->
<CATCmdAddin>
<!-- Commands visible in a new section -->
<CATCmdContainer Name = "TSTSection">
<CATCmdContainer Name = "TSTToolbar">
<CATCmdStarter Name = "BasicCmdStr" Command = "BasicCmd"/>
</CATCmdContainer>
</CATCmdContainer>
</CATCmdAddin>
</Template>
- 这个部分的syp:name属性必须遵循一个命名约定:xxxAccess,其中xxx是您的应用程序的名称(与XML文件的名称相同)。T
- arget属性的值必须为CATCmdAddin。 模板的唯一子级必须有一个CATCmdAddin标记。
- CATCmdAddin标记可以有许多子CATCmdContainer标记来定义容器的层次结构。
- 按照层级需要依次定义Section、Toolbar、Addin。
- 在容器的最后一级,CATCmdStarter标签允许声明容器的命令。这个标记需要两个属性,一个name属性和一个包含命令头Id的command属性。
第七步:定义资源文件
定义CATNls和CATRsc方法与通过Component组件方式创建按钮方式相同,这里不多赘述。
总结
这种数据模型的文件可以在CATIA运行过程中修改生效,比DLL方式更加方便调试,适合新版本的二次开发使用。