【问题标题】:Forge viewer Autodesk.Viewing.GEOMETRY_LOADED_EVENT not being triggered for pdf filesForge 查看器 Autodesk.Viewing.GEOMETRY_LOADED_EVENT 未针对 pdf 文件触发
【发布时间】:2017-06-19 04:21:29
【问题描述】:

在我的代码中,我已将侦听器附加到Autodesk.Viewing.GEOMETRY_LOADED_EVENT 事件,以确保仅在查看器完全加载完模型文件后才运行。我遵循了来自this 的示例。

// Attach event handlers
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => $timeout(handleViewerGeometryLoaded));         
viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, () => $timeout(handleViewerSelectionChanged));


function handleViewerGeometryLoaded() {
   // Perform some actions here after everything is loaded.
}

只要在查看器完成加载文件时触发GEOMETRY_LOADED_EVENT get,这完全可以正常工作。但是我最近发现的一件事是,对于某些文件类型,例如pdf,此事件不会被触发。对于所有其他文件,如 3d 文件、rvt、dwg 文件等,这工作得非常好。但是对于 pdf 文件,这不起作用。

这对 pdf 文件不起作用是否正确?我该怎么做才能知道查看器何时加载这些文件?我可以在这里使用其他类似的事件吗?

在我们的应用程序中,我们需要支持从 3d 模型到 2d 文件的各种文件,甚至包括 pdf 文件。所以,我需要某种事件,当加载完成查看器支持的所有文件类型时触发。

谢谢。

【问题讨论】:

  • .pdf 不包含任何几何图形,所以我猜预计 GEOMETRY_LOADED_EVENT 不会触发。我正在与开发团队确认是否有其他事件可用于确保文档已完全加载
  • @PhilippeLeefsma 好的,这是有道理的。但我确实需要一些事件来收听,以了解查看器何时完全加载文件。让我知道是否有任何解决方法。
  • 这正是我所要求的,我会在收到反馈时通知您...
  • 您可以尝试使用进度值触发的“PROGRESS_UPDATE_EVENT”,该进度值指示到目前为止流式传输的数据量。这由查看器进度条(左下方)使用
  • 好的,会试试的。谢谢:)

标签: javascript autodesk autodesk-forge autodesk-viewer


【解决方案1】:

无论如何,我尝试了一切,但最终我不得不做这个 hack 以使其在我的应用程序中工作。但它完成了工作:)

let modelCompletelyLoaded === false;

function ensureModelsWithoutGeometryLoaded(viewer) {
    const CHECK_INTERVAL = 1000;

    return new Promise(resolve => {
        // This is a dirty hack we need to do to ensure pdf files
        // to know when pdf files are loaded. We had to do this since
        // the GEOMETRY_LOADED_EVENT won't get triggered for the pdf files and
        // the files that doesn't have any geometry so we need to poll continously
        // to know if the model is fully loaded.
        let loadChecker = setInterval(() => {
            let hasMyData = viewer.model && viewer.model.myData;
            let loaded = hasMyData && viewer.model.myData.loadDone;
            let is2d = hasMyData && viewer.model.myData.is2d;
            let hasInstanceTree = hasMyData && (typeof viewer.model.myData.instanceTree === 'object');

            // It's not a 2d model, or the instanceTree has been loaded i.e the it has geometry
            // it implies that this couldn't be a pdf file, just skip it.
            if (is2d === false || hasInstanceTree) {
                clearInterval(loadChecker);
            } else if (loaded) {
                // Loaded now. Okay, great trigger the event finally.
                resolve();
                clearInterval(loadChecker);
            }
        }, CHECK_INTERVAL);
    });
}

function handleObjectLoaded() {
    if (modelCompletelyLoaded === true) {
        return
    }

    modelCompletelyLoaded === true;

    // Perform some actions here after everything is loaded.
    // ...
}

// Attach event handlers (this would work for all the files except those that doesn't have geometry data).
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, handleObjectLoaded);

// For pdf files and those that don't contain geometry do this
ensureModelsWithoutGeometryLoaded(viewer).then(handleObjectLoaded);

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 2018-09-26
    • 2016-12-26
    • 2019-08-05
    • 2020-10-27
    • 2018-07-16
    • 2021-10-21
    • 2019-03-27
    • 2012-04-16
    相关资源
    最近更新 更多