提问人:Ender Çelik 提问时间:7/27/2023 更新时间:8/7/2023 访问量:50
Autoforge Viewer 画布在打开同级容器后不会调整大小
Autoforge Viewer canvas won't resize after open sibling container
问:
我在同一个父元素中有 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>
);
}
}
我查找了其他类似的问题,但这对我不起作用。
答:
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()
上一个:在 react 中控制重新渲染?
下一个:React 扩展了函数组件?
评论