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