How to acquire real world measurements in forge viewer [2D plan]

你。 提交于 2020-02-06 06:35:29

问题


I have a wall from which I put the coordinates into "Edge" classes. Edge has the properties start and end which represent start and end point of one edge of the wall. Due to this being in forge coordinates, I do not know how long my wall really is. There is a measurement tool which can do this but how do I use it programatically to determine the length of my edges.

Actual Result: Edges in Forge coordinates
Expected Result: Edges in 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
  }

Note: I am not looking to acquire the length property in the propertydb


回答1:


You probably need to apply the viewer.model.getUnitScale() to the length information on the model.

EDIT

getUnitScale returns the scale factor of model's distance unit to meters.

And you should be using model.getInstanceTree().getNodeBox() for the bounding box, in your case, if you pass dbId 1 should return the bounding box of the entire model. As you model is in mm, then you multiply bu .getUnitScale to convert to m.

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

EDIT 2

For 2D sheets you need an extra transformation. For the onLineSegment you can use something like:

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
};


来源:https://stackoverflow.com/questions/51192936/how-to-acquire-real-world-measurements-in-forge-viewer-2d-plan

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!