为什么文本标记大小会因缩放而异?
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;
)
从数据库加载文本标记时,文本标记会根据查看器的当前缩放比例以不同的大小显示。无论缩放如何,如何使文本标记以静态大小显示?
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;
)