IFC SDKとSDAI: ネストされた集約属性を操作する

IFC SDKは、EXPRESSスキーマで定義されたデータを操作するための低レベルAPIを提供するStandard Data Access Interface (SDAI)をサポートしています。この記事では、ネストされた集約属性を操作する方法について説明します。

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」という名前の属性を持つ別の2D集約を読み込んでみましょう。サンプルインスタンス宣言には、抽出されたデータのチェック値が含まれています: 1.,1. sdaiGetAttrBN を使用して、アプリケーションインスタンスから属性値を抽出します。

SdaiAggr  aggregate2dWeightsData = NULL;

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

次に、2D集約を 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日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す