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