[ブログに戻る](/ja/blog) # IFC SDKとSDAI: 選択属性の操作

Egor Vorobyov 11月 12, 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を提供するStandard Data Access Interface (SDAI)をサポートしています。この記事では、選択属性の操作方法について説明します。

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

選択属性は、異なる型の値を含むことができます。異なる長さのバイトを持つ異なる型の値を格納するために、属性データブロック (ADB) が使用されます。

この例では、.ifcファイルに次のようなインスタンス (属性選択値を持つ) があると仮定します。

```
// #49 = IFCMEASUREWITHUNIT(IFCRATIOMEASURE(0.0174532925199433), #47);
```

これには「valuecomponent」という名前の選択属性があります。sdaiGetEntityByIdを使用してアプリケーションインスタンスを読み取ります。

```
SdaiAppInstance applicationInstance = _sdaiGetEntityById(model, 49);
TEST_ASSERT(applicationInstance != NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

アプリケーションインスタンスから選択属性を読み取るには、標準関数sdaiGetAttrBNを使用します。ただし、1つの違いがあります。4番目のパラメータには、すでに作成されているADB値を渡す必要があります。これを行うには、関数sdaiCreateEmptyADBを使用します。

```
SdaiADB adbToGet = sdaiCreateEmptyADB();
  TEST_ASSERT(adbToGet != NULL);
  TEST_ASSERT(sdaiGetAttrBN(applicationInstance, 
 				"valuecomponent", 
 				sdaiADB, 
 				&adbToGet) != NULL);

```

正常に取得すると、ADBに含まれる値を抽出できます。上記の.ifcファイルの断片からわかるように、属性データブロックは実数値 (IFCRATIOMEASURE(0.0174532925199433)) を格納しているため、属性値を実数データ型として取得する必要があります。

```

SdaiReal  adbRealValue = .0;
  sdaiGetADBValue(adbToGet, sdaiREAL, &adbRealValue);
  TEST_ASSERT(OdEqual(0.0174532925199433, adbRealValue));

```

コードの断片によると、属性データブロックから値を取得するにはsdaiGetADBValue()関数を呼び出す必要があります。この関数は3つのパラメータを受け入れます。

- 属性データブロックのハンドル。
- 属性データ型。
- 要求されたデータ型の値を格納するためのプレースホルダー。

sdaiGetADBValue()関数は、属性値が正常に取得された場合は属性値への生ポインタを返し、それ以外の場合はNULL値を返すため、ADB操作の結果を確認できます。

属性データブロックに格納できる別のデータ型はパスです。このデータは文字列の配列として表現されます。sdaiGetADBTypePathを使用してADBのパスを取得できます。この関数には、ADBインスタンスとSdaiIntegerへのポインタの2つのパラメータがあります。操作が成功した場合、関数はパスの配列へのポインタとしてSdaiStringへのポインタを返し、2番目のパラメータには返された配列のサイズが格納されます。操作が失敗した場合、関数はNULLを返します。

```
SdaiInteger collectionSize = 0;
SdaiString* pathCollection = sdaiGetADBTypePath(adbToGet, &collectionSize);

  TEST_ASSERT(collectionSize > 0);
  for (SdaiInteger pathIndex = 0; pathIndex < collectionSize; ++pathIndex)
  {
    TEST_ASSERT(pathCollection[pathIndex] && odStrLenA(pathCollection[pathIndex]) > 0);
  }

```

ADBインスタンスの操作が終了したら、sdaiCreateEmptyADBを使用してインスタンスが作成された場合はsdaiDeleteADBを呼び出します。

```
sdaiDeleteADB(adbToGet);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);

```

## 今すぐ始める

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

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