[返回博客](/cn/blog) # IFC SDK 和 SDAI：使用选择属性

Egor Vorobyov 十一月 12, 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 模式定义的数据。本文介绍了如何使用选择属性。

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

选择属性可以包含不同类型的值。为了提供不同类型、不同字节长度的值的存储，使用了属性数据块（ADB）。

对于此示例，假设.ifc文件中存在一个类似于以下内容的实例（带有一个选择属性值）：

```
// #49 = IFCMEASUREWITHUNIT(IFCRATIOMEASURE(0.0174532925199433), #47);
```

它有一个名为“valuecomponent”的选择属性。使用sdaiGetEntityById读取应用程序实例：

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

要从应用程序实例中读取选择属性，我们使用标准函数sdaiGetAttrBN。但有一个区别：我们应该将已创建的ADB值传递给第四个参数。为此，请使用函数sdaiCreateEmptyADB：

```
SdaiADB adbToGet = sdaiCreateEmptyADB();
  TEST_ASSERT(adbToGet != NULL);
  TEST_ASSERT(sdaiGetAttrBN(applicationInstance, 
 				"valuecomponent", 
 				sdaiADB, 
 				&adbToGet) != NULL);

```

成功获取后，您可以提取ADB中包含的值。从上面的.ifc文件片段可以看出，属性数据块存储的是一个实数值（IFCRATIOMEASURE(0.0174532925199433)），因此您必须将属性值作为实数数据类型值获取：

```

SdaiReal  adbRealValue = .0;
  sdaiGetADBValue(adbToGet, sdaiREAL, &adbRealValue);
  TEST_ASSERT(OdEqual(0.0174532925199433, adbRealValue));

```

根据代码片段，应调用sdaiGetADBValue()函数以从属性数据块中获取值。此函数接受三个参数：

- 属性数据块的句柄。
- 属性数据类型。
- 用于存储请求数据类型值的占位符。

如果成功检索到属性值，sdaiGetADBValue()函数将返回一个原始指针；否则返回NULL值，因此您可以检查ADB操作的结果。

可以存储在属性数据块中的另一种数据类型是路径。此数据表示为字符串数组。我们可以使用sdaiGetADBTypePath获取ADB的路径。此函数有两个参数：一个ADB实例和一个指向SdaiInteger的指针。如果操作成功，函数将返回一个指向SdaiString的指针，作为路径数组的指针，并将返回数组的大小放入第二个参数中；如果操作失败，函数将返回NULL。

```
SdaiInteger collectionSize = 0;
SdaiString* pathCollection = sdaiGetADBTypePath(adbToGet, &collectionSize);

  TEST_ASSERT(collectionSize > 0);
  for (SdaiInteger pathIndex = 0; pathIndex < collectionSize; ++pathIndex)
  {
    TEST_ASSERT(pathCollection[pathIndex] && odStrLenA(pathCollection[pathIndex]) > 0);
  }

```

完成ADB实例的工作后，如果该实例是使用sdaiCreateEmptyADB创建的，请调用sdaiDeleteADB：

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

```

## 今天就开始行动

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

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