[ブログに戻る](/ja/blog) # IFC SDKとSDAI: シンプルなデータ型の属性を操作する

Egor Vorobyov 10月 22, 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)を参照してください。

#### 単純型属性へのアクセス

SDAIにはいくつかの単純型があります: sdaiINTEGER、sdaiREAL、sdaiNUMBER、sdaiBOOLEAN、sdaiLOGICAL、sdaiSTRING、sdaiINSTANCE。

この例では、アプリケーションインスタンス #5 からこれらの属性の1つを読み取ります。

```
//#5 = IFCAPPLICATION(#1, '2019', 'Autodesk Revit 2019 (ENU)', 'Revit');
```

まず、sdaiGetEntityById を使用してアプリケーションインスタンスを取得します。次に、sdaiGetAttrBN を呼び出してインスタンスから属性を取得します。sdaiGetAttrBN には4つのパラメータがあります。

- インスタンス
- 属性名
- クエリされたパラメータの型
- 属性から値をコピーするパラメータへのポインタ

関数は、成功した場合は4番目のパラメータへのポインタを返し、それ以外の場合はnullを返します。

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

次に、パラメータを読み取るために3回試行します。

最初の試行では、「applicationdeveloper」という名前のパラメータを正常に取得します。ハンドル #1 のアプリケーションインスタンスを受け取りました。では、受信したデータを確認しましょう。\_sdaiGetEntityById を使用してアプリケーションインスタンスからIDを取得します。これは1と等しいはずです。

```
SdaiAppInstance developer = NULL;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance, 
 				"applicationdeveloper", 
 				sdaiINSTANCE, 
 				&developer) != NULL);
TEST_ASSERT(developer != NULL);
TEST_ASSERT(developer == _sdaiGetEntityById(model, 1));
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

2回目の試行では、「version」という名前の属性から文字列値を取得します。これも属性値を正常に読み取るはずです。有効なデータを読み取ったことを確認するために、「2019」と比較します。

```
SdaiString version = NULL;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance, "version", sdaiSTRING, &version) != NULL);
TEST_ASSERT(odStrCmpA(version, "2019") == 0);
TEST_ASSERT(sdaiErrorQuery() == sdaiNO_ERR);
```

3回目の試行では、「version」という名前の属性から整数値を取得しようとします。互換性のない型 sdaiINTEGER を要求したため、操作は失敗します。この場合、sdaiGetAttrBN は NULL を返します。sdaiErrorQuery を呼び出して最後のエラーを取得し、エラー状態をリセットします。エラーコードはFIFOルールを使用してエラークエリで収集されます。各 sdaiErrorQuery の呼び出しは、エラーキューから最後のエラー状態を削除します。

```
SdaiInteger wrongAttrType = -1;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance, "version", sdaiINTEGER, &wrongAttrType) == NULL);
TEST_ASSERT(sdaiErrorQuery() == sdaiVT_NVLD);
```

もう1つの単純型は列挙型です。SDAIは、アプリケーションインスタンスから列挙値を取得することもサポートしています。

たとえば、.ifc ファイルのDATAセクションに次のエントリが含まれているとします。

```
// #43= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
```

ドット内の文字列値は列挙値です。次に、値の1つを読み取ります。まず、\_sdaiGetEntityById を使用してモデルからインスタンスを取得します。

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

次に、アプリケーションインスタンスに型付き属性を返すように要求します。列挙型には独自の typedef があります。

```
/* enumeration data type: */
typedef char *SdaiEnum;
```

ご覧のとおり、その値は文字列値を表します。この型の変数を宣言し、この値へのポインタを sdaiGetAttrBN の4番目のパラメータとして渡します。操作が成功した場合、このパラメータを取得してサンプルファイルの値と比較します。

```
SdaiEnum enumValue = NULL;
TEST_ASSERT(sdaiGetAttrBN(applicationInstance, 
  				"prefix", 
 				sdaiENUM, 
   				&enumValue) != NULL);
TEST_ASSERT(!odStrCmpA(enumValue, "MILLI"));
```

## 今すぐ始める

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

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