根据Revit坐标(X、Y、Z的最小值和最大值)从锻造查看器中裁剪特定的房间/区域



我们在web应用程序中使用forge查看器(v7(。

我们的要求是从锻造查看器中裁剪特定的房间/区域。例如,如果我们在锻造查看器中显示了一个房屋模型,那么如果用户(从菜单或导航栏(选择了一个厨房,则查看器应该只显示厨房区域(包括橱柜、燃烧器、冰箱、水槽等所有对象(,而所有其他对象/部分都应该隐藏。同样适用于卧室、浴室等。它将仅用于运行时的查看目的,而不用于任何自动化。

我们使用forge API(使用Revit引擎(在以下帮助下获取房间坐标(最小和最大X、Y、Z(。

GeometryElement geoElement = room.ClosedShell;
BoundingBoxXYZ boundingBox = geoElement.GetBoundingBox();
XYZ min = boundingBox.Min;
XYZ max = boundingBox.Max;

我们使用viewer.setCutPlanes函数在viewer中绘制剖面。

var minPt = new THREE.Vector3(x,y,z); //!<<< put your point here
var maxPt = new THREE.Vector3(x,y,z); //!<<< put your point here
const normals = [
new THREE.Vector3(1, 0, 0),
new THREE.Vector3(0, 1, 0),
new THREE.Vector3(0, 0, 1),
new THREE.Vector3(-1, 0, 0),
new THREE.Vector3(0, -1, 0),
new THREE.Vector3(0, 0, -1)
];
const bbox = new THREE.Box3(minPt, maxPt);
const cutPlanes = [];
for (let i = 0; i < normals.length; i++) {
const plane = new THREE.Plane(normals[i], -1 * maxPt.dot(normals[i]));
// offset plane with negative normal to form an octant
if (i > 2) {
const ptMax = plane.orthoPoint(bbox.max);
const ptMin = plane.orthoPoint(bbox.min);
const size = new THREE.Vector3().subVectors(ptMax, ptMin);
plane.constant -= size.length();
}
const n = new THREE.Vector4(plane.normal.x, plane.normal.y, plane.normal.z, plane.constant);
cutPlanes.push(n);
}
viewer.setCutPlanes(cutPlanes);

但是,当我们将这些坐标(为API获得(传递到此前端JS代码时,剪切平面会在错误的位置/点处创建。例如,当我们通过厨房的坐标时,它会裁剪屋顶的一小部分,并与所有其他房间相同。

可能的原因是Revit&伪造查看器坐标不相同。

有人知道如何使用forge查看器映射这些Revit坐标并绘制剖切面吗?

如果您按照Forge Viewer教程加载模型,那么您需要从房间边界框的端点减去全局偏移,如下所示:

var minPt = new THREE.Vector3(x,y,z); //!<<< put your point here
var maxPt = new THREE.Vector3(x,y,z); //!<<< put your point here
var offsetMatrix = viewer.model.getData().placementWithOffset;
var offsetMinPt = minPt.applyMatrix4(offsetMatrix); 
var offsetMaxPt = maxPt.applyMatrix4(offsetMatrix);

我有另一个解决方案。手动修改模型,如剖切面、隐藏、隔离图元以检索要显示的视图。然后使用方法var data = viewer.getState()并将该数据存储到数据库中。然后使用viewer.restoreState(data)回忆您的视图。

最新更新