IFC SDKとSDAI: 選択属性の操作

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

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

選択属性は、異なる型の値を含むことができます。異なる長さのバイトを持つ異なる型の値を格納するために、属性データブロック (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日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す