在Forge viewer多模型聚合的场景中,Viewer的代码库没有很好的考虑多模型,所以有几个常见的功能并不能达到预想的目的,例如假设选中模型中的对象(不同模型都选中一些),然后操作它们的可见性或者透明化其它构件。本文尝试用了点方式来暂时解决这个问题。
修正以前的描述:VisibilityManager的isolate方法,在多模型的状态下,MultiModelVisibilityManager的isolate可以传入操作哪个模型,但如果是不同构件的模型,结果是一次只能isolate某个模型的构件,而不是任何模型的任何构件都可以同时isolate。
而新版的右键菜单是可以达到效果的,借鉴其在Autodesk.Viewing.Extensions.ViewObjectContextMenu.prototype.buildMenu的代码片段,可以这样操作:
//获取当前选择到的构件 sels = NOP_VIEWER.getAggregateSelection() //以次遍历构件,注意,这里是获得每个model对应的visibilityManager sels.forEach(function(singleRef) { singleRef.model.visibilityManager.isolate(singleRef.selection) } );
以下方法是撰写本文最开始的个人研究,并不推荐,仅供参考:
首先,在你自己代码的适当位置,重载一个方法,设置model:
Autodesk.Viewing.Private.VisibilityManager.prototype.setCurrentModel = function(model) { this.model = model; }
假设你已经得到需要isolate的构件id(比如利用AggregateSelectionChanged事件),这些id可能是分属于不同的model,这个信息通过AggregateSelectionChanged是可以拿到的。在本文的测试中,它们分别是:
{
dbid:2181
model:model1
}
{
dbid:7557
model:model2
}
在代码适当位置,新建VisibilityManager的实例,以model1初始化。因为Viewer默认创建的那个实例 (NOP_VIEWER.impl.visibilityManager) 并不知道前面重载的方法
var vm = new Autodesk.Viewing.Private.VisibilityManager(MyViewer.impl,model1);
当需要操作isolate的时候,轮流切换vm的模型,例如:
//新建visibilityManager的实例 var vm = new Autodesk.Viewing.Private.VisibilityManager(NOP_VIEWER.impl,model1); //切换到模型1 vm.setCurrentModel(model1) //isolate模型1中的构件 vm.isolate(2181) //切换到模型2 vm.setCurrentModel(model2) //isolate模型2中的构件 vm.isolate(7557)
还需要考虑恢复场景,这个原理也类似,循环一下模型,不用调用showAll,直接isolate为空即可:
//新建visibilityManager的实例 var vm = new Autodesk.Viewing.Private.VisibilityManager(MyViewer.impl,model1); //切换到模型1 vm.setCurrentModel(model1) //isolate为空 vm.isolate('') //切换到模型2 vm.setCurrentModel(model2) //isolate为空 vm.isolate('')
不用每次都新建vm,可以在适当位置有个全局变量,本文只是为了方便演示。