多模型聚合后,操作构件的可见性或透明化其它构件

前端之家收集整理的这篇文章主要介绍了多模型聚合后,操作构件的可见性或透明化其它构件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在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,可以在适当位置有个全局变量,本文只是为了方便演示。

猜你在找的设计模式相关文章