最近查阅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方式更加方便调试,适合新版本的二次开发使用。