IFC SDK 支持标准数据访问接口 (SDAI),它提供了一个低级 API,用于操作使用 EXPRESS 模式定义的数据。本文介绍了如何使用应用程序实例集。
有关在 IFC SDK 中使用 SDAI 的详细信息,请参阅本文。
一个 .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);
}