如何检索 Forge Viewer objectTree?
How to Retrieve Forge Viewer objectTree?
我的目标是根据我在 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 - 未定义
var instanceTree = viewer.model.getData().instanceTree;
var rootId = this.rootId = instanceTree.getRootId();
//- 未定义
var objectTree = viewer.getObjectTree();
任何人都可以告诉我它是否仍然适用于他们我正在使用 API 的 v2 将 rvt 转换为 svf 和 viewer3D.js
的 2.9
注意,如果我调用它,我可以看到一个 dbid 列表
var model = viewer.impl.model;
var data = model.getData();
var fragId2dbIdArray = data.fragments.fragId2dbId ;
但无法映射回 Revit element_id
从 2.9 版开始,这仍然有效。这是我的控制台:
您可以尝试以下几种方法:
viewer
未定义吗?抓取 viewer
时你在正确的范围内吗?
- 必须加载文档才能获取实例树。加载文档时,将触发一个名为
Autodesk.Viewing.GEOMETRY_LOADED_EVENT
的事件,然后您就可以开始操作实例树了。
只需这样做:
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
var instanceTree = viewer.model.getData().instanceTree;
});
更多结构化代码,请按照this guide添加扩展。
有一个 more detailed blog post 要监听的事件。不过,它仍然使用旧方法来获取实例树。
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);
}
});
我的目标是根据我在 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 - 未定义
var instanceTree = viewer.model.getData().instanceTree;
var rootId = this.rootId = instanceTree.getRootId();
//- 未定义
var objectTree = viewer.getObjectTree();
任何人都可以告诉我它是否仍然适用于他们我正在使用 API 的 v2 将 rvt 转换为 svf 和 viewer3D.js
的 2.9注意,如果我调用它,我可以看到一个 dbid 列表
var model = viewer.impl.model;
var data = model.getData();
var fragId2dbIdArray = data.fragments.fragId2dbId ;
但无法映射回 Revit element_id
从 2.9 版开始,这仍然有效。这是我的控制台:
您可以尝试以下几种方法:
viewer
未定义吗?抓取viewer
时你在正确的范围内吗?- 必须加载文档才能获取实例树。加载文档时,将触发一个名为
Autodesk.Viewing.GEOMETRY_LOADED_EVENT
的事件,然后您就可以开始操作实例树了。
只需这样做:
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
var instanceTree = viewer.model.getData().instanceTree;
});
更多结构化代码,请按照this guide添加扩展。
有一个 more detailed blog post 要监听的事件。不过,它仍然使用旧方法来获取实例树。
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);
}
});