Извините, я не получил никаких ответов от нашей команды инженеров.Кажется, что нет другого способа получить viewportId
текущего 2d-представления, и здесь может возникнуть проблема с плавающей точностью, это проблема, о которой я упоминал выше.Я буду продолжать просить их.Итак, вот как я нашел способ сделать точечное преобразование из системы координат DWG в средства просмотра.
Получить текущий идентификатор окна просмотра через VertexBufferReader
, но вы должны указать 2d элемент(dbId
) в загруженном виде для чтения viewportId
из него.
var viewportId = null;
function GeometryCallback(viewer) {
this.viewer = viewer;
}
GeometryCallback.prototype.onLineSegment = function(x1, y1, x2, y2, vpId) {
viewportId = vpId;
}
var fragId = 0;
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());
Проецируйте точку DWG обратно в систему координат Viewer.
var vpXform = viewer.model.getPageToModelTransform(viewportId).clone();
var invVpXform = new WGS.LmvMatrix4(true);
invVpXform.getInverse(vpXform, true);
var ptInCadX = ...;
var ptInCadY = ...;
var verticesInViewer = new THREE.Vector3().set(ptInCadX, ptInCadY, 0).applyMatrix4(invVpXform);
Надеюсь, это поможет.