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

28/03/2019

Добавляем SVG в 2D виды в Forge Viewer

Предположим, у Вас есть логотип

SVG для этой картинки выглядит примерно так:

Код - HTML: [Выделить]
  1. <?xml version="1.0" standalone="no"?>
  2. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" >
  3.   <rect x="0" y="0" width="210" height="210" stroke="black" fill="transparent" stroke-width="5"/>
  4.   <rect x="60" y="10" rx="10" ry="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
  5.   <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
  6.   <ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>
  7.  
  8.   <line x1="10" x2="50" y1="110" y2="150" stroke="orange" stroke-width="5"/>
  9.   <polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145"
  10.       stroke="orange" fill="transparent" stroke-width="5"/>
  11.  
  12.   <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180"
  13.       stroke="green" fill="transparent" stroke-width="5"/>
  14.  
  15.   <path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
  16. </svg>

Мы хотим разместить этот логотип на 2D-листе в нижнем правом углу:

Чтобы достичь этого, нам нужно немножко поменять разметку в SVG. Нам нужно убрать параметры стилей (они будут проигнорированы) и обернуть код SVG в тег <g> (группа в SVG-разметке):

Код - HTML: [Выделить]
  1. <g transform="translate(3024 2160) scale(-2 -2)">

Это позволяет позиционировать и масштабировать logo. Чтобы разместить его в нижнем углу, мне нужны границы листа, я получаю их из самого Forge Viewer-а:

Код - JavaScript: [Выделить]
  1. var bounds = viewer.impl.model.getData().bbox.max;

Если вывести их в консоль или отладчик, мы увидим:

Код - HTML: [Выделить]
  1. > Z.Vector3 {x: 3024, y: 2160, z: 0}

Расширение markup extension нативно обрабатывает векторную графику SVG, поэтому, давайте добавим наш SVG в слой 'LogoLayer' с помощью следующего кода:

Код - JavaScript: [Выделить]
  1. var markup = viewer.getExtension("Autodesk.Viewing.MarkupsCore");
  2. markup.enterEditMode();
  3. markup.leaveEditMode();
  4. markup.loadMarkups(_markupdata, 'LogoLayer');

Откройте браузер и Вы увидите логотип SVG на странице. Я разместил мой логотип, используя информацию о границах, как показано выше и повернул его:

Код - HTML: [Выделить]
  1. <g transform="rotate(3) translate(${bounds.x-700} ${490}) scale(${scale} -${scale})">

DEMO: https://wallabyway.github.io/offline-pdf-markup/ (нажмите кнопку Stamp It)

Исходный код: https://github.com/wallabyway/offline-pdf-markup

Источник: https://forge.autodesk.com/blog/add-svg-your-2d-sheets-forge-viewer

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

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 28.03.2019