Autoforge Viewer 画布在打开同级容器后不会调整大小

Autoforge Viewer canvas won't resize after open sibling container

提问人:Ender Çelik 提问时间:7/27/2023 更新时间:8/7/2023 访问量:50

问:

我在同一个父元素中有 2 个元素渲染,其中一个是可以打开和关闭的参数容器,另一个是 forge viewer。在 876px 宽度处,此父元素得到 .当我打开参数容器并低于 876px 并关闭参数容器时,forge viewer 画布大小不会调整大小,并且会出现白色空白区域。flex-direction:column ;

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

forgeView.js

import React, { Component } from 'react';
import Script from 'react-load-script';
import {connect} from 'react-redux';
import { getActiveProject } from '../reducers/mainReducer';
import './forgeView.css';
import Message from './message';
import repo from '../Repository';
import { viewerCss, viewerJs } from './shared';
import ParametersContainer from './parametersContainer'
import './parametersContainer.css'

let Autodesk = null;

export class ForgeView extends Component {

    constructor(props){
      super(props);
        
      this.viewerDiv = React.createRef();
      this.viewer = null;
    }

    

    resizeViewer() {
        if (this.viewer && this.viewerDiv.current) {
            const container = this.viewerDiv.current;
            this.viewer.resize()
        }   
    }

    handleScriptLoad() {

        const options = repo.hasAccessToken() ?
                            { accessToken: repo.getAccessToken() } :
                            { env: 'Local' };

        Autodesk = window.Autodesk;

        const container = this.viewerDiv.current;
        this.viewer = new Autodesk.Viewing.GuiViewer3D(container);

        // uncomment this for Viewer debugging
        //this.viewer.debugEvents(true);

        Autodesk.Viewing.Initializer(options, this.handleViewerInit.bind(this));
        window.addEventListener("resize", this.resizeViewer.bind(this));
    }

    handleViewerInit() {
        const errorCode = this.viewer.start();
        if (errorCode)
            return;

        // orient camera in the same way as it's on the thumbnail
        // corresponding to ViewOrientationTypeEnum.kIsoTopRightViewOrientation
        const viewer = this.viewer;
        const forgeSpinner = document.getElementsByClassName("forge-spinner")[0]
        const image = forgeSpinner.children[1]
        image.src = "";
        this.viewer.addEventListener(Autodesk.Viewing.EXTENSION_LOADED_EVENT, (event) => {

            const viewCubeExtensionId = "Autodesk.ViewCubeUi";

            // this is not perfect, because the view transition is visible, so it's a place to improve someday
            if (event.extensionId === viewCubeExtensionId) {

                const viewCubeUI = event.target.getExtension(viewCubeExtensionId);
                viewCubeUI.setViewCube("front top right");

                viewer.removeEventListener(Autodesk.Viewing.EXTENSION_LOADED_EVENT);
            }

            const explodeExtension = viewer.getExtension('Autodesk.Explode');
            const sectionExtension = viewer.getExtension('Autodesk.Section');
            const modelExtension = viewer.getExtension('Autodesk.ModelStructure');
            const propertiesExtension = viewer.getExtension('Autodesk.PropertiesManager');

            explodeExtension.unload();
            sectionExtension.unload();
            modelExtension.unload();
            propertiesExtension.unload();

        });

        // skip loading of svf when there is no active project svf
        if (!this.props.activeProject.svf)
            return;

        Autodesk.Viewing.Document.load(
            this.getSvfUrl(), this.onDocumentLoadSuccess.bind(this), () => {}
        );
    }

    componentDidMount() {
        this.resizeViewer();
    }

    componentDidUpdate(prevProps) {
        if (Autodesk && (this.props.activeProject.svf !== prevProps.activeProject.svf)) {
            Autodesk.Viewing.Document.load(
                this.getSvfUrl(), this.onDocumentLoadSuccess.bind(this), () => {}
            );
        }

        this.resizeViewer();

       
    }

    componentWillUnmount() {
        if (this.viewer) {
            this.viewer.finish();
            this.viewer = null;
            Autodesk.Viewing.shutdown();
        }

        window.removeEventListener("resize", this.resizeViewer.bind(this));
    }

    getSvfUrl() {
        return this.props.activeProject.svf + `/bubble.json`;
    }

    onDocumentLoadSuccess(viewerDocument) {
        const defaultModel = viewerDocument.getRoot().getDefaultGeometry();
        this.viewer.loadDocumentNode(viewerDocument, defaultModel).then(() => {
            this.viewer.fitToView();
        })
    }

    render() {

      return (
            <div className="modelContainer fullheight">
                <Message/>
              <div className="viewer" id="ForgeViewer">
                  <div ref={this.viewerDiv}></div>
                    <link rel="stylesheet" type="text/css" href={ viewerCss } />
                    <Script url={ viewerJs } onLoad={this.handleScriptLoad.bind(this)} />
                </div>
            </div>
        );
    }
}  

我查找了其他类似的问题,但这对我不起作用。

reactjs autodesk-forge autodesk-viewer 基于react类的组件

评论

0赞 Community 7/28/2023
请修剪您的代码,以便更轻松地找到您的问题。请遵循这些准则,以创建最小的可重现示例

答:

0赞 Petr Broz 8/7/2023 #1

我看到您已经在调用它应该相应地更新渲染上下文。如果这不起作用,我建议尝试以下方法:viewer.resize

  • 当您最终处于查看器未渲染整个对象的“损坏”状态时,请尝试打开浏览器控制台,然后键入 ;如果这样可以解决问题,则可能是代码未在正确的时间调用该方法NOP_VIEWER.resize()viewer.resize

  • 您在打开/关闭参数 UI 时是否使用了任何动画?如果是这样,请尝试禁用它们,或确保在动画完成后调用viewer.resize

  • 检查浏览器控制台,查看是否存在任何可能与不完整呈现相关的错误或警告

评论

0赞 Ender Çelik 8/7/2023
谢谢确实解决了我的空白问题,但我不知道在哪里正确调用,因为我不知道 forge viewer api 和分配给我解决问题的这项任务,但我无法解决大约 2 周。此外,我没有为参数UI使用任何动画NOP_VIEWER.resize()viewer.resize()
0赞 Petr Broz 8/7/2023
这是一个 React 问题,而不是 Viewer 问题。基本上,你需要在 React 更新应用程序的 DOM 后在正确的时间调用 resize 方法。
0赞 Ender Çelik 8/7/2023
我在resizeViewer函数中做了一个正常工作的功能,但是当我打开或关闭参数UI时,它无法正常工作。可能是我的参数容器.js导致问题?console.log
0赞 Petr Broz 8/8/2023
是的,我认为可能是。
1赞 Ender Çelik 8/11/2023
哦,谢谢你的回答,顺便说一句,我解决了这个问题。我在参数按钮上添加功能。当我单击参数按钮时,每次单击按钮时都会调整大小。onClick()