|
|
@ -9,7 +9,8 @@ |
|
|
:props="{emitPath:false}" /> |
|
|
:props="{emitPath:false}" /> |
|
|
</div> |
|
|
</div> |
|
|
<div class="section-content"> |
|
|
<div class="section-content"> |
|
|
<div v-if="currentStateManagerId" :key="currentStateManagerId" |
|
|
<div v-if="currentStateManagerId" :key="currentStateManagerId || getRandom()" |
|
|
|
|
|
:StateManagerId="currentStateManagerId" |
|
|
class="canvas-container" ref="canvasContainer" tabindex="1" /> |
|
|
class="canvas-container" ref="canvasContainer" tabindex="1" /> |
|
|
</div> |
|
|
</div> |
|
|
<div class="section-bottom-toolbar section-toolbar" v-if="!!state"> |
|
|
<div class="section-bottom-toolbar section-toolbar" v-if="!!state"> |
|
|
@ -68,6 +69,7 @@ |
|
|
</template> |
|
|
</template> |
|
|
<script> |
|
|
<script> |
|
|
import * as THREE from 'three' |
|
|
import * as THREE from 'three' |
|
|
|
|
|
import $ from 'jquery' |
|
|
import { getQueryParams, renderIcon, setQueryParam } from '@/utils/webutils' |
|
|
import { getQueryParams, renderIcon, setQueryParam } from '@/utils/webutils' |
|
|
import { defineComponent, markRaw } from 'vue' |
|
|
import { defineComponent, markRaw } from 'vue' |
|
|
import Viewport from '@/core/engine/Viewport' |
|
|
import Viewport from '@/core/engine/Viewport' |
|
|
@ -103,6 +105,9 @@ export default defineComponent({ |
|
|
}, |
|
|
}, |
|
|
methods: { |
|
|
methods: { |
|
|
renderIcon, |
|
|
renderIcon, |
|
|
|
|
|
getRandom() { |
|
|
|
|
|
return Math.random().toString(36).substring(2, 15) |
|
|
|
|
|
}, |
|
|
destroyScene() { |
|
|
destroyScene() { |
|
|
if (this.viewport) { |
|
|
if (this.viewport) { |
|
|
this.viewport.destroy() |
|
|
this.viewport.destroy() |
|
|
@ -126,6 +131,11 @@ export default defineComponent({ |
|
|
initByFloor() { |
|
|
initByFloor() { |
|
|
this.destroyScene() |
|
|
this.destroyScene() |
|
|
|
|
|
|
|
|
|
|
|
if (!this.$el || this.$.isUnmounted) { |
|
|
|
|
|
// 检查组件是否已卸载, 幻影加载问题 |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
delete window['editor'] |
|
|
delete window['editor'] |
|
|
delete window['viewport'] |
|
|
delete window['viewport'] |
|
|
delete window['scene'] |
|
|
delete window['scene'] |
|
|
@ -145,42 +155,68 @@ export default defineComponent({ |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 等待 canvasContainer 渲染出来 |
|
|
|
|
|
this.$nextTick(() => { |
|
|
this.$nextTick(() => { |
|
|
const viewerDom = this.$refs.canvasContainer |
|
|
const MAX_RETRY = 5 |
|
|
|
|
|
let retryCount = 0 |
|
|
const sceneHelp = new SceneHelp(worldModel, worldModel.state.catalogCode) |
|
|
|
|
|
const viewport = new Viewport(sceneHelp, viewerDom) |
|
|
// 等待 canvasContainer 渲染出来 |
|
|
|
|
|
const tryInitViewport = () => { |
|
|
this.scene = markRaw(sceneHelp) |
|
|
const viewerDom = this.$refs.canvasContainer |
|
|
this.viewport = markRaw(viewport) |
|
|
|
|
|
|
|
|
if (viewerDom) { |
|
|
system.showLoading('正在加载视口...') |
|
|
const viewerDom = this.$refs.canvasContainer |
|
|
viewport.initThree({ stateManagerId: id }).then(() => { |
|
|
|
|
|
setQueryParam('store', id) |
|
|
if (!viewerDom) { |
|
|
// window.history.replaceState({}, '', window.location.href + '?store=' + id) |
|
|
system.showErrorDialog('Canvas container not found!') |
|
|
|
|
|
debugger |
|
|
window['viewport'] = viewport |
|
|
return |
|
|
window['THREE'] = THREE |
|
|
} |
|
|
window['scene'] = sceneHelp.scene |
|
|
|
|
|
window['stateManager'] = viewport.stateManager |
|
|
const sceneHelp = new SceneHelp(worldModel, worldModel.state.catalogCode) |
|
|
window['entityManager'] = viewport.entityManager |
|
|
const viewport = new Viewport(sceneHelp, viewerDom) |
|
|
window['renderer'] = viewport.renderer |
|
|
|
|
|
window['camera'] = viewport.camera |
|
|
this.scene = markRaw(sceneHelp) |
|
|
window['renderer'] = viewport.renderer |
|
|
this.viewport = markRaw(viewport) |
|
|
window['controls'] = viewport.controls |
|
|
|
|
|
|
|
|
system.showLoading('正在加载视口...') |
|
|
//@ts-ignore |
|
|
viewport.initThree({ stateManagerId: id }).then(() => { |
|
|
viewerDom.focus() |
|
|
setQueryParam('store', id) |
|
|
|
|
|
// window.history.replaceState({}, '', window.location.href + '?store=' + id) |
|
|
// 通知父组件视口已准备好 |
|
|
|
|
|
this.$emit('viewportChanged', viewport) |
|
|
window['viewport'] = viewport |
|
|
this.isReady = true |
|
|
window['THREE'] = THREE |
|
|
|
|
|
window['scene'] = sceneHelp.scene |
|
|
}).finally(() => { |
|
|
window['stateManager'] = viewport.stateManager |
|
|
system.clearLoading() |
|
|
window['entityManager'] = viewport.entityManager |
|
|
}) |
|
|
window['renderer'] = viewport.renderer |
|
|
|
|
|
window['camera'] = viewport.camera |
|
|
|
|
|
window['renderer'] = viewport.renderer |
|
|
|
|
|
window['controls'] = viewport.controls |
|
|
|
|
|
|
|
|
|
|
|
//@ts-ignore |
|
|
|
|
|
viewerDom.focus() |
|
|
|
|
|
|
|
|
|
|
|
// 通知父组件视口已准备好 |
|
|
|
|
|
this.$emit('viewportChanged', viewport) |
|
|
|
|
|
this.isReady = true |
|
|
|
|
|
|
|
|
|
|
|
}).finally(() => { |
|
|
|
|
|
system.clearLoading() |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
} else if (retryCount < MAX_RETRY) { |
|
|
|
|
|
retryCount++ |
|
|
|
|
|
setTimeout(tryInitViewport, 50) |
|
|
|
|
|
} else { |
|
|
|
|
|
console.error('Canvas container not found after retries') |
|
|
|
|
|
this.currentStateManagerId = '' |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
tryInitViewport() |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
computed: { |
|
|
computed: { |
|
|
|