IFC SDK と SDAI: セットからアプリケーションデータブロックを読み取る

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

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す