2023-11-21 18:25:11 +08:00

303 lines
7.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="main-content">
<div class="main-content-title">
<span>设备添加</span>
<el-icon size="16" color="#fff" @click="closeDiv"><Close /></el-icon>
</div>
<div class="operate-btn">
<el-button type="primary" @click="drawPoint"></el-button>
</div>
<div class="addHttpMqttServicePage">
<CodeMirror
v-model:code="code"
dark
:codeStyle="{ width: '100%', height: '200px', fontSize: '16px' }"
:disabled="false"
:extensions="extensions"
@ready="onReady"
@change="onChange"
@focus="onFocus"
@blur="onBlur"
/>
<!-- <codemirror
v-model="code"
placeholder="Code goes here..."
:style="{ height: '400px' }"
:autofocus="true"
:indent-with-tab="true"
:tab-size="2"
:extensions="extensions"
@ready="onReady"
@change="onChange"
@focus="onFocus"
@blur="onBlur"
/>
<component :is="previewComp"></component> -->
</div>
</div>
</template>
<script lang="ts" setup>
//引入cesium基础库
import "mars3d-cesium/Build/Cesium/Widgets/widgets.css";
import * as Cesium from "mars3d-cesium";
//导入mars3d主库
import "mars3d/dist/mars3d.css";
import * as mars3d from "mars3d";
import { defineAsyncComponent, ref, shallowRef, watch, onMounted, onUnmounted } from "vue";
import * as Vue from "vue";
// import { Codemirror } from "vue-codemirror";
import { javascript } from "@codemirror/lang-javascript";
import { vue } from "@codemirror/lang-vue";
import { oneDark } from "@codemirror/theme-one-dark";
import { loadModule } from "vue3-sfc-loader";
import { initVue3Popup } from "@/utils/file-util";
import QueryPopup from "./query-popup.vue";
import OutsidePopup from "http://jxjzw.zhgdyun.com:9001/wisdomsitezw/655c756d12b3a489008940c9.vue";
const code = ref("");
const previewComp = shallowRef();
const extensions = [vue(), oneDark];
import CodeMirror from "@/components/CodeMirror/index.vue";
const props = defineProps(["mapInstance", "graphicInstance"]);
const emits = defineEmits(["hiddenConfim"]);
const form = ref({
script: ""
});
let map: any = props.mapInstance;
let graphicLayer: any = props.graphicInstance;
const addRandomGraphicByCount = () => {
const graphicImg = new mars3d.graphic.DivGraphic({
// position: [117.077462, 31.657745, 60],
position: [113.933005, 22.518904, 60],
style: {
html: ` <div class="mars3d-camera-content">
<img class="mars3d-camera-img" src="${
new URL("@/assets/images/Mars3DImg/icon/camera.svg", import.meta.url).href
}" >
</div>
<div class="mars3d-camera-line" ></div>
<div class="mars3d-camera-point"></div>
`,
offsetX: -16,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 100000)
}
// popup: `${code.value}`,
// popupOptions: {
// offsetY: -170, // 显示Popup的偏移值,是DivGraphic本身的像素高度值
// template: `<div class="marsBlackPanel animation-spaceInDown">
// <div class="marsBlackPanel-text">{content}</div>
// <span class="mars3d-popup-close-button closeButton" >×</span>
// </div>`,
// horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
// verticalOrigin: Cesium.VerticalOrigin.CENTER
// }
});
// const comp = () => import("http://jxjzw.zhgdyun.com:9001/wisdomsitezw/655c756d12b3a489008940c9.vue");
// console.log(comp);
graphicImg.bindPopup((event: any) => {
const attr = event.graphic.attr || {};
if (!attr) {
return;
}
const dom = initVue3Popup(OutsidePopup, attr);
return dom;
});
graphicLayer.addGraphic(graphicImg);
};
// 绘制点
const drawPoint = () => {
graphicLayer.startDraw({
type: "point",
style: {
pixelSize: 12,
color: "#3388ff",
label: {
// 不需要文字时去掉label配置即可
text: "可以同时支持文字",
font_size: 20,
color: "#ffffff",
outline: true,
outlineColor: "#000000",
pixelOffsetY: -20
}
}
});
};
const closeDiv = () => {
emits("hiddenConfim");
};
const onReady = (payload: any) => {
console.log("ready:", payload);
};
const onChange = (value: string, viewUpdate: any) => {
console.log("change:", value);
console.log("change:", viewUpdate);
};
const onFocus = (viewUpdate: any) => {
console.log("focus:", viewUpdate);
};
const onBlur = (viewUpdate: any) => {
console.log("blur:", viewUpdate);
console.log(code.value, "6666666666777777777");
try {
const options = {
moduleCache: {
vue: Vue
},
async getFile() {
return code.value;
},
addStyle(textContent) {
const style = Object.assign(document.createElement("style"), {
textContent
});
const ref = document.head.getElementsByTagName("style")[0] || null;
document.head.insertBefore(style, ref);
}
};
const comp = defineAsyncComponent(() => loadModule("./textPopup.vue", options));
console.log(comp);
previewComp.value = comp;
addRandomGraphicByCount();
} catch (err) {
console.error(err);
}
};
onMounted(() => {
console.log(map, "66666");
console.log(QueryPopup, "777888");
});
onUnmounted(() => {
map = null;
});
</script>
<style scoped lang="scss">
@mixin flex {
display: flex;
align-items: center;
}
// 菜单弹框出现动画
@keyframes fadeIn {
0% {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
100% {
opacity: 1;
transform: none;
}
}
.main-content {
position: absolute;
top: 60px;
right: 10px;
padding: 0 !important;
background-image: none !important;
border: 1px solid #008aff70;
border-radius: 2px !important;
background-color: rgba(23, 49, 71, 0.8);
width: 500px;
height: 500px;
box-shadow: 0 4px 15px 1px #02213bb3;
animation: fadeIn 1s;
&-title {
@include flex;
width: 100%;
height: 40px;
padding: 0 5px 0 10px;
background-image: url("@/assets/images/Mars3DIcon/subClassTitle.png");
background-size: 100% 100%;
background-repeat: no-repeat;
span {
font-size: 16px;
color: #0089fe;
margin-right: auto;
}
:deep() {
.el-icon {
cursor: pointer;
}
}
}
.addHttpMqttServicePage {
width: 100%;
height: 100%;
padding: 20px;
&-header {
font-size: 18px;
font-weight: bold;
}
&-body {
padding-top: 24px;
width: 50%;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
}
}
// 图上图形样式
:deep() {
.marsGreenGradientPnl {
color: white;
}
}
// element 组件样式
:deep() {
.el-input__wrapper {
background-color: transparent;
}
.el-input__inner {
color: white;
}
.el-button {
background: rgba(51, 89, 181, 0.6);
border-radius: 6px;
border: 0;
}
.el-select,
.el-input,
.el-input__inner {
border-radius: 10px;
color: #fff;
//border: 1px solid green;
border-radius: 0px;
border-color: green;
text-align: center;
}
//修改总体选项的样式 最外层
.el-select__popper.el-popper {
border: 0;
background-color: transparent;
box-shadow: none;
}
.el-select-dropdown {
background: rgba(11, 22, 51, 0.7);
box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25);
opacity: 1;
border: 1px solid #3b60a7;
border-radius: 0px;
}
//修改单个的选项的样式
.el-select-dropdown__item {
background-color: transparent;
color: #fff;
}
//item选项的hover样式
.el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
color: white;
background: linear-gradient(90deg, rgba(49, 96, 179, 0) 0%, #3160b3 51%, rgba(49, 96, 179, 0) 100%);
}
.el-popper__arrow::before {
display: none;
}
}
</style>