[ブログに戻る](/ja/blog) # IFC SDK と SDAI: セットからアプリケーションデータブロックを読み取る

Egor Vorobyov 12月 17, 2020 [\#ifc](/ja/blog/tag/ifc) [\#getting started](/ja/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

IFC SDK は、EXPRESS スキーマで定義されたデータを操作するための低レベル API を提供する標準データアクセスインターフェース (SDAI) をサポートしています。この記事では、セットからアプリケーションデータブロックを読み取る方法について説明します。

IFC SDK での SDAI の一般的な使用方法の詳細については、[この記事](https://www.opendesign.com/blog/2020/october/working-standard-data-access-interface-oda-ifc-sdk)を参照してください。

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

[無料で試す](https://www.opendesign.com/ja/free-trial)
