本文简单介绍 CAA 应用程序的一些基础概念,主要包括 CAA 应用程序的文件目录结构、基本组成及先决条件(又叫依赖),具体如下。
目录
1、文件目录结构
CAA 应用程序的文件目录结构如(图 1)所示:

在进行 CAA 应用程序开发时,首先需要指定一个工作目录,这个目录就是程序的工作空间(MyWorkspace)。
工作空间内的文件内容主要分为两种类型:构建时视图(Build time View)和运行时视图(Run time View)。
构建时视图包含全部的框架(MyFramework1、MyFramework2...)及其子内容(MyModule1.m、MyModule2.m、PublicInterfaces、ProtectedInterfaces、PrivateInterfaces...)如模块、资源、程序代码等,构建时视图的内容为开发人员创建,是 CAA 应用程序的主要文件。
运行时视图包含程序编译后全部的可执行文件以及从构建时视图复制的资源文件,运行时视图的根目录名称(os_a)在不同操作系统下不同,例如在 Windows 64位系统下其名称为 win_b64 ,对于普通用户来说,只需要复制全部运行时视图的内容到本机部署即可。运行时视图的内容如果被删除了,再次编译即可重新生成。
工作空间内除了构建时视图和运行时视图的内容外,还有一些 Visual Studio 生成的文件,这些文件如果被删除了,在下次配置工作空间及编译后会自动生成。
2、基本组成
CAA 应用程序的根目录为工作空间(Workspace),工作空间内包含各种不同的框架(Framework),每个框架下又包含各种不同的模块(Module),模块下才是具体的程序代码文件或资源文件。CAA 应用程序的文件目录结构与基本组成的对应关系如(图 2)所示:

框架按功能可以分类为:实现、接口、教育、测试等类型,模块按结果可以分类为:批处理、共享等类型。
CAA 应用程序的对象具有不同级别的访问权限,具体取决于对象的头文件所在的位置,如(图 3、图 4)所示:


总而言之,CAA 应用程序对象的访问权限如下:
- 每个框架目录下都有 PublicInterfaces、ProtectedInterfaces、PrivateInterfaces 三个文件夹,每个模块目录下都有 LocalInterfaces 文件夹。
- 当头文件位于 PublicInterfaces 文件夹时,其内容对外部工作空间是可访问的。事实上,CATIA 的安装目录也是一个工作空间,在进行二次开发时必然访问这个工作空间的内容。
- 当头文件位于 ProtectedInterfaces 文件夹时,其内容仅当前工作空间可以访问。
- 当头文件位于 PrivateInterfaces 文件夹时,其内容仅当前框架可以访问。
- 当头文件位于 LocalInterfaces 文件夹时,其内容仅当前模块可以访问。
3、先决条件
先决条件也称为依赖,前面介绍了 CAA 应用程序对象的访问权限,实际上要在代码中包含某个头文件从而访问其中的函数时必须添加相应的依赖,否则无法正确编译。有 4 个层级的依赖,它们分别为:类级、模块级、框架级、工作空间级,如(图 5)所示

下面依次介绍各层级的依赖及实现方式。
3.1 类级
类级别的依赖不需要额外的要求,同一模块下的对象(头文件位于相同模块的 LocalInterfaces 文件夹中)可以直接在代码中包含其他头文件。如(图 6)所示,在 TSTClass1.cpp 中直接使用 #include "TSTClass2.h" 语句包含头文件。

3.2 模块级
模块级别的依赖是指位于同一框架下不同模块的对象相互之间包含头文件时所需的依赖。要在代码中包含同一框架下其他模块中对象的头文件,需要满足以下要求:
- 被包含的头文件必须位于 PublicInterfaces、ProtectedInterfaces、PrivateInterfaces 中任一文件夹内。如(图 7)所示,在 TSTClass1.cpp 中使用 #include "TSTClass2.h" 语句包含头文件,其中 TSTClass2.h 位于 PublicInterfaces 文件夹。

