[返回博客](/cn/blog) # IFC SDK 和 SDAI：使用应用程序实例集

Egor Vorobyov 一月 28, 2021 [\#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 模式定义的数据。本文介绍了如何使用应用程序实例集。

有关在 IFC SDK 中使用 SDAI 的详细信息，请参阅[本文](https://www.opendesign.com/blog/2020/october/working-standard-data-access-interface-oda-ifc-sdk)。

一个 .ifc 文件可能包含多个相同类型的应用程序实例。对于这些情况，SDAI 提供了一个接口，允许您：

- 搜索指定类型的所有实例。
- 操作一组相同类型的实例，包括通过迭代器对象顺序访问集合的元素。

要获取特定类型的应用程序实例集，请使用 sdaiGetEntityExtentBN() 函数。

要检查是否找到指定类型的任何实例，请调用 sdaiGetMemberCount() 函数。此函数返回集合中元素的数量。

当您拥有一个非空的实例集时，您可以创建一个迭代器对象，然后使用以下函数遍历集合中的元素：

- sdaiCreateIterator() — 创建一个迭代器对象（由 SdaiIterator 数据类型表示）。
- sdaiBeginning() — 移动到集合的第一个元素。
- sdaiNext() — 访问集合的下一个元素。
- sdaiGetAggrByIterator() — 访问集合的当前元素。

以下代码片段演示了如何在模型中查找所有 IFCBSPLINECURVEWITHKNOTS 实例并遍历找到的实例集。

```
SdaiString entityName = "IFCBSPLINECURVEWITHKNOTS";
SdaiSet bsplineInstanceSet = sdaiGetEntityExtentBN(model, entityName);
```

确保类型化应用程序实例集有效。集合的长度不应为零：

```
TEST_ASSERT(sdaiGetMemberCount(bsplineInstanceSet) > 0);
```

然后使用迭代器遍历聚合的所有项：

```
SdaiIterator bsplineIterator = sdaiCreateIterator(bsplineInstanceSet);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);

for (sdaiBeginning(bsplineIterator); sdaiNext(bsplineIterator);)
 {
    SdaiInstance instance = NULL;
    sdaiGetAggrByIterator(bsplineIterator, sdaiINSTANCE, &instance);

    SdaiInteger instanceId = _sdaiGetEntityId(instance);

    TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
 }
```

## 今天就开始行动

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

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