ODA共通データアクセス (CDA) は、すべてのODAサポート形式でモデル構造とプロパティ情報に共通の方法でアクセスするためのプラットフォームに依存しないフレームワークです。CDAはデータベースに依存しないため、ODAカーネルランタイムシステムRxPropertiesの拡張に基づいています。
例として、この2部構成のシリーズでは、BimRv SDKでのCDAの使用に焦点を当てています。
TB_CDAPropertiesには、BimRv SDK用のCDA実装が含まれています。BimRv用のCDAは、プロジェクト内のパラメータをラップするものであり、ツリーのIFCバージョンに近いデータベース構造の特別な表現です。
TB_CDAPropertiesモジュールは次のことを行います。
- RxProperties Facet Providerメカニズムを介してBmElementsパラメータへのアクセスを提供します。
- BimRvデータベースの階層ツリーの形成に必要な属性 (HierarchyLevel、DisplayAs、OdaUniqueID) でオブジェクトプロパティのリストを補完します。
- 階層ツリーに必要なノードを形成するための動的オブジェクトを作成し、必要なプロパティと属性でそれらを埋めます。
単一要素の例
必要なヘッダーを含めます。
#include "RxValue.h"
#include "RxMember.h"
#include "RxAttribute.h"
#include "RxProperty.h"
必要なモジュールをロードします。
::odrxDynamicLinker()->loadModule(L"RxProperties");
::odrxDynamicLinker()->loadModule(L"TB_CDAProperties");
特定のBmElementオブジェクトのプロパティをリストするには、OdRxMemberQueryEngine::theEngine()->newMemberIterator() を呼び出して、オブジェクトのイテレータを取得します。次の例は、イテレータとプロパティ名を取得する方法を示しています。
OdBmDatabasePtr m_pDatabase;
OdUInt64 handle;
OdBmObjectPtr pDbObject;
OdRxMemberIteratorPtr pIter;
// some code to get necessary BmElement handle
OdBmObjectId dbObjectId = m_pDatabase->getObjectId(OdDbHandle(handle));
if (!dbObjectId.isNull())
{
pDbObject = dbObjectId.safeOpenObject();
pIter = OdRxMemberQueryEngine::theEngine()->newMemberIterator(pDbObject.get());
while (!pIter->done())
{
OdString strPropName = pIter->current()->name();
pIter->next();
}
}
OdRxMemberQueryEngine::find() 関数を使用して、既知のプロパティをその名前で検索することもできます。次の例は、BmElementの「Family」プロパティを見つけてその値を取得する方法を示しています。
OdRxPropertyPtr pProperty = OdRxMemberQueryEngine::theEngine()->find(pDbObject.get(), L"Family");
if (!pProperty.isNull())
{
OdRxValue value;
pProperty->getValue(pDbObject.get(), value);
OdString strFamilyName = *rxvalue_cast<OdString>(&value);
}
OdRxValueは汎用バリアント型です。対応するメタクラスが宣言されていれば、任意のC++型を含めることができます。バリアント型システムに関する詳細については、次のヘッダーファイルを参照してください。
- Kernel\Include\RxValueType.h
- Kernel\Include\RxValueTypeUtil.h
次の例は、プロパティの属性から追加情報を取得し、DisplayAs属性値を取得する方法を示しています。
const OdRxAttributeCollection& attributes = pProperty->attributes();
for (int i = 0; i < attributes.count(); i++)
{
OdRxValue value;
const OdRxAttribute* pAttribute = attributes.getAt(i);
if (NULL != pAttribute->isA() && pAttribute->isKindOf(OdRxDisplayAsAttribute::desc()))
((OdRxDisplayAsAttribute *)pAttribute)->getDisplayValue(value);
}
プロパティを使用するためのコレクション型も存在します。例えば、階層データベースツリーの作成を提供するためです。次の例は、コレクションプロパティを操作する方法を示しています。
if (pIter->current()->isKindOf(OdRxCollectionProperty::desc()))
{
OdRxCollectionPropertyPtr pPropertyCollection(pIter->current());
OdRxValueIteratorPtr pPrIt = pPropertyCollection->newValueIterator(pDbObject);
while (!pPrIt->done())
{
OdRxValue value = pPrIt->current();
pPrIt->next();
}
}
このシリーズの次の記事では、BimRv SDKでCDAを使用する追加の例が含まれます。