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

元宇宙导游
• 阅读 2608

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

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

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
DDD领域驱动
DDD领域驱动领域驱动模型。模型驱动代码接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言而不是数据,重点不同导致编程世界观不同。具体的问题,具体解决,以后遇到相同的问题,这个问题就成了领域DDD是解决复杂中大型软件的一套行之有效方式,在
Wesley13 Wesley13
3年前
Java面试题
91,什么是ORM?        对象关系映射(ObjectRelationalMapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;        简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将
Wesley13 Wesley13
3年前
ERNIE:知识图谱结合BERT才是「有文化」的语言模型
自然语言表征模型最近受到非常多的关注,很多研究者将其视为NLP最重要的研究方向之一。例如在大规模语料库上预训练的BERT,它可以从纯文本中很好地捕捉丰富的语义模式,经过微调后可以持续改善不同NLP任务的性能。因此,我们获取BERT隐藏层表征后,可用于提升自己任务的性能。但是,已有的预训练语言模型很少考虑知识信息,具体而言即知识图谱(ht
Stella981 Stella981
3年前
Python之dict详解
Python字典是另一种可变容器模型(无序),且可存储任意类型对象,如字符串、数字、元组等其他容器模型。本次主要介绍Python中字典(Dict)的详解操作方法,包含创建、访问、删除、其它操作等,需要的朋友可以参考下。字典由键和对应值成对组成。字典也被称作关联数组或哈希表。基本语法如下:1.创建字典1234567\
Stella981 Stella981
3年前
Django自定义User模型、认证、权限控制
Django自带强大的User系统,为我们提供用户认证、权限、组等一系列功能,可以快速建立一个完整的后台功能。但User模型并不能满足我们的需求,例如自带的User表中没有手机号码,而且对于国人来说表中的first\_name和last\_name并没有什么卵用,对于实际生产中灵活的用户表来说重写User模型是非常有必要的。扩展User模型
Wesley13 Wesley13
3年前
Java多线程之内存可见性
Java多线程之内存可见性一、Java内存模型介绍什么是JMM?Java内存模型(JavaMemoryModel)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的细节所有的变量都存储在主内存中每个线程都
Wesley13 Wesley13
3年前
JAVA内存模型与线程以及volatile理解
Java内存模型是围绕在并发过程中如何处理原子性、可见性、有序性来建立的。一、主内存与工作内存  Java内存模型主要目标是在虚拟机中将变量存储到内存和从内存中取出变量。这里的变量包括:实例字段、静态字段、构成数组对象的元素;不包括局部变量和方法参数,因为它们是线程私有的。Java内存模型规定了所有变量都存储在主内存,线程的工作内
Wesley13 Wesley13
3年前
Java线程安全总结
浅谈java内存模型 不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内
待兔 待兔
11个月前
Java内存的可见性
Java内存的可见性可见性:一个线程对共享变量的修改,能够及时被其它线程看到共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量Java内存模型(JMM):描述了Java程序中各种线程共享变量的访问规则,以及在JVM