ADN Open CIS
Сообщество программистов Autodesk в СНГ

31/01/2021

Forge Viewer: Поворот листов

Повернуть лист в Forge Viewer достаточно просто. Вы можете это сделать до или после загрузки листа во Viewer:

До загрузки:

Код - JavaScript: [Выделить]
  1. var mx = new THREE.Matrix4();
  2. mx.makeRotationZ(90 * Math.PI / 180);
  3. viewer.loadModel("TestSheet.pdf", {page: 1, placementTransform: mx});

После загрузки:

Код - JavaScript: [Выделить]
  1. viewer.loadModel("TestSheet.pdf", {page: 1}, (model) => {
  2.   var mx = new THREE.Matrix4();
  3.   mx.makeRotationZ(90 * Math.PI / 180);
  4.   model.setPlacementTransform(mx);
  5. });

Однако, если Вы хотите загрузить несколько листов (один вертикально, другой горизонтально), повернуть один из них и, например, выровнять их, чтобы можно было сравнить их с помощью расширения PixelCompare

Мы уже рассказывали о разнице между PdfLoader и LeafletLoader (см. перевод на нашем сайте). Эти загрузчики по-разному работают с размерами и позиционированием листов.

Допустим, мы хотим повернуть вертикальную страницу, сделав её горизонтальной, повернув на +90º (PI/2 радиан).

В случае использования PdfLoader, нижний левый угол листа всегда находится в начале координат (0, 0), его ширина откладывается по оcи X, а высота - по оси Y в координатах самого листа.

Поворот всегда осуществляется вокруг начала координат, но матрица так же может содержать смещение до нужной нам позиции.

После поворота, новый левый нижний угол будет находиться в координатах (-y, 0), поэтому нам нужно добавить вектор смещения (y, 0) к матрице преобразования для того, чтобы сместить левый нижний угол в начало координат (0, 0)

Код - JavaScript: [Выделить]
  1. viewer.loadModel("TestSheet.pdf", {}, (model) => {
  2.   var bb = model.getBoundingBox();
  3.   var mx = new THREE.Matrix4();
  4.   mx.makeRotationZ(90 * Math.PI / 180);
  5.   // translation along X axis
  6.   mx.elements[12] = bb.max.y;
  7.   model.setPlacementTransform(mx);
  8. });

В случае использования LeafletLoader, верхний левый угол листа всегда находится в (0, 1), его ширина откладывается по оси X, а высота - всегда 1 по оси Y.

После поворота новый верхний угол будет в (-1, x), поэтому добавим вектор смещений (1, 1-x) к нашей матрице чтобы переместить угол листа обратно в позицию (0, 1)

Код - JavaScript: [Выделить]
  1. viewer.loadModel("TestSheet.pdf", {}, (model) => {
  2.   var bb = model.getBoundingBox();
  3.   var mx = new THREE.Matrix4();
  4.   mx.makeRotationZ(90 * Math.PI / 180);
  5.   // translation along X and Y axes
  6.   mx.elements[12] = 1;
  7.   mx.elements[13] = 1 - bb.max.x;
  8.   model.setPlacementTransform(mx);
  9. });

Источник: https://forge.autodesk.com/blog/rotate-sheets-viewer

Автор перевода: Александр Игнатович
Опубликовано 31.01.2021