How to Retrieve Forge Viewer objectTree?

丶灬走出姿态 提交于 2019-12-02 05:15:16

问题


My goal is to highlight a room by adding new geometry to the viewer based on lines I have created in revit like they do here Link

but i can not figure out how to access those lines ids. I know what they are in revit (element_id) but not how they are mapped as dbid.

Following this Blog Post

I want to access the objectTree in my extension to find out, but it always comes back as undefined.

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();

Can anyone tell me if its still works for them I am using the v2 of the API for the rvt conversion to svf and 2.9 of the viewer3D.js

note I can see a list of dbid if I call this

var model = viewer.impl.model;
var data = model.getData();
var fragId2dbIdArray = data.fragments.fragId2dbId ;

but have no way of mapping back to the Revit element_id


回答1:


As of version 2.9 this is still working. Here's my console:

Here's a couple of things you can try:

  1. Is viewer undefined? Are you in the correct scope when grabbing the viewer?
  2. The document have to be loaded before you can grab the instance tree. When the document is loaded, an event called Autodesk.Viewing.GEOMETRY_LOADED_EVENT will be fired, then you can start manipulating the instance tree.

Simply do this:

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

For more structured code, follow this guide to add an extension.

There's a more detailed blog post on which event to listen for. It's still using the old way to get instance tree, though.




回答2:


Shiya Luo was correct the viewer had not yet finished loading the geometry

in my extentions Load function I added two event listeners and made sure they both fired before trying to access the 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);           
    }
 });


来源:https://stackoverflow.com/questions/38904993/how-to-retrieve-forge-viewer-objecttree

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!