如何修改Forge Viewer中两个已选中窗户构件的几何属性
Forge Viewer 修改选中构件几何形态操作指南
注:Forge Viewer 加载的是Revit文件转换生成的轻量化SVF/SVF2静态资源,默认仅支持读取,无法直接修改原始Revit构件的参数化属性,以下为两类常用的实现方案:
方案一:调整构件的空间变换(缩放/位移/旋转,不改变几何本身形状)
适合只需要调整构件位置、大小、角度的场景,直接调用Viewer内置的变换方法即可:
// 1. 获取选中构件的dbId数组 const selectedDbIds = viewer.getSelection(); // 输出为 [3043, 3055] // 2. 构造Three.js变换矩阵,Viewer内置Three.js可直接使用 const transformMat = new THREE.Matrix4(); // 示例:将构件放大1.2倍,沿Y轴向上平移500mm(Viewer默认单位为毫米) transformMat.makeScale(1.2, 1.2, 1.2).setPosition(new THREE.Vector3(0, 500, 0)); // 3. 给所有选中构件应用变换 selectedDbIds.forEach(dbId => { viewer.impl.setThemingTransform(dbId, transformMat); }); // 如需重置构件的变换,传入单位矩阵即可 // selectedDbIds.forEach(dbId => viewer.impl.setThemingTransform(dbId, new THREE.Matrix4().identity()))
方案二:替换构件几何(完全修改形态)
如果需要彻底修改窗户的形状,可以隐藏原有构件,在对应位置插入自定义的Three.js几何:
const selectedDbIds = viewer.getSelection(); // 1. 隐藏原始窗户构件 viewer.hide(selectedDbIds); selectedDbIds.forEach(dbId => { // 2. 获取原始构件的世界坐标包围盒,确定自定义几何的放置位置 const fragList = viewer.model.getFragmentList(); const originBbox = new THREE.Box3(); fragList.getWorldBounds(dbId, originBbox); // 3. 创建自定义几何,示例为红色半透明立方体 const customGeo = new THREE.BoxGeometry( originBbox.max.x - originBbox.min.x, originBbox.max.y - originBbox.min.y, originBbox.max.z - originBbox.min.z ); const customMat = new THREE.MeshBasicMaterial({ color: 0xff0000, transparent: true, opacity: 0.7 }); const customMesh = new THREE.Mesh(customGeo, customMat); // 对齐到原始构件的中心位置 customMesh.position.copy(originBbox.getCenter(new THREE.Vector3())); // 4. 将自定义几何添加到Viewer场景中渲染 viewer.impl.scene.add(customMesh); // 刷新Viewer渲染 viewer.impl.invalidate(true, true, true); });
补充说明
如果需要修改原始Revit源文件的构件几何,需要调用云端的设计自动化接口处理源文件,重新转换为轻量化格式后再加载到Viewer中才能生效。
内容的提问来源于stack exchange,提问作者ryu
相关产品推荐
相关产品推荐

