[返回博客](/cn/blog) # 将通用数据访问与 BimRv SDK 结合使用（第 1 部分，共 2 部分）

Ilya Kovaldov 十一月 28, 2019 [\#rfa](/cn/blog/tag/rfa) [\#rvt](/cn/blog/tag/rvt) [\#CDA](/cn/blog/tag/cda)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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()-&gt;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 的更多示例。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
