为什么文本标记大小会因缩放而异?

Why Does Text Markup Size Varies Based on Zoom?

从数据库加载文本标记时,文本标记会根据查看器的当前缩放比例以不同的大小显示。无论缩放如何,如何使文本标记以静态大小显示?

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

这是因为相机更改事件附加了一个处理程序,在导航 (scaling/panning) 发生时根据当前视图的更新边界调整 SVG 的 viewbox

为了克服这个问题,您可以搭载 MarkupCore 扩展的 onCameraChange 处理程序(确保在事件绑定到进入编辑模式之前的上层链之前执行此操作)并将缩放应用到基于当前相机枢轴值和添加标记时记录的值的 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 转换的详细信息,请参阅 here

将由您来实现计算或更好的方法来转换标记以响应导航。

我可以通过将 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;