IFC SDK は、EXPRESS スキーマで定義されたデータを操作するための低レベル API を提供する標準データアクセスインターフェース (SDAI) をサポートしています。この記事では、セットからアプリケーションデータブロックを読み取る方法について説明します。
IFC SDK での SDAI の一般的な使用方法の詳細については、この記事を参照してください。
IFC モデルに次のインスタンスが含まれていると仮定します。
#94 = IFCUNITASSIGNMENT ((#43,#45,#46,#50,#52,#55,#57,#58,#60,#64,#69,#71,#72, #73,#74,#75,#76,#77,#82,#86,#88,#92));
IfcUnitAssignmentのインスタンスを見ることができます。このインスタンスには、内部に集約を持つフィールドが1つあります。この集約はハンドルIDで埋められています。しかし、式スキームを見ると、これはインスタンスではなく、選択された属性の集約であることがわかります。したがって、これを読み取り、選択されたデータを抽出しましょう。
まず、IDでモデルからアプリケーションインスタンスを取得します。_sdaiGetEntityByIdを使用します。
SdaiAppInstance applicationInstance = _sdaiGetEntityById(model, 94);
TEST_ASSERT(applicationInstance != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
アプリケーションインスタンスから「units」という名前の属性を取得します。集約を確認します — 空であってはなりません。集約インスタンスに対してsdaiGetMemberCount関数を呼び出します。ゼロより大きい値を返すはずです。
SdaiAggr aggregate = NULL;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance, "units", sdaiAGGR, &aggregate) != NULL);
TEST_ASSERT(sdaiGetMemberCount(aggregate) > 0);
イテレータ機能を使用して集約項目にアクセスします: sdaiCreateIterator、sdaiBeginning、sdaiNext。
SdaiIterator aggregateIterator = sdaiCreateIterator(aggregate);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
for (sdaiBeginning(aggregateIterator); sdaiNext(aggregateIterator);)
sdaiCreateEmptyADB を使用して空の ADB インスタンスを作成し、この作成されたインスタンスへのポインタを sdaiGetAggrByIterator に渡します。sdaiGetAggrByIterator は、イテレータインスタンスから ADB データを埋める必要があります。
SdaiADB adbToGet = sdaiCreateEmptyADB();
TEST_ASSERT(sdaiGetAggrByIterator(aggregateIterator, sdaiADB, &adbToGet) != NULL);
この時点で、sdaiGetADBValue を使用して ADB から値を抽出する必要があります。その後、メモリリークを避けるために ADB を破棄する必要があります。
SdaiInstance instanceFromAdb = NULL;
TEST_ASSERT(sdaiGetADBValue(adbToGet, sdaiINSTANCE, &instanceFromAdb) != NULL);
sdaiDeleteADB(adbToGet);
ADB 値を使用せずに集約から ADB 値を取得する簡単な方法があります。sdaiGetAggrByIterator を使用して集約から型付き値を要求でき、集約内の ADB 値の型がパラメータ値の型に変換可能であれば、有効な値が返されます。
SdaiInstance instanceFromAdbSimpleGet = NULL;
TEST_ASSERT(sdaiGetAggrByIterator(aggregateIterator,
sdaiINSTANCE,
&instanceFromAdbSimpleGet) != NULL);
受信した値を確認するには、ADB を使用したときに受信した値と比較します。
TEST_ASSERT(instanceFromAdb == instanceFromAdbSimpleGet);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);