如何让APS Viewer中的自定义几何模型支持点击交互?
实现方向与实操步骤
一、正确注入自定义Three.js几何
Viewer的交互和数据系统不认原生Three.js网格,得按它的规则来:
- 用Three.js建好几何体、材质后,调用
viewer.impl.createMesh(geometry, material)生成Viewer能识别的网格对象,这个对象会被Viewer内部系统追踪。 - 给自定义几何分配唯一
dbId:从现有模型的最大dbId(比如viewer.model.getData().instanceTree.maxId + 1)开始往上加,别和原生模型的ID冲突。 - 把网格加到Viewer的叠加层里:用
viewer.impl.addOverlay('custom-geo-layer', mesh),这样不会和原生模型的渲染、拾取逻辑打架。
二、实现和原生模型一样的交互
要让自定义几何能被选、高亮、拾取,得把它纳入Viewer的交互系统:
- 处理拾取逻辑:Viewer的拾取器靠
dbId识别元素,你可以加个选择监听器viewer.impl.addSelectionListener,在回调里判断鼠标是否命中自定义几何,命中的话就手动触发选择逻辑。 - 高亮效果:直接用
viewer.impl.highlightObject(mesh, true)高亮,取消就传false。 - 同步选择状态:选中自定义几何时,调用
viewer.select([你的自定义dbId]),这样Viewer的其他组件(比如属性面板)会认为这是个正常选中的元素。
三、把自定义几何纳入控制台组件(比如数据网格)
数据网格之类的组件依赖Viewer的属性系统,得给自定义几何造一套虚拟属性数据:
- 先定义属性:给你的自定义
dbId准备好属性键值对,比如{ id: 自定义dbId, properties: [{ displayName: "几何类型", displayValue: "自定义支架" }, { displayName: "尺寸", displayValue: "100x200mm" }] }。 - 扩展属性面板:写个Viewer扩展,监听属性面板的加载事件,当选中自定义几何时,把你定义的属性塞到面板里。
- 适配数据网格:如果用APS的Data Grid,把自定义几何的属性转成组件要求的格式(得包含
dbId、name、properties这些字段),然后通过组件的数据源接口传进去;或者扩展Viewer的model.getData().properties方法,让数据网格能读到自定义几何的属性。
四、踩坑提醒
- 别乱改Viewer私有API:虽然有些功能要用到
viewer.impl下面的方法,但尽量用官方的扩展机制,不然Viewer版本一更新就崩。 - 性能要注意:自定义几何多的话,要复用材质和几何体,别每次都新建,不然卡得要死。
- 版本兼容:不同Viewer版本的内部逻辑可能变,要对照官方文档调整。
内容的提问来源于stack exchange,提问作者Santiago Diaz
相关产品推荐
相关产品推荐

