"点标注创建,渲染,添加接口,上树"

This commit is contained in:
zyl
2025-11-04 16:52:04 +08:00
parent f20bfb1797
commit 9c63a6d7e8
11 changed files with 325 additions and 129 deletions

Binary file not shown.

View File

@ -20,4 +20,16 @@ export const TsApi = {
data data
}) })
}, },
addTsSource: async (data: any) => {
return await request.post({
url: '/tsSource/add',
data
})
},
queryTsSource: async (data: any) => {
return await request.post({
url: '/tsSource/query',
data
})
},
} }

View File

@ -27,21 +27,83 @@ import {$changeComponentShow} from "../../utils/communication";
const {getSelectedNodes, cusSelectNode, getSameLevel, cusNodeIcon, nodeType} = useTreeNode() const {getSelectedNodes, cusSelectNode, getSameLevel, cusNodeIcon, nodeType} = useTreeNode()
import {showRightMenuTs} from "./tree" import {showRightMenuTs} from "./tree"
import {TsApi} from "../../api/ts";
import {initMapData} from "./entity";
const rightMenuRef: any = ref() const rightMenuRef: any = ref()
const treeObj = ref() //树形的实例 const treeObj = ref() //树形的实例
const nodes: any = ref([]) let zNodes: any = ref([])//树形结构数据
let nodes: any = ref([])//选中的node节点
let input2 = ref('') let input2 = ref('')
onMounted(() => { onMounted(() => {
let data = [ let formData = new FormData()
{ // let data = []
name: "88", formData.append('id', window["planId"])
sourceType: "directory" TsApi.queryTsSource(formData).then(async res => {
console.log('queryTsSource', res)
if (res.code == 200) {
for (let i = res.data.length - 1; i >= 0; i--) {
res.data[i].icon = await cusNodeIcon(res.data[i]);
} }
] zNodes.value = res.data
treeObj.value = $.fn.zTree.init($(`#treeDemos`), setting, data) console.log("data", zNodes.value)
treeObj.value = $.fn.zTree.init($(`#treeDemos`), setting, zNodes.value)
window.treeObj = treeObj.value window.treeObj = treeObj.value
}
}) })
})
const initTreeCallBack = () => {
let arr = zNodes.value
let layerTypes = [
"arcgisWximagery",
"arcgisBlueImagery",
"ArcgisLWImagery",
"gdlwImagery",
"gdwxImagery",
"gdslImagery",
"layer",
];
let layers: any = []
for (let i = 0; i < arr.length; i++) {
if (arr[i].sourceType === 'directory') {
continue
}
let detail = JSON.parse(arr[i].detail || '{}')
let params = JSON.parse(arr[i].params || '{}')
if (!detail.name) {
detail.name = arr[i].sourceName
}
if (!detail.id) {
detail.id = arr[i].id
}
if (layerTypes.includes(arr[i].sourceType)) {
layers.push(
{
sourceType: arr[i].sourceType,
detail: {...detail, ...params}
}
)
} else {
initMapData(arr[i].sourceType, {...detail, ...params})
}
}
layers.sort((obj1, obj2) => {
return obj1.detail.layerIndex - obj2.detail.layerIndex;
});
if (window.earth_ts) {
for (let i = 0; i < layers.length; i++) {
// initMapData(layers[i].sourceType, layers[i].detail, null)
}
}
}
const onDblClick = (event: MouseEvent, treeId: string, treeNode: any) => {
let entityObject
entityObject = (window as any)._entityMap.get(treeNode.id)
entityObject.flyTo()
}
const onClick = (event: MouseEvent, treeId: string, treeNode: any) => { const onClick = (event: MouseEvent, treeId: string, treeNode: any) => {
console.log('selectNode', treeNode) console.log('selectNode', treeNode)
@ -131,20 +193,21 @@ const setting = {
data: { data: {
key: { key: {
//zdatas数据中表示节点name的属性key //zdatas数据中表示节点name的属性key
name: "name", name: "sourceName",
checked: "is_show", checked: "isShow",
}, },
simpleData: { simpleData: {
enable: true, enable: true,
idKey: "id", idKey: "id",
pIdKey: "p_id", pIdKey: "parentId",
nameKey: "name", nameKey: "sourceName",
}, },
}, },
callback: { callback: {
onMouseDown: onMouseDown, onMouseDown: onMouseDown,
onRightClick: rightClick, onRightClick: rightClick,
onClick: onClick, onClick: onClick,
onDblClick: onDblClick
/* /*
onClick: this.onClick, onClick: this.onClick,
onDblClick: this.onDblClick, onDblClick: this.onDblClick,
@ -162,8 +225,11 @@ const setting = {
beforeClick: this.zTreeBeforeClick, beforeClick: this.zTreeBeforeClick,
onCheck: this.onCheck*/ onCheck: this.onCheck*/
}, },
}
}
defineExpose({
initTreeCallBack
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -189,6 +255,19 @@ const setting = {
height: 100%; height: 100%;
} }
} }
:deep("li a.curSelectedNode") {
background-color: #ffe6b0 !important;
}
.ztree {
li {
a.curSelectedNode {
}
}
}
} }
:deep(.el-input__wrapper), :deep(.el-input__inner ) { :deep(.el-input__wrapper), :deep(.el-input__inner ) {

View File

@ -1,6 +1,8 @@
import {$changeComponentPop} from "../../../utils/communication";
export const useRightOperate = () => { export const useRightOperate = () => {
const addDirectory = () => { const addDirectory = () => {
// $changeComponentPop('.adddirectoryBox', true) $changeComponentPop('.adddirectoryBox', true)
console.log("addDirectory") console.log("addDirectory")
} }
const addResource = () => { const addResource = () => {

View File

@ -4,10 +4,11 @@
<use xlink:href="#icon-tuichu"></use> <use xlink:href="#icon-tuichu"></use>
</svg> </svg>
<div id="earthContainer" class="fullSize"></div> <div id="earthContainer" class="fullSize"></div>
<cabin></cabin> <cabin ref="cabin"></cabin>
<element></element> <element></element>
<deduction :TSOBJ="tsOBJ"></deduction> <deduction :TSOBJ="tsOBJ"></deduction>
<newEvent></newEvent> <newEvent></newEvent>
<addDirectory class="adddirectoryBox absolute zIndex999"></addDirectory>
</div> </div>
</template> </template>
@ -18,9 +19,11 @@ import Cabin from "./cabin.vue"
import Element from "./element.vue" import Element from "./element.vue"
import NewEvent from "./newEvent.vue" import NewEvent from "./newEvent.vue"
import Deduction from "./deduction.vue"; import Deduction from "./deduction.vue";
import AddDirectory from './components/tsdirectory.vue'
import {TS} from "./sdk"; import {TS} from "./sdk";
import * as domain from "domain"; import * as domain from "domain";
let cabin = ref()
let tsOBJ = reactive({}) let tsOBJ = reactive({})
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
@ -33,6 +36,7 @@ for (const routeQueryKey in route.query) {
} }
} }
console.log("params", params) console.log("params", params)
window.planId = params.id
// 通过planID获取方案包含的所有事件 // 通过planID获取方案包含的所有事件
let getEventList = () => { let getEventList = () => {
@ -79,6 +83,7 @@ const createEarth = async () => {
setTimeout(() => { setTimeout(() => {
new YJ.Tools(window.earth_ts).flyHome() new YJ.Tools(window.earth_ts).flyHome()
}, 1000) }, 1000)
cabin.value.initTreeCallBack()
} }
const closeSituationEdit = () => { const closeSituationEdit = () => {
router.back() router.back()
@ -96,5 +101,9 @@ const closeSituationEdit = () => {
height: 2.2222222222vh !important; height: 2.2222222222vh !important;
cursor: pointer; cursor: pointer;
} }
.adddirectoryBox {
display: none;
}
} }
</style> </style>

View File

@ -55,8 +55,11 @@ import {ref, onMounted} from "vue";
import {Search} from '@element-plus/icons-vue' import {Search} from '@element-plus/icons-vue'
import {ModelApi} from "../../api/model"; import {ModelApi} from "../../api/model";
import {GraphApi} from "../../api/graphLabel"; import {GraphApi} from "../../api/graphLabel";
import {addMapSource} from "./entity";
import {addMapSource} from "./entity";
import {useTreeNode} from "../components/tree/hooks/treeNode";
const {getSelectedNodes} = useTreeNode()
const service = ref(localStorage.getItem('ip')) const service = ref(localStorage.getItem('ip'))
interface Tree { interface Tree {
@ -158,11 +161,15 @@ let getGraphTypeList = async () => {
} }
// 添加标绘 // 添加标绘
let addMarker = (item) => { let addMarker = (item) => {
let nodes = getSelectedNodes(window['treeObj'])
console.log("绘制" + item.name) console.log("绘制" + item.name)
console.log("获取选中的节点", nodes)
let id = new YJ.Tools().randomString()
let pId = nodes.length >= 1 ? nodes[0].id : -1
window.draw = new YJ.Draw[item.funName](earth_ts) window.draw = new YJ.Draw[item.funName](earth_ts)
window.draw.start((a, position) => { window.draw.start((a, position) => {
console.log(position) console.log(position)
addMapSource({id: 777, type: item.type, name: item.source_name, position}) addMapSource({id, type: item.type, name: item.source_name, position, pId})
}) })
} }

View File

@ -1,4 +1,9 @@
export function addMapSource(option) { import {TsApi} from "../../api/ts";
import {useTreeNode} from '@/views/components/tree/hooks/treeNode'
const {cusAddNodes, getSelectedNode} = useTreeNode()
export function addMapSource(option, cb: any = null) {
console.log("添加到地球上", option) console.log("添加到地球上", option)
let id = option.id || new YJ.Tools().randomString() let id = option.id || new YJ.Tools().randomString()
let name = option.name let name = option.name
@ -24,5 +29,37 @@ export function addMapSource(option) {
} }
console.log('options', options) console.log('options', options)
// 进数据库 // 进数据库
// 上树 let dbOption = {
"id": option.id,
"sourceName": name,
"sourceType": option.type,
"sourcePath": "",
"parentId": option.pId,
"treeIndex": 0,
"isShow": 1,
"detail": JSON.stringify(options) || '{}',
"params": "",
"planId": window['planId']
}
console.log('dbOption', dbOption)
TsApi.addTsSource(dbOption).then(res => {
console.log("addTsSource", res)
cb && cb(res)
// 上树
cusAddNodes(window.treeObj, getSelectedNode(window.treeObj), [dbOption], true)
})
}
export function initMapData(type, data) {
let entityObject
switch (type) {
case 'point':
console.log("ssssssss+++", window['earth_ts'])
entityObject = new YJ.Obj.BillboardObject(window['earth_ts'], data)
}
if (entityObject) {
if (entityObject.options.id) {
(window as any)._entityMap.set(entityObject.options.id, entityObject)
}
}
} }

View File

@ -151,7 +151,10 @@ const getList = (params = null) => {
formData.append(paramsKey, params[paramsKey]) formData.append(paramsKey, params[paramsKey])
} }
} }
} }
formData.append('username', params["createdBy"])
} }
TsApi.planList(formData).then(res => { TsApi.planList(formData).then(res => {
console.log(res) console.log(res)
@ -175,7 +178,7 @@ const toTSEdit = (row) => {
console.log("当前推演方案", row) console.log("当前推演方案", row)
router.push({ router.push({
name: 'tsEdit', // 必须用 name 匹配路由,不能用 path name: 'tsEdit', // 必须用 name 匹配路由,不能用 path
query: {id: 123, name: "战时推演", start_time: 946684800000} query: {id: row.id, name: row.name, start_time: new Date(row.simulationStartTime).getTime()}
}) })
} }
const delPlan = (id) => { const delPlan = (id) => {

View File

@ -11,28 +11,31 @@
</template> </template>
<div class="set_detail"> <div class="set_detail">
<el-form <el-form
ref="ruleFormRef"
style="max-width: 600px" style="max-width: 600px"
:model="sizeForm" :model="sizeForm"
label-width="auto" label-width="auto"
:label-position="'top'" :label-position="'top'"
:rules="rules"
> >
<el-form-item label="推演名称"> <el-form-item label="推演名称" prop="name" required>
<el-input v-model="sizeForm.name" placeholder="请填写名称"/> <el-input v-model="sizeForm.name" placeholder="请填写名称"/>
</el-form-item> </el-form-item>
<el-form-item label="仿真开始时间"> <el-form-item label="仿真开始时间" prop="simulationStartTime" required>
<el-date-picker <el-date-picker
v-model="sizeForm.date1" v-model="sizeForm.simulationStartTime"
type="datetime" type="datetime"
timezone="Asia/Shanghai"
value-format="YYYY-MM-DDTHH:mm:ss"
placeholder="请选择日期时间" placeholder="请选择日期时间"
/> />
</el-form-item> </el-form-item>
<el-form-item label="推演描述" prop="desc"> <el-form-item label="推演描述" prop="desc" required>
<el-input v-model="sizeForm.desc" type="textarea" placeholder="请输入内容描述"/> <el-input v-model="sizeForm.desc" type="textarea" placeholder="请输入内容描述"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<div class="optionbtn"> <div class="optionbtn">
<el-button @click="addPlan">确定</el-button> <el-button @click="addPlan(ruleFormRef)">确定</el-button>
<el-button>取消</el-button> <el-button>取消</el-button>
</div> </div>
</el-form-item> </el-form-item>
@ -45,19 +48,53 @@
<script lang="ts" setup> <script lang="ts" setup>
import {ref, reactive,} from "vue"; import {ref, reactive,} from "vue";
import {ElMessage} from 'element-plus' import {ElMessage, FormInstance, FormRules} from 'element-plus'
import {TsApi} from "../../api/ts"; import {TsApi} from "../../api/ts";
const eventBus: any = inject('bus') const eventBus: any = inject('bus')
const emit = defineEmits(['addCallback']); const emit = defineEmits(['addCallback']);
const isShowPup = ref(false) const isShowPup = ref(false)
const sizeForm = reactive({
interface RuleForm {
name: string,
simulationStartTime: string,
desc: string,
}
const ruleFormRef = ref<FormInstance>()
const sizeForm = reactive<RuleForm>({
name: '', name: '',
// date1: '', simulationStartTime: '',
desc: '', desc: '',
}) })
const addPlan = () => {
TsApi.addPlan({name: sizeForm.name, desc: sizeForm.desc}).then(res => { const rules = reactive<FormRules<RuleForm>>({
name: [
{required: true, message: '推演名称不能为空', trigger: 'blur'},
],
desc: [
{required: true, message: '推演描述不能为空', trigger: 'blur'},
],
simulationStartTime: [
{required: true, message: '仿真开始时间不能为空', trigger: 'blur'},
],
})
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('submit!')
} else {
console.log('error submit!', fields)
}
})
}
const addPlan = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
TsApi.addPlan(sizeForm).then(res => {
console.log(res) console.log(res)
if (res.code == 200) { if (res.code == 200) {
ElMessage({ ElMessage({
@ -68,6 +105,11 @@ const addPlan = () => {
} }
$(".newPlan")[0].style.display = "none" $(".newPlan")[0].style.display = "none"
}) })
} else {
console.log('提交失败', fields)
}
})
} }
eventBus.on('openAddPlan', (data, cb, type) => { eventBus.on('openAddPlan', (data, cb, type) => {
// selectCallback = cb // selectCallback = cb

View File

@ -274,6 +274,8 @@ const handleClick = (item: any, e) => {
if ((window as any).checkAuthIsValid) { if ((window as any).checkAuthIsValid) {
console.log('打开态势推演') console.log('打开态势推演')
ipcRenderer.send('toggle-fullscreen', true) ipcRenderer.send('toggle-fullscreen', true)
window['earth'].destroy()
window['earth'] = null
router.push({path: '/ts'}) router.push({path: '/ts'})
} else { } else {
@ -493,6 +495,7 @@ const clickMenu = (item: any) => {
// background-size: 100% 100%; // background-size: 100% 100%;
transition: all 0.3s ease; transition: all 0.3s ease;
cursor: pointer; cursor: pointer;
> svg { > svg {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@ -7,7 +7,15 @@ import { ElMessage } from 'element-plus'
export const useTree = () => { export const useTree = () => {
const rightMenuRef: any = ref() //右键菜单的实例 const rightMenuRef: any = ref() //右键菜单的实例
const treeObj = ref() //树形的实例 const treeObj = ref() //树形的实例
const { getSelectedNodes, showRightMenu, cusUpdateNode, cusSelectNode, getSameLevel, cusNodeIcon, nodeType } = useTreeNode() //树上一系列的方法hooks const {
getSelectedNodes,
showRightMenu,
cusUpdateNode,
cusSelectNode,
getSameLevel,
cusNodeIcon,
nodeType
} = useTreeNode() //树上一系列的方法hooks
const nodes: any = ref([]) const nodes: any = ref([])
/** /**
* 用于捕获zTree上鼠标按键按下后的事件回调函数 * 用于捕获zTree上鼠标按键按下后的事件回调函数
@ -79,8 +87,7 @@ export const useTree = () => {
let t = window.earth.entityMap.get(n.id) let t = window.earth.entityMap.get(n.id)
if (t) { if (t) {
return t return t
} } else {
else {
if (n.parentId) { if (n.parentId) {
return getEntityObject(window.treeObj.getNodeByParam("id", n.parentId, null)) return getEntityObject(window.treeObj.getNodeByParam("id", n.parentId, null))
} }
@ -89,8 +96,7 @@ export const useTree = () => {
} }
entityObject = getEntityObject(treeNode) entityObject = getEntityObject(treeNode)
entityObject.flyTo(treeNode.id) entityObject.flyTo(treeNode.id)
} } else if (treeNode.sourceType === "roam") {
else if (treeNode.sourceType === "roam") {
// 飞行漫游 // 飞行漫游
ElMessage({ ElMessage({
message: '单击鼠标右键可结束当前漫游', message: '单击鼠标右键可结束当前漫游',
@ -99,8 +105,7 @@ export const useTree = () => {
let params = JSON.parse(treeNode.params) let params = JSON.parse(treeNode.params)
YJ.Global.FlyRoam.flyTo((window as any).earth, params.points); YJ.Global.FlyRoam.flyTo((window as any).earth, params.points);
return; return;
} } else {
else {
if (treeNode.sourceType == 'pressModel') { if (treeNode.sourceType == 'pressModel') {
entityObject = (window as any).pressModelEntities.get(treeNode.id) entityObject = (window as any).pressModelEntities.get(treeNode.id)
} else { } else {
@ -289,8 +294,7 @@ export const useTree = () => {
} }
) )
window.treeObj.checkNode(parentNode, false, true); window.treeObj.checkNode(parentNode, false, true);
} } else {
else {
p_ids.push( p_ids.push(
{ {
id: parentNode.id, id: parentNode.id,
@ -307,6 +311,7 @@ export const useTree = () => {
let ids = [...p_ids] let ids = [...p_ids]
// 更新节点状态修改地图资源状态 // 更新节点状态修改地图资源状态
function sourceStatus(node) { function sourceStatus(node) {
ids.push({id: node.id, isShow: node.isShow ? 1 : 0}) ids.push({id: node.id, isShow: node.isShow ? 1 : 0})
@ -316,8 +321,7 @@ export const useTree = () => {
sourceStatus(item) sourceStatus(item)
}) })
} }
} } else {
else {
let params = JSON.parse(node.params) let params = JSON.parse(node.params)
let entityObject let entityObject
if (node.sourceType == 'pressModel') { if (node.sourceType == 'pressModel') {
@ -368,7 +372,6 @@ export const useTree = () => {
} }
// let source_ids = []; // let source_ids = [];
// nodes.forEach((item) => { // nodes.forEach((item) => {
// if (item.isHidden == false) { // if (item.isHidden == false) {
@ -604,7 +607,7 @@ export const useTree = () => {
brightness: 1 brightness: 1
}) })
} }
res.data.list[i].svg = await cusNodeIcon(res.data.list[i]); res.data.list[i].icon = await cusNodeIcon(res.data.list[i]);
} }
} }
zNodes.value = res.data.list zNodes.value = res.data.list
@ -686,8 +689,7 @@ export const useTree = () => {
params: {...detail, ...params} params: {...detail, ...params}
} }
) )
} } else {
else {
initMapData(zNodes.value[i].sourceType, {...detail, ...params}, null) initMapData(zNodes.value[i].sourceType, {...detail, ...params}, null)
} }
} }