如何在伪造查看器[2D计划]中获取真实的测量结果

时间:2018-07-05 13:44:16

标签: autodesk-forge

我有一堵墙,将坐标从该墙放入“ Edge”类。 边具有开始和结束属性,它们表示墙的一条边的开始和结束点。由于这是伪造的坐标,所以我不知道我的墙到底有多长。有一个测量工具可以做到这一点,但是我如何以编程方式使用它来确定边缘的长度。

实际结果:伪造坐标中的边
预期结果:边缘在m

  const vertexbuffer = new Autodesk.Viewing.Private.VertexBufferReader(geometry);
  let event = new VertexBufferEvent();
  vertexbuffer.enumGeomsForObject(dbid, event);
  parts.push(new Part(event.getCollection(), dbid));

  /**
   * This event is called when Autodesk.VertexBufferReader finds a line.
   * Line coordinates are saved as an Edge
   * @param x0
   * @param y0
   * @param x1
   * @param y1
   * @param viewport_id
   */
  handle(x0, y0, x1, y1) {
    let start = new Point(x0, y0, 0);
    let end = new Point(x1, y1, 0)
    let edge = new Edge(start, end)
    this.edgeCollection.push(edge);
  }

  onLineSegment(x0, y0, x1, y1, viewport_id) {
    this.handle(x0, y0, x1, y1)
  }

  getCollection() {
    return this.edgeCollection
  }

注意:我不希望在propertydb中获取length属性

1 个答案:

答案 0 :(得分:0)

您可能需要将viewer.model.getUnitScale()应用于模型上的长度信息。

编辑

getUnitScale将模型的距离单位的比例因子返回到米。

对于边界框,应该使用model.getInstanceTree().getNodeBox(),如果您通过dbId 1,则应返回整个模型的边界框。当您在mm中建模时,然后将bu .getUnitScale乘以转换为m

var f = new Float32Array(6)
viewer.model.getInstanceTree().getNodeBox(1, f)

编辑2

对于2D图纸,您需要进行额外的转换。对于onLineSegment,您可以使用类似以下内容的

GeometryCallback.prototype.onLineSegment = function (x1, y1, x2, y2, vpId) {
    var vpXform = this.viewer.model.getPageToModelTransform(vpId);

    var pt1 = new THREE.Vector3().set(x1, y1, 0).applyMatrix4(vpXform);
    var pt2 = new THREE.Vector3().set(x2, y2, 0).applyMatrix4(vpXform);

    var dist = pt1.distanceTo(pt2) * this.viewer.model.getUnitScale();

    console.log(dist); // this should be in meters
};