- 在 PublicInterfaces、ProtectedInterfaces、PrivateInterfaces 中存在一个模块名称的头文件(如图 7 PublicInterfaces 中的 TSTModule2.h);此模块头文件由 VS 向导自动创建,生成位置与创建模块时所选择的 Header exposition 值对应;被包含的头文件(如图 7 中的 TSTClass2.h)中需要包含此模块头文件,并以 “ExportedBy + 模块名” 为关键字声明对象(如图 7 中的 class ExportedByTSTModule2 TSTClass2)。

- 在模块的 Imakefile.mk 文件(每个模块中都有唯一的 Imakefile.mk 文件)中添加被包含的头文件所在的模块名。如(图 7、图 8)所示,TSTClass1.cpp 中使用 #include "TSTClass2.h" 语句包含头文件,TSTClass1.cpp 位于模块 TSTModule1 中,TSTClass2.h 对应的 TSTClass2.cpp 位于模块 TSTModule2 中,因此在 TSTModule1 模块的 Imakefile.mk 文件中添加 TSTModule2 。
3.3 框架级
框架级别的依赖是指位于同一工作空间的不同框架的对象相互之间包含头文件时所需的依赖。要在代码中包含同一工作空间下其他框架中对象的头文件,需要满足以下要求:
- 被包含的头文件必须位于 PublicInterfaces、ProtectedInterfaces 中任一文件夹内,这与上文所讲的访问权限相对应。
- 显而易见,不同框架的对象也属于不同模块,因此也需要满足模块级依赖的要求:一是被包含的头文件需要加 “ExportedBy...” 关键字,二是 Imakefile.mk 文件中添加相应的模块名。
- 每个框架中都有唯一的 IdentityCard.xml 文件,需要在此 IdentityCard.xml 文件中添加被包含的头文件所在的框架名。如(图 9)所示,如果在其他框架中需要包含 TSTClass2.h ,则需要在这个框架的 IdentityCard.xml 文件中添加 “<prerequisite name="TSTFramework" access="protected" />” ,access="Protected" 表示可以包含框架 PublicInterfaces、ProtectedInterfaces 中的头文件,access="Public" 表示只能包含框架 PublicInterfaces 中的头文件。

3.4 工作空间级
工作空间级别的依赖是指位于不同工作空间的对象相互之间包含头文件时所需的依赖。要在代码中包其他工作空间中对象的头文件,需要满足以下要求:
- 被包含的头文件必须位于 PublicInterfaces 文件夹内,这与上文所讲的访问权限相对应。
- 显而易见,不同工作空间的对象也属于不同模块,因此也需要满足模块级依赖的要求:一是被包含的头文件需要加 “ExportedBy...” 关键字,二是在 Imakefile.mk 文件中添加相应的模块名。
- 显而易见,不同工作空间的对象也属于不同框架,因此也需要满足框架级依赖的要求:在 IdentityCard.xml 文件中添加相应的框架名,且只能使用 access="Public" 。前面讲过 CATIA 的安装目录也是一个工作空间,这个工作空间中包含所有的 DS 框架,因此包含此工作空间的对象时都使用 access="Public" (如图 9 的 System、Dialog 框架)。
- 添加工作空间依赖,在 VS 中通过右键单击工作空间名称(如图 10),然后点击 Prerequisites... 进行添加,具体操作详见 2.6 添加工作空间依赖 。

3.5 查询先决条件信息
一个头文件的完整路径信息由工作空间 + 框架名 + 模块名 + 头文件名共同决定,这就是先决条件信息。要包含某个 DS 对象的头文件时,必须知道其先决条件信息,以查询 “CATIAlias” Interface 的先决条件信息为例:工作空间就是 CATIA 的安装路径,框架名、模块名、头文件名通过开发手册(Developer Assistance)中 CATIAlias Interface 的页面即可查询(如图 11)。

参考资料
CAA for CATIA 3DEXPERIENCE Getting Started