将通用数据访问与 BimRv SDK 结合使用(第 1 部分,共 2 部分)

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 的更多示例。

今天就开始行动

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

免费试用