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);