Browse Source

WorldMode / Viewport / editor 设计模式重构

master
修宁 7 months ago
parent
commit
24ae2821f2
  1. 12
      src/designer/Viewport.ts
  2. 12
      src/designer/model2DEditor/Model2DEditor.vue
  3. 22
      src/designer/model2DEditor/Model2DEditorJs.js

12
src/designer/Viewport.ts

@ -21,6 +21,7 @@ export default class Viewport {
statsControls: Stats statsControls: Stats
controls: OrbitControls controls: OrbitControls
worldModel: WorldModel worldModel: WorldModel
animationFrameId: any = null
/** /**
* *
@ -46,7 +47,9 @@ export default class Viewport {
/** /**
* THREE * THREE
*/ */
initThree(viewerDom: HTMLElement) { initThree(viewerDom: HTMLElement, floor: string) {
console.log('init floor', floor)
this.state.currentFloor = floor
this.viewerDom = viewerDom this.viewerDom = viewerDom
this.worldModel.registerViewport(this) this.worldModel.registerViewport(this)
@ -195,7 +198,7 @@ export default class Viewport {
* *
*/ */
animate() { animate() {
requestAnimationFrame(this.animate.bind(this)) this.animationFrameId = requestAnimationFrame(this.animate.bind(this))
this.renderView() this.renderView()
} }
@ -282,6 +285,11 @@ export default class Viewport {
destroy() { destroy() {
this.state.isReady = false this.state.isReady = false
if (this.animationFrameId !== null) {
cancelAnimationFrame(this.animationFrameId)
this.animationFrameId = null
}
if (this.unwatchList) { if (this.unwatchList) {
_.forEach(this.unwatchList, (unWatchFn => { _.forEach(this.unwatchList, (unWatchFn => {
unWatchFn() unWatchFn()

12
src/designer/model2DEditor/Model2DEditor.vue

@ -4,13 +4,15 @@
<span class="section-toolbar-line" style="margin-left: 85px;"></span> <span class="section-toolbar-line" style="margin-left: 85px;"></span>
<el-button :icon="renderIcon('antd ClusterOutlined')" link></el-button> <el-button :icon="renderIcon('antd ClusterOutlined')" link></el-button>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-cascader placeholder="选择楼层" size="small" v-model="state.currentFloor" :options="allLevels" filterable /> <el-cascader placeholder="选择楼层" size="small" v-model="currentFloor"
:options="allLevels" filterable :show-all-levels="false" clearable
:props="{emitPath:false}" />
</div> </div>
<div class="section-content"> <div class="section-content">
<div :key="state.currentFloor" <div v-if="currentFloor" :key="currentFloor" :title="'当前楼层:'+currentFloor"
class="canvas-container" ref="canvasContainer" tabindex="1" /> class="canvas-container" ref="canvasContainer" tabindex="1" />
</div> </div>
<div class="section-bottom-toolbar section-toolbar"> <div class="section-bottom-toolbar section-toolbar" v-if="isReady">
<div class="section-toolbar-left"> <div class="section-toolbar-left">
<el-button title="鼠标状态 (ESC)" :icon="renderIcon('fa MousePointer')" link <el-button title="鼠标状态 (ESC)" :icon="renderIcon('fa MousePointer')" link
:type="state.cursorMode==='normal'?'primary':''" :type="state.cursorMode==='normal'?'primary':''"
@ -37,7 +39,7 @@
@click="()=>state.cursorMode = 'Ruler'"></el-button> @click="()=>state.cursorMode = 'Ruler'"></el-button>
</div> </div>
<div class="section-toolbar-right"> <div class="section-toolbar-right">
<el-input v-model="view.searchKeyword" size="small" style="width: 110px; margin-right: 5px;" <el-input v-model="searchKeyword" size="small" style="width: 110px; margin-right: 5px;"
placeholder="Search"> placeholder="Search">
<template #prefix> <template #prefix>
<component :is="renderIcon('element Search')"></component> <component :is="renderIcon('element Search')"></component>
@ -47,7 +49,7 @@
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-text type="danger">00011</el-text> <el-text type="danger">00011</el-text>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<div v-if="state.ready"> <div>
{{ state.camera.position.x.toFixed(2) }},{{ state.camera.position.y.toFixed(2) {{ state.camera.position.x.toFixed(2) }},{{ state.camera.position.y.toFixed(2)
}},{{ state.camera.position.z.toFixed(2) }},{{ state.camera.position.z.toFixed(2)
}} }}

22
src/designer/model2DEditor/Model2DEditorJs.js

@ -8,11 +8,11 @@ export default defineComponent({
const viewport = new Viewport(worldModel) const viewport = new Viewport(worldModel)
return { return {
isReady: false,
viewport: viewport, viewport: viewport,
view: { currentFloor: '',
searchKeyword: '' searchKeyword: ''
} }
}
}, },
mounted() { mounted() {
window['editor'] = this window['editor'] = this
@ -24,11 +24,10 @@ export default defineComponent({
methods: { methods: {
renderIcon, renderIcon,
initByFloor(floor) { initByFloor(floor) {
this.isReady = false
const viewportOrigin = this.viewport const viewportOrigin = this.viewport
if (viewportOrigin && viewportOrigin.state.isReady) { if (viewportOrigin && viewportOrigin.state.isReady) {
viewportOrigin.destroy() viewportOrigin.destroy()
this.viewport = null
return
} }
delete window['editor'] delete window['editor']
@ -47,7 +46,7 @@ export default defineComponent({
const viewport = markRaw(new Viewport(worldModel)) const viewport = markRaw(new Viewport(worldModel))
this.viewport = viewport this.viewport = viewport
viewport.initThree(viewerDom) viewport.initThree(viewerDom, floor)
window['viewport'] = viewport window['viewport'] = viewport
window['scene'] = viewport.scene window['scene'] = viewport.scene
@ -56,12 +55,19 @@ export default defineComponent({
window['renderer'] = viewport.renderer window['renderer'] = viewport.renderer
window['controls'] = viewport.controls window['controls'] = viewport.controls
viewerDom?.focus() viewerDom.focus()
this.isReady = true
} }
}, },
watch: { watch: {
'state.currentFloor'(newVal, oldVal) { currentFloor: {
handler(newVal, oldVal) {
const floor = newVal
this.$nextTick(() => {
console.log('floor changed', floor)
this.initByFloor(newVal) this.initByFloor(newVal)
})
}
} }
}, },
computed: { computed: {
@ -69,7 +75,7 @@ export default defineComponent({
* @returns {ViewportState|{}} * @returns {ViewportState|{}}
*/ */
state() { state() {
return this.viewport?.state || {} return this.viewport.state
}, },
allLevels() { allLevels() {
return worldModel.allLevels return worldModel.allLevels

Loading…
Cancel
Save