Как получить измерения в реальном мире в кузнечной программе [2D план] - PullRequest
0 голосов
/ 05 июля 2018

У меня есть стена, из которой я помещаю координаты в классы "Край". Край имеет свойства начала и конца, которые представляют начальную и конечную точку одного края стены. Из-за того, что это находится в кузнечных координатах, я не знаю, насколько длинна моя стена на самом деле. Существует инструмент измерения, который может это сделать, но как мне использовать его программно для определения длины моих ребер.

Фактический результат: края в координатах кузницы
Ожидаемый результат: края в м

  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
  }

Примечание: я не собираюсь приобретать свойство length в свойстве db

1 Ответ

0 голосов
/ 05 июля 2018

Возможно, вам нужно применить viewer.model.getUnitScale() к информации о длине модели.

EDIT

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