autodesk-forgeautodesk-viewerrevit-api

APS (Forge) Viewer "Autodesk.AEC.LevelsExtension" error by changing a Revit model view/geometry


We are using Autodesk.AEC.LevelsExtension in our viewer for Revit models. But after changing a Revit view (or geometry) it throws errors.

This is how we implement LevelsExtension:

const initViewer = () => {
    return new Promise((resolve, reject) => {
        var options = {
            env: 'AutodeskProduction2',
            api: 'derivativeV2_EU',
            getAccessToken,
        };

        Autodesk.Viewing.Initializer(options, () => {
            const config = {
                extensions: [
                    'Autodesk.DocumentBrowser',
                    'Autodesk.AEC.LevelsExtension',
                ],
            };

            const container = document.getElementById('viewer');

            const viewer = new Autodesk.Viewing.GuiViewer3D(
                container,
                config
            );

            viewer.start();

            resolve(viewer);
        });
    });
};

const loadModel = (viewer, model, index) => {
    const onDocumentLoadSuccess = (doc) => {
        const geometries = doc.getRoot().search({ type: 'geometry' });

        doc.downloadAecModelData();

        viewer.loadDocumentNode(doc, geometries[index], {
            createWireframe: false,
            applyScaling: 'm',
            isAEC: true,
        });
    };

    Autodesk.Viewing.Document.load(
        'urn:' + model.urn,
        onDocumentLoadSuccess,
        onDocumentLoadFailure
    );
};

As you can see before changing the view, there is a div for Levels panel with id="LevelsPanel-0": enter image description here

But after changing the view, there will be added another one without terminating the previous panel (as you can see the previous panel is still open): enter image description here

And if you hover the previous open panel it will throw these errors: enter image description here


Solution

  • Thanks for your details. I can reproduce this issue even without using your code. I reported to our engineering team for insights. Our apologies for the inconvenience!

    Here is a workaround that we remove the levelsPanel before loading the new model.

    viewer.getExtension('Autodesk.AEC.LevelsExtension').levelsPanel?.setVisible(false);
    viewer.getExtension('Autodesk.AEC.LevelsExtension').levelsPanel?.container.remove();
    

    Full code

        const loadModel = (viewer, model, index) => {
          const onDocumentLoadSuccess = async (doc) => {
            if (viewer.getExtension('Autodesk.AEC.LevelsExtension')) {
              viewer.getExtension('Autodesk.AEC.LevelsExtension').levelsPanel?.setVisible(false);
              viewer.getExtension('Autodesk.AEC.LevelsExtension').levelsPanel?.container.remove();
            }
            
            const geometries = doc.getRoot().search({ type: 'geometry' });
    
            doc.downloadAecModelData();
    
            viewer.loadDocumentNode(doc, geometries[index], {
              createWireframe: false,
              applyScaling: 'm',
              isAEC: true,
            });
          };
    
          onDocumentLoadFailure = (error) => console.error(error);
    
          Autodesk.Viewing.Document.load(
            'urn:' + model.urn,
            onDocumentLoadSuccess,
            onDocumentLoadFailure
          );
        };