ODA 通用数据访问 (CDA) 是一个平台中立的框架,用于以通用方式访问所有 ODA 支持格式的模型结构和属性信息。由于 CDA 是数据库中立的,它基于 ODA 内核运行时系统 RxProperties 的扩展。
例如,这个由两部分组成的系列文章重点介绍将 CDA 与 BimRv SDK 结合使用。
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();
}
}
本系列的下一篇文章将包含使用 CDA 和 BimRv SDK 的更多示例。