How to acquire real world measurements in forge vi

2019-08-14 14:15发布

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条回答
戒情不戒烟
2楼-- · 2019-08-14 14:37

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
};
查看更多
登录 后发表回答