如何检索Forge Viewer objectTree?

时间:2016-08-11 19:51:36

标签: autodesk-forge autodesk-viewer

我的目标是根据我在revit中创建的行向观众添加新的几何图形来突出显示一个房间,就像他们在这里Link

一样

但我无法弄清楚如何访问这些行ID。 我知道它们在revit(element_id)中是什么,但不知道它们如何映射为dbid。

遵循此Blog Post

我想在我的扩展程序中访问objectTree以查找,但它总是以未定义的形式返回。

var tree;
//old way - viewer is your viewer object - undefined
viewer.getObjectTree(function (objTree) {
 tree = objTree;
});

// 2.5 - undefined

  var instanceTree = viewer.model.getData().instanceTree;
  var rootId = this.rootId = instanceTree.getRootId();

// - undefined

  var objectTree = viewer.getObjectTree();

任何人都可以告诉我它是否仍适用于他们我使用API​​的v2进行rvt转换为svf和2.9的viewer3D.js

注意如果我调用此

,我可以看到dbid列表
var model = viewer.impl.model;
var data = model.getData();
var fragId2dbIdArray = data.fragments.fragId2dbId ;

但无法映射回Revit element_id

2 个答案:

答案 0 :(得分:4)

从版本2.9开始,这仍然有效。这是我的控制台: Console log

以下是您可以尝试的几件事:

  1. viewer未定义吗?抓住viewer
  2. 时,您是否在正确的范围内?
  3. 必须先加载文档,然后才能获取实例树。加载文档后,将触发名为Autodesk.Viewing.GEOMETRY_LOADED_EVENT的事件,然后您就可以开始操作实例树了。
  4. 只需这样做:

    viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
    var instanceTree = viewer.model.getData().instanceTree;
    });
    

    要获得更多结构化代码,请按this guide添加扩展程序。

    要监听的事件有more detailed blog post。不过,它仍然使用旧的方式来获取实例树。

答案 1 :(得分:1)

Shiya Luo是正确的,观众还没有完成加载几何

在我的扩展中加载函数我添加了两个事件监听器并确保它们在尝试访问instanceTree之前都被触发了

 viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
    finishedGEOMETRY_LOADED_EVENT = true;
    if(finishedGEOMETRY_LOADED_EVENT && finishedOBJECT_TREE_CREATED_EVENT ){
        afterModelLoadEvents(viewer);
    }
 });
viewer.addEventListener(Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, function () {
    finishedOBJECT_TREE_CREATED_EVENT = true;
    if(finishedGEOMETRY_LOADED_EVENT && finishedOBJECT_TREE_CREATED_EVENT ){
        afterModelLoadEvents(viewer);           
    }
 });