[返回博客](/cn/blog) # 在 ODA IFC SDK 中使用标准数据访问接口

Egor Vorobyov 十月 08, 2020 [\#ifc](/cn/blog/tag/ifc) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
