IFC SDKとSDAI: シンプルなデータ型の属性を操作する

IFC SDKは、EXPRESSスキーマで定義されたデータを操作するための低レベルAPIを提供するStandard Data Access Interface (SDAI)をサポートしています。この記事では、単純なデータ型の属性を操作する方法について説明します。

IFC SDKでSDAIを一般的に操作する方法の詳細については、こちらの記事を参照してください。

単純型属性へのアクセス

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

無料で試す