You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Autodesk Forge截图无法包含标记,代码实现遇阻求助

解决Autodesk Viewer截图不显示标记的问题

看起来你的代码里有几个关键问题导致标记没有出现在最终截图里,我来帮你拆解并修正:

核心问题分析

  1. screenshot变量未被赋值,后续标记渲染逻辑完全未执行
    你创建了screenshot Image对象,但在viewer.getScreenShot的回调里,只调用了CreateAndConnectMedia,没有把获取到的blobURL赋值给screenshot.src——这意味着screenshot.onload事件永远不会触发,你写的加载标记、渲染标记的代码根本没跑起来!

  2. 流程顺序混乱
    你的代码尝试同时处理截图获取和标记加载,但没有把两者正确串联,导致标记渲染逻辑和基础截图绘制完全脱节,最终导出的只是原始截图,没有叠加标记。

修正后的完整代码

下面是调整后的代码,我标注了关键修改点:

function generateSnaphot(ncrNo_, luName_, keyRef_, markupsStringData) {
    console.log('* * * * * generateSnaphot ');

    // 第一步:先获取Viewer的基础截图
    viewer.getScreenShot(viewer.container.clientWidth, viewer.container.clientHeight, function (blobURL) {
        console.log('%%%%%%%%%%%%%%% blobURL : ', blobURL);
        
        // 创建截图Image对象,等待加载完成
        var screenshot = new Image();
        screenshot.onload = function () {
            // 加载MarkupsCore扩展
            viewer.loadExtension('Autodesk.Viewing.MarkupsCore').then(function (markupCore) {
                // 初始化标记控件状态
                markupCore.show();
                markupCore.enterViewMode();
                // 加载标记数据
                markupCore.loadMarkups(markupsStringData, "layerName");

                // 创建用于合成的canvas
                var canvas = document.getElementById('snapshot');
                canvas.width = viewer.container.clientWidth;
                canvas.height = viewer.container.clientHeight;
                var ctx = canvas.getContext('2d');
                
                // 1. 先绘制基础截图到canvas
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                ctx.drawImage(screenshot, 0, 0, canvas.width, canvas.height);

                // 2. 将标记渲染到同一个canvas
                markupCore.renderToCanvas(ctx, function() {
                    // 导出合成后的图片
                    const a = document.createElement('a');
                    document.body.appendChild(a);
                    a.href = canvas.toDataURL('image/png');
                    a.download = 'markup.png';
                    a.click();
                    document.body.removeChild(a);

                    // 可选:清理标记控件状态
                    markupCore.hide();
                    markupCore.leaveViewMode();
                }, true);
            });
        };

        // 关键:把获取到的截图URL赋值给Image对象,触发onload
        screenshot.src = blobURL;
        // 处理跨域问题(如果Viewer资源来自不同域名)
        screenshot.crossOrigin = 'anonymous';
    });
}

额外注意事项

  • 跨域问题:如果你的Viewer加载的模型来自不同域名,必须给Image对象设置crossOrigin = 'anonymous',否则canvas.toDataURL会抛出安全错误。
  • 标记视角匹配:如果你的标记是和特定Viewer视角(相机位置、缩放比例)绑定的,建议在加载标记前先恢复对应的Viewer状态,确保标记出现在正确位置。
  • Viewer初始化状态:确保viewer已经完全初始化(模型加载完成)再调用此函数,可通过监听viewer.addEventListener('GEOMETRY_LOADED', ...)事件来触发截图逻辑。

内容的提问来源于stack exchange,提问作者udda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:52:29