IFC SDK 和 SDAI:使用嵌套聚合属性

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

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

让我们从包含其他聚合属性数组的聚合属性中读取数据。假设 .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 天。
无风险,无需信用卡。

免费试用