Browse Source

IWidget 获取 viewport

master
修宁 7 months ago
parent
commit
350cc79a28
  1. 22
      src/designer/model2DEditor/Model2DEditor.vue
  2. 10
      src/designer/model2DEditor/Model2DEditorJs.js
  3. 2
      src/designer/model3DView/Model3DView.vue
  4. 9
      src/designer/viewWidgets/IWidgets.ts
  5. 8
      src/designer/viewWidgets/property/PropertyView.vue
  6. 2
      src/model/WorldModel.ts
  7. 17
      src/views/ModelMain.vue

22
src/designer/model2DEditor/Model2DEditor.vue

@ -12,34 +12,34 @@
<div v-if="currentFloor" :key="currentFloor" <div v-if="currentFloor" :key="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="!!state">
<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===Constract.CursorModeNormal?'primary':''" :type="state?.cursorMode===Constract.CursorModeNormal?'primary':''"
@click="()=>state.cursorMode = Constract.CursorModeNormal"></el-button> @click="()=>state.cursorMode = Constract.CursorModeNormal"></el-button>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-button title="框选模式 (T)" :icon="renderIcon('FullScreen')" link <el-button title="框选模式 (T)" :icon="renderIcon('FullScreen')" link
:type="state.cursorMode===Constract.CursorModeSelectByRec?'primary':''" :type="state?.cursorMode===Constract.CursorModeSelectByRec?'primary':''"
@click="()=>state.cursorMode = Constract.CursorModeSelectByRec"></el-button> @click="()=>state.cursorMode = Constract.CursorModeSelectByRec"></el-button>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-button title="物理流动线 (Z)" :icon="renderIcon('antd EnterOutlined')" link <el-button title="物理流动线 (Z)" :icon="renderIcon('antd EnterOutlined')" link
:type="state.cursorMode===Constract.CursorModeALink?'primary':''" :type="state?.cursorMode===Constract.CursorModeALink?'primary':''"
@click="()=>state.cursorMode = Constract.CursorModeALink"></el-button> @click="()=>state.cursorMode = Constract.CursorModeALink"></el-button>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-button title="逻辑关联 (X)" :icon="renderIcon('antd LinkOutlined')" link <el-button title="逻辑关联 (X)" :icon="renderIcon('antd LinkOutlined')" link
:type="state.cursorMode===Constract.CursorModeSLink?'primary':''" :type="state?.cursorMode===Constract.CursorModeSLink?'primary':''"
@click="()=>state.cursorMode = Constract.CursorModeSLink"></el-button> @click="()=>state.cursorMode = Constract.CursorModeSLink"></el-button>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-button title="测量工具" :icon="renderIcon('fa Ruler')" link <el-button title="测量工具" :icon="renderIcon('fa Ruler')" link
:type="state.cursorMode===Constract.CursorModeMeasure?'primary':''" :type="state?.cursorMode===Constract.CursorModeMeasure?'primary':''"
@click="()=>state.cursorMode = Constract.CursorModeMeasure"></el-button> @click="()=>state.cursorMode = Constract.CursorModeMeasure"></el-button>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<el-button title="输送线" :icon="renderIcon('fa Line')" link <el-button title="输送线" :icon="renderIcon('fa Line')" link
:type="state.cursorMode===Constract.CursorModeConveyor?'primary':''" :type="state?.cursorMode===Constract.CursorModeConveyor?'primary':''"
@click="()=>state.cursorMode = Constract.CursorModeConveyor"></el-button> @click="()=>state.cursorMode = Constract.CursorModeConveyor"></el-button>
</div> </div>
<div class="section-toolbar-right"> <div class="section-toolbar-right">
@ -54,13 +54,13 @@
<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> <div>
{{ toFixed(state.camera.position.x) }}, {{ toFixed(state?.camera.position.x) }},
{{ toFixed(state.camera.position.y) }}, {{ toFixed(state?.camera.position.y) }},
{{ toFixed(state.camera.position.z) }} {{ toFixed(state?.camera.position.z) }}
</div> </div>
<span class="section-toolbar-line"></span> <span class="section-toolbar-line"></span>
<div> <div>
{{ toFixed(state.mouse.x) }},{{ toFixed(state.mouse.z) }} {{ toFixed(state?.mouse.x) }},{{ toFixed(state?.mouse.z) }}
</div> </div>
</div> </div>
</div> </div>

