You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GCSGUI/src/components/LayerManager.vue

120 lines
3.4 KiB
Vue

<!--
文件描述Cesium地图的图层管理器组件
创建时间2025/3/4 11:25
创建人Zhaipeixiu
-->
<script setup lang="ts">
import {ArrowBackOutline} from "@vicons/ionicons5"
import LayerItem from "@/components/LayerItem.vue";
import { darkTheme } from 'naive-ui'
import {ref} from "vue";
import {useLayerStore} from "@/store/layerManagerStore.ts";
defineExpose({
open_closeSidebar: ()=>{
// 获取侧边栏元素
let sidebar = document.querySelector('.LayerManagerSidebar');
if(sidebar?.classList.contains('open')){ //关闭侧边栏
sidebar?.classList.remove('open');
}
else { // 打开侧边栏
sidebar?.classList.add('open');
}
},
})
function closeBar() {
let sidebar = document.querySelector('.LayerManagerSidebar');
sidebar?.classList.remove('open');
}
let showWmsModal = ref(false);
let wmsConfig = {
url: ''
}
function addWMSLayer(){
window.measureViewer.AddWMSLayer(wmsConfig.url)
}
function clearLayers(){
window.measureViewer.clearLayers()
}
</script>
<template>
<div>
<n-config-provider :theme="darkTheme">
<n-layout class="LayerManagerSidebar">
<n-layout-header>
<n-row justify-content="space-between"
style="margin-bottom:.5rem; border-bottom:solid 1px #dcd9d8">
<h2 style="margin: .3rem 1rem" >图层管理</h2>
<n-button style=" margin: .6rem" @click="closeBar" size="tiny" type="error">
<template #icon>
<n-icon><ArrowBackOutline/></n-icon>
</template>
</n-button>
</n-row>
</n-layout-header>
<n-layout-content>
<n-empty size="large" description="暂未加载图层" v-show="useLayerStore().Layers.length==0"/>
<!-- 图层项目 layeritem 动态增减组件 -->
<layer-item v-for="layer in useLayerStore().Layers" :lid="layer.lId" :lname="layer.lName">
</layer-item>
</n-layout-content>
<n-layout-footer style="margin: .5rem">
<n-space justify="space-around">
<n-button size="small" type="info" @click="showWmsModal=true">
添加WMS图层
</n-button>
<n-button size="small" type="warning" @click="clearLayers">
清空图层
</n-button>
</n-space>
</n-layout-footer>
</n-layout>
</n-config-provider>
<n-modal v-model:show="showWmsModal"
style="width: 30%"
:mask-closable="false"
preset="dialog"
title="">
<template #header>
<div>WMS资源配置</div>
</template>
<div style="margin: 2rem 2rem .5rem 1rem">
<n-space>
<n-form ref="formRef" :model="wmsConfig"
label-placement="left"
label-width="auto"
require-mark-placement="right-hanging">
<n-form-item label="WMS URL">
<n-input v-model:value="wmsConfig.url" placeholder="127.0.0.1/wms"/>
</n-form-item>
</n-form>
</n-space>
<n-space justify="center">
<n-button @click="addWMSLayer" type="primary" size="small">确定</n-button>
<n-button @click="showWmsModal=false" type="warning" size="small">取消</n-button>
</n-space>
</div>
</n-modal>
</div>
</template>
<style scoped>
/* 侧边栏基础样式 */
.LayerManagerSidebar {
width: 15rem;
position: absolute;
top: 3rem;
left: -15rem; /* 默认隐藏 */
padding: 0;
border-radius: 7px;
transition: left 0.3s;
}
/* 侧边栏展开样式 */
.LayerManagerSidebar.open {
left: 0;
}
</style>