IFC SDKは、EXPRESSスキーマで定義されたデータを操作するための低レベルAPIを提供する標準データアクセスインターフェース (SDAI) をサポートしています。この記事では、集約属性、特にアプリケーションインスタンスのリストを操作する方法について説明します。
IFC SDKでSDAIを一般的に操作する方法の詳細については、この記事を参照してください。
集約属性を持つアプリケーションインスタンスとは、各属性が別のインスタンスへのハンドルで表現される場合を指します。例えば、ポリラインオブジェクトは、ポリラインの経路を定義する点の集合です。ポリラインは、.ifcファイルに次のように保存できます。
#173= IFCCARTESIANPOINT((-2232.66666666677,-11000.));
#175= IFCCARTESIANPOINT((3767.33333333345,-11000.));
#177= IFCCARTESIANPOINT((3767.33333333345,7000.));
#179= IFCCARTESIANPOINT((-1534.66666666668,7000.));
#181= IFCCARTESIANPOINT((-1534.66666666668,4000.));
#183= IFCCARTESIANPOINT((-2232.66666666677,4000.));
#185= IFCPOLYLINE((#173,#175,#177,#179,#181,#183,#173));
ここでは、アプリケーションインスタンス(#185)の属性への標準的なアクセス方法を見ることができます。属性から集約インスタンスを抽出するために、sdaiAGGR型を使用します。
SdaiAppInstance applicationInstance = _sdaiGetEntityById(model, 185);
TEST_ASSERT(applicationInstance != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
SdaiAggr aggregate = NULL;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance,
"points",
sdaiAGGR,
&aggregate) != NULL);
インデックスを介して集約属性項目を取得するには、sdaiGetAggrByIndex() 関数を使用します。この関数は4つのパラメータを受け入れます。
- 必要な属性を含む集約インスタンス。
- 取得する属性のインデックス値。
- 要求された属性のデータ型。
- 属性値への生ポインタ。
この関数は、4番目の出力パラメータに格納されている属性値への生ポインタを返します。
まず、読み取る集約属性ハンドルを含む配列を作成します。
const SdaiInteger checkHandleData[] = { 173, 175, 177, 179, 181, 183, 173 };
const SdaiInteger checkHandleDataLength = sizeof(checkHandleData) /
sizeof(checkHandleData[0]);
sdaiGetMemberCount() 関数を呼び出して、集約属性の数を取得します。この関数によって返される値は、属性を反復処理するために使用されるサイクルの境界として使用されます。
const SdaiInteger indexUpperBound = sdaiGetMemberCount(aggregate);
for (SdaiInteger instanceIndex = 0; instanceIndex < indexUpperBound; ++instanceIndex)
{
SdaiAppInstance instanceFromAggrIndex = NULL;
TEST_ASSERT(sdaiGetAggrByIndex(aggregate,
instanceIndex,
sdaiINSTANCE,
&instanceFromAggrIndex) != NULL);
if (instanceIndex >= checkHandleDataLength){ break; }
TEST_ASSERT(_sdaiGetEntityId(instanceFromAggrIndex) ==
checkHandleData[instanceIndex]);
}
集約属性を取得する別の方法は、イテレータオブジェクトを使用して属性へのシーケンシャルアクセスを取得することです。イテレータを取得するには、sdaiCreateIterator() 関数を使用します。属性コレクションとの対話には、次の関数を使用します。
- 属性コレクションの先頭に移動するための sdaiBeginning()。
- 次の属性項目に移動するための sdaiNext()。
- 属性値を取得するための sdaiGetAggrByIterator()。
SdaiIterator aggregateIterator = sdaiCreateIterator(aggregate);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
SdaiInteger iterationCounter = 0;
for (sdaiBeginning(aggregateIterator); sdaiNext(aggregateIterator);)
{
SdaiAppInstance instanceFromIterator = NULL;
TEST_ASSERT(sdaiGetAggrByIterator(aggregateIterator,
sdaiINSTANCE,
&instanceFromIterator) != NULL);
if (iterationCounter >= checkHandleDataLength) { break; }
TEST_ASSERT(_sdaiGetEntityId(instanceFromIterator) ==
checkHandleData[iterationCounter]);
++iterationCounter;
}
メモリリークを避けるために、作成したイテレータを破棄します。
sdaiDeleteADB(adbToGet);