10
src/designer/model2DEditor/Model2DEditorJs.js

@ -6,23 +6,20 @@ import Constract from '@/designer/Constract.js'
export default defineComponent({ export default defineComponent({
name: 'Model2DEditor', name: 'Model2DEditor',
emits: ['viewportChanged'],
data() { data() {
const viewport = new Viewport(worldModel)
return { return {
Constract, Constract,
isReady: false, isReady: false,
viewport: viewport, viewport: null,
currentFloor: '', currentFloor: '',
searchKeyword: '' searchKeyword: ''
} }
}, },
mounted() { mounted() {
window['viewport'] = this
}, },
beforeMount() { beforeMount() {
this.initByFloor('') this.initByFloor('')
delete window['viewport']
}, },
methods: { methods: {
renderIcon, renderIcon,
@ -69,6 +66,7 @@ export default defineComponent({
window['controls'] = viewport.controls window['controls'] = viewport.controls
viewerDom.focus() viewerDom.focus()
this.$emit('viewportChanged', viewport)
this.isReady = true this.isReady = true
} }
}, },
@ -88,7 +86,7 @@ export default defineComponent({
* @returns {ViewportState|{}} * @returns {ViewportState|{}}
*/ */
state() { state() {
return this.viewport.state return this.viewport?.state
}, },
allLevels() { allLevels() {
return worldModel.state.allLevels return worldModel.state.allLevels

2
src/designer/model3DView/Model3DView.vue

@ -88,7 +88,7 @@ import { renderIcon } from '@/utils/webutils.js'
import textureUrl from '@/assets/images/conveyor/shapes/RibSideSkirtThumbnail.jpg' import textureUrl from '@/assets/images/conveyor/shapes/RibSideSkirtThumbnail.jpg'
import moveUrl from '@/assets/images/conveyor/shapes/move.svg' import moveUrl from '@/assets/images/conveyor/shapes/move.svg'
import arrowRightUrl from '@/assets/images/conveyor/shapes/arrow-right.svg' import arrowRightUrl from '@/assets/images/conveyor/shapes/arrow-right.svg'
import rackUrl from '@/assets/images/conveyor/shapes/Rack.png' // import rackUrl from '@/assets/images/conveyor/shapes/Rack.png'
// DOM refs // DOM refs
const canvasContainer = ref(null) const canvasContainer = ref(null)

9
src/designer/viewWidgets/IWidgets.ts

@ -1,5 +1,6 @@
import { defineComponent } from 'vue' import { defineComponent } from 'vue'
import { renderIcon } from '@/utils/webutils.js' import { renderIcon } from '@/utils/webutils.js'
import Viewport, { type ViewportState } from '@/designer/Viewport.ts'
export type IWidgetData = { export type IWidgetData = {
/** /**
@ -16,6 +17,14 @@ export default defineComponent({
deactivated() { deactivated() {
this.isActivated = false this.isActivated = false
}, },
props: {
viewport: Viewport
},
computed: {
state(): ViewportState {
return this.viewport?.state
}
},
emits: ['close'], emits: ['close'],
data() { data() {
return { return {

8
src/designer/viewWidgets/property/PropertyView.vue

@ -61,9 +61,17 @@ export default {
name: 'PropertyView', name: 'PropertyView',
mixins: [IWidgets], mixins: [IWidgets],
data() { data() {
return { return {
searchKeyword: '' searchKeyword: ''
} }
},
watch: {
'state.selectedObject': {
handler(newVal) {
debugger
}
}
} }
} }
</script> </script>

2
src/model/WorldModel.ts

@ -24,7 +24,7 @@ export default class WorldModel {
*/ */
state = reactive({ state = reactive({
openFileName: '', openFileName: '',
allLevels: null allLevels: null,
}) })
sceneMap = new Map<string, Scene>() sceneMap = new Map<string, Scene>()

17
src/views/ModelMain.vue

@ -45,14 +45,15 @@
<div class="section-item-wrap"> <div class="section-item-wrap">
<keep-alive> <keep-alive>
<component v-if="calcLeftPanel?.component" :is="calcLeftPanel.component" <component v-if="calcLeftPanel?.component" :is="calcLeftPanel.component"
@close="closeMe('hideLeft')" :key="calcLeftPanel?.name" /> @close="closeMe('hideLeft')" :key="calcLeftPanel?.name"
:viewport="currentViewport" />
</keep-alive> </keep-alive>
</div> </div>
</SplitArea> </SplitArea>
<SplitArea class="section-center" :class="{'hidden-split':hideRight}" :size="calcCenterSize"> <SplitArea class="section-center" :class="{'hidden-split':hideRight}" :size="calcCenterSize">
<el-tabs type="card" class="section-tabs" v-model="centerActiveName" @tab-click="handleCenterTabClick"> <el-tabs type="card" class="section-tabs" v-model="centerActiveName" @tab-click="handleCenterTabClick">
<el-tab-pane label="2D视图" name="ModelEditor" lazy> <el-tab-pane label="2D视图" name="ModelEditor" lazy>
<Model2DEditor /> <Model2DEditor @viewportChanged="setCurrentViewport" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="3D视图" name="ModelView" lazy> <el-tab-pane label="3D视图" name="ModelView" lazy>
<ModelView /> <ModelView />
@ -69,7 +70,8 @@
<div class="section-item-wrap"> <div class="section-item-wrap">
<keep-alive> <keep-alive>
<component v-if="calcRightPanel?.component" :is="calcRightPanel.component" <component v-if="calcRightPanel?.component" :is="calcRightPanel.component"
@close="()=>closeMe('hideRight')" :key="calcRightPanel.name" /> @close="()=>closeMe('hideRight')" :key="calcRightPanel.name"
:viewport="currentViewport" />
</keep-alive> </keep-alive>
</div> </div>
</SplitArea> </SplitArea>
@ -79,7 +81,9 @@
<div class="section-item-wrap"> <div class="section-item-wrap">
<keep-alive> <keep-alive>
<component v-if="calcBottomPanel?.component" :is="calcBottomPanel.component" <component v-if="calcBottomPanel?.component" :is="calcBottomPanel.component"
@close="()=>closeMe('hideBottom')" :key="calcBottomPanel.name" /> @close="()=>closeMe('hideBottom')" :key="calcBottomPanel.name"
:viewport="currentViewport"
/>
</keep-alive> </keep-alive>
</div> </div>
</SplitArea> </SplitArea>
@ -110,6 +114,7 @@ import { getWidgetByName, getWidgetBySide, getAllWidget } from '@/runtime/Define
import Model2DEditor from '@/designer/model2DEditor/Model2DEditor.vue' import Model2DEditor from '@/designer/model2DEditor/Model2DEditor.vue'
import ModelView from '@/designer/ModelView.vue' import ModelView from '@/designer/ModelView.vue'
import { normalizeShortKey } from '@/utils/webutils.ts' import { normalizeShortKey } from '@/utils/webutils.ts'
import { markRaw } from 'vue'
export default { export default {
@ -155,6 +160,7 @@ export default {
data() { data() {
return { return {
Logo, Logo,
currentViewport: null,
calcRootMenu: getRootMenu(), calcRootMenu: getRootMenu(),
bottomSize: 30, bottomSize: 30,
hideBottom: true, hideBottom: true,
@ -217,6 +223,9 @@ export default {
methods: { methods: {
renderIcon, renderIcon,
getWidgetBySide, getWidgetBySide,
setCurrentViewport(viewport) {
this.currentViewport = viewport
},
handleCenterTabClick(tab) { handleCenterTabClick(tab) {
if (tab?.name) { if (tab?.name) {
this.centerActiveName = tab.name this.centerActiveName = tab.name

Loading…
Cancel
Save