[返回博客](/cn/blog) # IFC SDK 和 SDAI：使用嵌套聚合属性

Egor Vorobyov 一月 22, 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 文件包含以下应用程序实例：

```
//#1277= IFCRATIONALBSPLINESURFACEWITHKNOTS(3,1, ((#1249,#1251), (#1253,#1255), (#1257,#1259), (#1261,#1263), (#1265,#1267), (#1269,#1271), (#1273,#1275)), .RULED_SURF.,.F.,.F.,.U.,(4,1,1,1,4),(2,2),(0.,0.25,0.5,0.75,1.),(0.,1.),.UNSPECIFIED., ((1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.)));
```

此实例包含二维聚合（以粗体文本突出显示）。下面您可以看到如何从每个二维聚合中读取第一个聚合项。

使用 \_sdaiGetEntityById() 函数获取相应的父实例：

```
SdaiAppInstance applicationInstance = _sdaiGetEntityById(model, 1277);
TEST_ASSERT(applicationInstance != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

从名为 "controlpointslist" 的实例属性中，使用 sdaiGetAttrBN 获取聚合值：

```
SdaiAggr  aggregate2dControlPointsList = NULL;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance, 
				"controlpointslist", 
				sdaiAGGR, 
				&aggregate2dControlPointsList) != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

从之前提取的聚合中获取子聚合：

```
SdaiAggr  aggregateChild = NULL;
TEST_ASSERT(sdaiGetAggrByIndex(aggregate2dControlPointsList, 
 				      0, 
 				      sdaiAGGR, 
                                      &aggregateChild) != NULL);

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

提取的子聚合应包含应用程序实例列表。我们可以使用 sdaiGetAggrByIndex 提取子聚合，因为我们正在处理有序聚合列表。查看 .ifc 文件中的应用程序实例，并找到第一个元素 #1249, #1251 的值。我们将这些值与子聚合的值进行比较：

```
SdaiAppInstance  childAggrAppInstnce = NULL;
TEST_ASSERT(sdaiGetAggrByIndex (aggregateChild, 
 					0, 
 					sdaiINSTANCE, 
 					&childAggrAppInstnce) != NULL);
TEST_ASSERT(_sdaiGetEntityId(childAggrAppInstnce) == 1249);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);

TEST_ASSERT(sdaiGetAggrByIndex (aggregateChild, 
 					1,
 					sdaiINSTANCE, 
 					&childAggrAppInstnce) != NULL);
TEST_ASSERT(_sdaiGetEntityId(childAggrAppInstnce) == 1251);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

让我们读取另一个名为 "weightsdata" 的二维聚合。示例实例声明包含提取数据的检查值：1.,1。使用 sdaiGetAttrBN 从应用程序实例中提取属性值：

```
SdaiAggr  aggregate2dWeightsData = NULL;

TEST_ASSERT(sdaiGetAttrBN(applicationInstance, 
 				"weightsdata", 
 				sdaiAGGR, 
 				&aggregate2dWeightsData) != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

然后将二维聚合提取到 aggregate2dWeightsData，并从中提取一个子聚合：

```
TEST_ASSERT(sdaiGetAggrByIndex(aggregate2dWeightsData, 
 				      0,
   				      sdaiAGGR, 
                 	              &aggregateChild) != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

如果没有错误，aggregateChild 应该是聚合的有效实例。根据表达式方案，此聚合应该是一个实数值列表，因此我们可以使用 sdaiGetAggrByIndex 从子聚合中提取实数值。为了进行项验证，请检查示例 .ifc 文件中的数据。

```
SdaiReal  childAggrReal = NULL;

TEST_ASSERT(sdaiGetAggrByIndex(aggregateChild, 0, sdaiREAL, &childAggrReal) != NULL);
TEST_ASSERT(OdEqual(childAggrReal, 1.));
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);

TEST_ASSERT(sdaiGetAggrByIndex(aggregateChild, 1, sdaiREAL, &childAggrReal) != NULL);
TEST_ASSERT(OdEqual(childAggrReal, 1.));
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

## 今天就开始行动

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

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