[返回博客](/cn/blog) # 在 ODA SDK 中使用通用数据访问（第 2 部分，共 2 部分）

Sergey Sorvenkov 十月 29, 2020 [\#CDA](/cn/blog/tag/cda) [\#getting started](/cn/blog/tag/getting-started)

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

#### 获取分层信息

本文介绍了如何从通用数据访问树中获取分层信息。有关通用数据访问的概述和要求，请参阅本系列的[第一篇文章](https://www.opendesign.com/blog/2020/august/use-common-data-access-oda-sdks-part-1-2)。

OdRxModelHierarchyTreeBase 类的 createDatabaseHierarchyTree 函数用于构建分层树结构。构建通用数据访问树有三种模式：

- 仅获取基础的树结构（这是最快的）。
- 获取基础的树结构以及一小组属性，这些属性例如用于在树中对对象进行分组和排序。
- 获取完整集合：一个树和所有节点属性的缓存。

```
…
      // pDb - Pointer to the source database object.
      // create_properties_cache - Flag to create cache of properties. Default value is true.
      // class_dependent_hierarchy - Flag to optimize the creation of a hierarchical tree. It can only be set to true if the properties of database objects with a hierarchical attribute are statically dependent on the object type. Default value is false.
      // class_dependent_property - Flag to optimize cache creation. It can be set to true only if all properties of database objects are statically dependent on the object type. Default value is false.
      // Returns a smart pointer to the root node of the hierarchical tree.

    virtual OdRxModelTreeBaseNodePtr createDatabaseHierarchyTree(const OdRxObject* pDb, const bool create_properties_cache = true, 
      const bool class_dependent_hierarchy = false, const bool class_dependent_property = false);

    // pDb - Pointer to the source database object.
    // collected_properties - A pointer to a set of property names that will be added to the cache. If NULL, all properties will be cached.
    // class_dependent_hierarchy - Flag to optimize the creation of a hierarchical tree. It can only be set to true if the properties of database objects with a hierarchical attribute are statically dependent on the object type. Default value is false.
    // class_dependent_property - Flag to optimize cache creation. It can be set to true only if all properties of database objects are statically dependent on the object type. Default value is false.
    // Returns a smart pointer to the root node of the hierarchical tree.

    virtual OdRxModelTreeBaseNodePtr createDatabaseHierarchyTree(const OdRxObject* pDb, const std::set<OdString>* collected_properties, 
      const bool class_dependent_hierarchy = false, const bool class_dependent_property = false);
```

参数 class\_dependent\_hierarchy 和 class\_dependent\_property 用于优化获取分层数据的性能。这些标志仅在以下情况下才能优化方法的性能：

- class\_dependent\_hierarchy 标志 — 如果包含分层属性的属性静态地依赖于对象类型。
- class\_dependent\_property 标志 — 如果对象的所有属性静态地依赖于对象类型。

否则，结果是不可预测的。

下表显示了标志对各种 ODA 产品的适用性。

| | 图纸 | 图纸 (DGN) | IFC | BimNv | BimRv |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 类依赖层次结构 | + | + | + | + | - |
| 类依赖属性 | + | + | - | + | - |

图纸 图纸 (DGN) IFC BimNv BimRv 类依赖层次结构 + + + + - 类依赖属性 + + - + -

以下是获取具有完整属性集的层次结构树的示例：

```
OdRxModelHierarchyTreeBasePtr pHierarchyTreeBase = OdRxModelHierarchyTreeBase::createObject();

OdRxModelTreeBaseNodePtr pTree = pHierarchyTreeBase->createDatabaseHierarchyTree(pDb, true);
```

其中 pTree 是指向基础层次结构树的根节点的指针。

#### OdRxModelTreeBaseNode 对象

通用数据访问树中的每个 OdRxModelTreeBaseNode 对象都包含以下信息：

- 唯一节点标识符 (UniqueID)
- 唯一数据库标识符 (UniqueDatabaseID)

UniqueID 和 UniqueDatabaseID 用于标识树中的节点。例如，UniqueID 在 Visualize 中用于绑定 GiDrawables 节点和通用数据访问。主数据库的唯一标识符 (UniqueDatabaseID) 始终为零。嵌套数据库的唯一标识符是相应数据库对象的地址。当创建通用数据访问树时，如果节点元素位于具有分层属性“Database”的层次结构中，则会填充 UniqueDatabaseID。

重要提示：GiDrawables 和 UniqueDatabaseID 的绑定只能在一个数据库会话期间进行。否则，结果无法保证。

#### PropertyInfo 对象

PropertyInfo 结构包含有关节点属性的信息。每个元素包含以下信息：

- 属性名称
- 本地化属性名称
- UI 放置组
- UI 放置权重
- 属性值
- 子属性数组

创建通用数据访问树时，属性值将根据以下规则填充：

- 如果属性是对 RxObject 的引用并具有 OdRxDisplayAsAttribute，则将 OdRxDisplayAsAttribute 值作为属性值进行分配。
- 如果属性值包含在支持的类型列表中，则分配此属性的相应值。
- 在其他情况下，该值设置为 OdRxValue::toString() 返回的值。

## 今天就开始行动

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

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