Как преобразовать координаты зрителя обратно в координаты CAD? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь преобразовать координаты зрителя (сцены) обратно в исходные координаты САПР.Я видел, как люди упоминали о глобальном смещении, но всякий раз, когда я пытаюсь получить это, я получаю неопределенное значение.Я предположил, что это означает, что нет смещения.Но когда я сравниваю две координаты, одну в средстве просмотра и одну в САПР, они определенно не равны.Я наткнулся на функцию NOP_VIEWER.model.getUnitScale();однако это число, по-видимому, ничего не значило при применении его к координатам.

При этом, как я могу преобразовать обратно в координаты CAD из координат средства просмотра?

1 Ответ

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

globalOffset для 3D-модели, как мне кажется, вы можете применить PageToModelTransform к точкам просмотра, чтобы преобразовать их обратно в САПР.Следующий фрагмент кода извлечен из демонстрации под названием viewer-dwgoffset , написанной нашим коллегой.

Его ключевой концепцией является использование VertexBufferReader для чтения вершин 2D-модели Forge Viewer иполучить соответствующую матрицу преобразования для проецирования точек Viewer обратно в систему координат DWG.

function GeometryCallback(viewer) {
    this.viewer = viewer;
}

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

    console.log('Line segment vertices in CAD coordinate system', {
        pointX1: pt1.x,
        pointY1: pt1.y,
        pointX2: pt2.x,
        pointY2: pt2.y
    });
}

GeometryCallback.prototype.onCircularArc = function(cx, cy, start, end, radius, vpId) {
};

GeometryCallback.prototype.onEllipticalArc = function(cx, cy, start, end, major, minor, tilt, vpId) {

};

var it = viewer.model.getData().instanceTree;
it.enumNodeFragments( dbId, function( fragId ) {
    var m = viewer.impl.getRenderProxy(viewer.model, fragId);
    var vbr = new Autodesk.Viewing.Private.VertexBufferReader(m.geometry, viewer.impl.use2dInstancing);
    vbr.enumGeomsForObject(dbId, new GeometryCallback());
});

Надеюсь, это поможет.

...