在 ODA IFC SDK 中使用标准数据访问接口

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。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用