IFC SDK 支持标准数据访问接口 (SDAI),它提供了一个低级 API,用于操作使用 EXPRESS 模式定义的数据,并提供以下功能:
- 会话、存储库、模型和模式实例管理。
- 应用程序数据(实体实例、聚合、属性)的操作,包括数据验证。
SDAI 在 ISO 10303-22 标准中定义。
本文概述了如何在 IFC SDK 中使用 SDAI。
准备环境并从文件加载模型
打开文件并创建模型。首先使用 sdaiOpenSession 创建一个新会话:
SdaiSession session = sdaiOpenSession();
下一步是存储库初始化。在创建的会话中,从文件创建一个存储库。在此示例中,我们使用一个示例文件并打开它:
_sdaiCreateRepositoryFromFile(session, sdaiPathToFileDirectory, nameRepo);
这里我们使用 _sdaiCreateRepositoryFromFile。此函数以“_”符号开头,这意味着此函数是一个 ODA 实用程序函数,未在规范中描述。
如果我们向文件存储库传递一个有效路径,它应该会成功创建。然后我们应该使用 sdaiOpenRepository 打开它:
repoCreate = sdaiOpenRepository(session, repoCreate);
现在我们可以通过名称从打开的存储库中获取模型。文件模型的名称是“default”。我们应该使用 sdaiAccessModelBN 来完成此操作:
SdaiModel model = sdaiAccessModelBN(repoCreate, modelName, accessMode);
如果我们不再需要该模型,可以使用函数 sdaiEndModelAccess 关闭它。之后,所有读写操作都将失败。
访问应用程序实例
我们的模型以只读模式打开并可供使用。
首先,我们应该知道如何访问应用程序实例。让我们将示例文件视为纯文本并在文本编辑器中打开它:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [DesignTransferView_V1.0]'),'2;1');
FILE_NAME('001-00','2019-01-14T10:55:12',(''),(''),'The EXPRESS Data Manager Version 5.02.0100.07 : 28 Aug 2013','20180806_1515(x64) - Exporter 19.1.0.112 - Alternate UI 19.1.0.112','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1= IFCORGANIZATION($,'Autodesk Revit 2019 (ENU)',$,$,$);
#5= IFCAPPLICATION(#1,'2019','Autodesk Revit 2019 (ENU)','Revit');
#6= IFCCARTESIANPOINT((0.,0.,0.));
…
ENDSEC;
END-ISO-10303-21;
为了进行简单分析,DATA 部分中的每个字符串都成为模型的应用程序实例。该数字是此实例的句柄。大写的实例类型位于等号之后。圆括号中的数据是此应用程序实例的参数。SdaiAppInstance 是一种用于处理应用程序实例的 SDAI 数据类型。
让我们读取应用程序实例 #5。查看示例代码中的 appInstanceAccessByHandle 函数。
sdaiGetEntityById 通过其句柄 ID 从模型中读取应用程序模型。我们使用宏 TEST_ASSERT 进行应用程序实例验证。然后我们调用 sdaiErrorQuery 检查上次操作的错误代码。我们需要确保所有操作都成功完成:
//#5 = IFCAPPLICATION(#1, '2019', 'Autodesk Revit 2019 (ENU)', 'Revit');
SdaiAppInstance applicationInstance = _sdaiGetEntityById(model, 5);
TEST_ASSERT(applicationInstance != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
我们可以使用函数 sdaiIsInstanceOfBN 检查应用程序实例的类型。
TEST_ASSERT(sdaiIsInstanceOfBN(applicationInstance, "IFCAPPLICATION") == sdaiTRUE);
然后获取应用程序实例的句柄,并将其与 _sdaiGetEntityById 使用的句柄进行比较:
TEST_ASSERT(_sdaiGetEntityId(applicationInstance) == 5);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
完成并清理环境
完成会话操作后,请关闭存储库:
sdaiCloseRepository(repoCreate);
然后关闭会话:
sdaiCloseSession(session);
未来的博客文章将更详细地介绍如何使用 SDAI。