Почему размер разметки текста зависит от масштаба?

При загрузке разметки текста из базы данных разметки текста отображаются в другом размере в зависимости от текущего масштаба средства просмотра. Как сделать так, чтобы текстовые разметки отображались в статическом размере независимо от масштаба?

function saveFreeformMarkup(markup){
  let markupObject = {
    x: markup.position.x,
    y: markup.position.y,
    width: markup.size.x,
    height:markup.size.y,
    type: TEXT_MARKUP_TYPE,
    text: $(`#freeText`).val(),
    urn_id: urn[`id`],
    active: ACTIVE
  };
  $.ajax({
    ... send markupObject to database ...
  });
}
function loadSingleMarkup(markup, markupTool){
  let MarkupsCore = Autodesk.Viewing.Extensions.Markups.Core;
  let text = new MarkupsCore.MarkupText(markup.id + ID_INCREMENT, markupTool, markup.text);
  markupTool.addMarkup(text);
  text.setSize({ x: markup.x, y: markup.y}, markup.width, markup.height);
  text.setText(markup.text);
  text.updateStyle(true);
}

person Wesley Reed    schedule 11.02.2019    source источник


Ответы (2)


Это связано с тем, что к событию смены камеры прикреплен обработчик, который регулирует viewbox SVG в соответствии с обновленными границами текущего представления, когда происходит навигация (масштабирование / панорамирование).

Чтобы преодолеть это, вы можете объединить обработчик onCameraChange расширения MarkupCore (обязательно сделайте это до привязки события к верхней цепочке, которая находится перед входом в режим редактирования) и применить масштабирование к SVG на основе текущих значений поворота камеры и те, которые были записаны при добавлении разметки:

MarkupsCore.originalOnCameraChange = MarkupsCore.onCameraChange;
MarkupsCore.onCameraChange = function(event){
   let scaleString = calculateScale(originalPivot, viewer.autocam.pivot);
   this.svg.setAttribute('transform', scaleString);
   this.originalOnCameraChange(event)
}

Подробнее о преобразовании SVG см. здесь.

Оставим вам выполнение вычислений или даже лучший подход к преобразованию разметки в ответ на навигацию.

person Bryan Huang    schedule 12.02.2019
comment
Вы используете переменную с названием originalPivot и функцию с именем calculateScale во фрагменте кода. Нужно ли сохранять переменную при создании разметки или это часть Forge API? Мне нужно создать эту функцию или она является частью API? - person Wesley Reed; 13.02.2019
comment
Да, вам нужно будет реализовать calculateScale для сопоставления изменений значения поворота при увеличении / уменьшении камеры в соответствии с настройками масштабирования SVG и записать исходные значения поворота как originalPivot (или как там вы назвали переменную после) - person Bryan Huang; 13.02.2019
comment
Спасибо за вашу помощь, мне действительно удалось найти более простой способ решения этой проблемы, покопавшись в исходном коде расширения MarkupsCore. - person Wesley Reed; 14.02.2019

Мне удалось решить проблему, изменив функцию loadSingleMarkup() на следующую

const FONT_SIZE_SCALE = 90;
function loadSingleMarkup(markup, markupTool){
  let MarkupsCore = Autodesk.Viewing.Extensions.Markups.Core;
  let text = new MarkupsCore.MarkupText(markup.id + ID_INCREMENT, markupTool, markup.text);
  markupTool.addMarkup(text);
  text.setSize({ x: markup.x, y: markup.y}, markup.width, markup.height);
  text.setText(markup.text);
  text.style[`font-size`] = 12 / FONT_SIZE_SCALE;
  text.updateStyle(true);
}

(добавление text.style[`font-size`] = 12 / FONT_SIZE_SCALE;)

person Wesley Reed    schedule 14.02.2019