IFC SDK 和 SDAI:使用选择属性

IFC SDK 支持标准数据访问接口 (SDAI),它提供了一个低级 API,用于操作使用 EXPRESS 模式定义的数据。本文介绍了如何使用选择属性。

有关在IFC SDK中通常使用SDAI的详细信息,请参阅本文

选择属性可以包含不同类型的值。为了提供不同类型、不同字节长度的值的存储,使用了属性数据块(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 天。
无风险,无需信用卡。

免费试用