Autodesk forge 屏幕截图中的Autodesk标记定位错误

Autodesk forge 屏幕截图中的Autodesk标记定位错误,autodesk-forge,autodesk-viewer,autodesk,Autodesk Forge,Autodesk Viewer,Autodesk,下面是我生成屏幕截图和标记的代码 函数生成带有标记的快照(ncrNo、luName、keyRef、MarkupStringData){ 让屏幕截图=新图像(); const mimeType='image/png'; screenshot.onload=异步函数(){ const markupCore=await createdViewer.loadExtension('Autodesk.Viewing.markupCore'); markupCore.show(); markupCore.lo

下面是我生成屏幕截图和标记的代码

函数生成带有标记的快照(ncrNo、luName、keyRef、MarkupStringData){
让屏幕截图=新图像();
const mimeType='image/png';
screenshot.onload=异步函数(){
const markupCore=await createdViewer.loadExtension('Autodesk.Viewing.markupCore');
markupCore.show();
markupCore.loadMarkups(MarkupStringData,“layer1”);
让canvas=document.createElement('canvas');
canvas.width=createdViewer.container.clientWidth;
canvas.height=createdViewer.container.clientHeight;
设ctx=canvas.getContext('2d');
clearRect(0,0,canvas.width,canvas.height);
ctx.drawImage(屏幕截图,0,0,canvas.width,canvas.height);
renderToCanvas(ctx,函数(){
//将画布转换为Blob,然后将Blob转换为ArrayBuffer。
canvas.toBlob((blob)=>{
创建并连接带有blob的媒体(ncrNo、luName、keyRef、blob);
markupCore.leveEditMode();
markupCore.hide();
},mimeType);
},假);
};
getScreenShot(createdViewer.container.clientWidth,createdViewer.container.clientHeight,函数(blobURL){
screenshot.src=blobURL;
});
}
原始标记是

但是对于我得到的截图

这是随机的,但我确实注意到有时在移动模型(或使用“平移”移动视图)时(特别是沿着X轴),会发生这种情况


当我绘制画布或其他东西时,是否有什么问题???

好的,我想我可能已经发现我的代码丢失了什么,所以我在加载标记之前添加了以下代码

缺少的一点是“国家”

var viewerstatepsist=markUp.viewer.getState()
然后在加载标记之前添加它

markup.viewer.restoreState(viewerstatepsist);
所以我的最终代码是这样的


函数生成带有标记的快照(ncrNo、luName、keyRef、MarkupStringData、viewerStatePersist){
让屏幕截图=新图像();
const mimeType='image/png';
screenshot.onload=异步函数(){
const markupCore=await createdViewer.loadExtension('Autodesk.Viewing.markupCore');
markup.viewer.restoreState(viewerstatepsist);
markupCore.show();
markupCore.loadMarkups(MarkupStringData,“layer1”);
让canvas=document.createElement('canvas');
canvas.width=createdViewer.container.clientWidth;
canvas.height=createdViewer.container.clientHeight;
设ctx=canvas.getContext('2d');
clearRect(0,0,canvas.width,canvas.height);
ctx.drawImage(屏幕截图,0,0,canvas.width,canvas.height);
renderToCanvas(ctx,函数(){
//将画布转换为Blob,然后将Blob转换为ArrayBuffer。
canvas.toBlob((blob)=>{
创建并连接带有blob的媒体(ncrNo、luName、keyRef、blob);
markupCore.leveEditMode();
markupCore.hide();
},mimeType);
},假);
};
getScreenShot(createdViewer.container.clientWidth,createdViewer.container.clientHeight,函数(blobURL){
screenshot.src=blobURL;
});
}
不确定这是否是真正的解决方案,但对我有效…

添加到的答案:

以下是标记如何与查看器相机保持同步:

  • 每当相机发生变化时,
    MarkupsCore
    扩展就会调用自己的方法
    onCameraChange
    ,以相应地同步其标记的位置和比例
  • onCameraChange
    方法调用扩展对象的另一个名为
    getSvgViewBox
    的方法来计算查看器画布所有四个角的“世界坐标”
  • 然后使用世界坐标指定SVG元素的属性
因此,除非在您尝试生成屏幕截图之前出于某种原因没有调用
onCameraChange
方法,否则标记应该始终保持同步。尝试向方法中添加断点,以查看是否按预期调用了该方法