添加导弹

This commit is contained in:
严争鸣 2025-05-09 18:09:03 +08:00
parent fce2eb5df3
commit 6af0bab0d6
11 changed files with 272 additions and 130 deletions

Binary file not shown.

View File

@ -7,3 +7,19 @@ export function getDaodanTree() {
method: 'get',
})
}
export function updateDDManualConfigTrajInfo(data) {
return request({
url: `${baseUrl}/dd/gjInfo`,
method: 'PUT',
data,
})
}
export function uploadDDSTKFile(data) {
return request({
url: `${baseUrl}/dd/upload-stk`,
method: 'POST',
data,
})
}

View File

@ -8,29 +8,28 @@ import { useTestConfig } from './hooks/testHooks'
const panels = ['手动配置', 'STK轨迹文件配置']
export default defineComponent({
setup() {
const { daodanData, showOrHideDdConfig } = useDaodan()
const { daodanData, showOrHideDdConfig, getDaodanTreeData } = useDaodan()
const {
trajData,
boosterList,
interceptData,
loadStoreData,
loadData,
saveDataToStore,
addIntercept,
initDaodan,
saveDataToBackend,
} = useTestConfig()
watch(daodanData, newval => {
loadStoreData()
// console.log(newval, '-=----')
// loadStoreData()
loadData()
// console.log(daodanData.value, 'newval')
})
const name = ref('手动配置')
// const handleClose = () => {}
const confirm = () => {
// initDaodan()
saveDataToStore()
// saveDataToStore()
saveDataToBackend()
showOrHideDdConfig({})
getDaodanTreeData()
}
const removeIntercept = id => {
@ -96,11 +95,37 @@ export default defineComponent({
</>
) : (
<>
<TrajUpload title="轨迹点" />
<TrajUpload title="一级助推器" />
<TrajUpload title="二级助推器" />
<TrajUpload title="三级助推器" />
<TrajUpload title="拦截" />
<TrajUpload
title="轨迹点"
ddData={daodanData.value}
type={daodanData.value.id}
tableData={
daodanData.value.stkInfo?.[daodanData.value.id] ||
[]
}
/>
{['一级助推器', '二级助推器', '三级助推器'].map(
(title, index) => (
<TrajUpload
title={title}
ddData={daodanData.value}
type={`booster-${index + 1}`}
tableData={
daodanData.value.stkInfo?.[
`booster-${index + 1}`
] || []
}
/>
)
)}
<TrajUpload
title="拦截"
ddData={daodanData.value}
type={'intercept-1'}
tableData={
daodanData.value.stkInfo?.['intercept-1'] || []
}
/>
</>
)}
</div>

View File

@ -125,8 +125,10 @@ export default defineComponent({
title: getTitle('time'),
key: 'time',
render(row) {
return (
return row.name !== '最高点' ? (
<NDatePicker v-model:value={row.time} type="datetime"></NDatePicker>
) : (
'-'
)
},
},
@ -146,18 +148,18 @@ export default defineComponent({
return dict[key] || key
}
const dialog = useDialog()
const remove = () => {
dialog.warning({
title: '删除拦截',
content: '确定删除该拦截吗?',
positiveText: '确定',
negativeText: '取消',
onPositiveClick: () => {
emit('removeIntercept', dataId.value)
},
})
}
// const dialog = useDialog()
// const remove = () => {
// dialog.warning({
// title: '',
// content: '',
// positiveText: '',
// negativeText: '',
// onPositiveClick: () => {
// emit('removeIntercept', dataId.value)
// },
// })
// }
const columnsFilter = computed(() => {
if (props.title === '轨迹点') {

View File

@ -1,4 +1,5 @@
import { NUpload, NButton } from 'naive-ui'
import { NUpload, NButton, NDataTable } from 'naive-ui'
import { time2Format } from '@/utils/date'
export default defineComponent({
name: 'TrajUpload',
@ -7,17 +8,82 @@ export default defineComponent({
type: String,
required: true,
},
ddData: {
type: Object,
default: () => ({}),
},
type: {
type: String,
default: '',
},
tableData: {
type: Array,
default: () => [],
},
},
setup(props, { emit }) {
const columns = [
{
title: '序号',
key: 'index',
width: 80,
render: (row, rowIndex) => {
return rowIndex + 1
},
},
{
title: '经度',
key: 'lon',
width: 120,
},
{
title: '纬度',
key: 'lat',
},
{
title: '高度',
key: 'alt',
},
{
title: '时间',
key: 'time',
render: row => {
return time2Format(row.time)
},
// width: 120,
},
]
const tableData = ref([])
function handleFinish({ file, event }) {
console.log(JSON.parse(event.target.response))
const { data } = JSON.parse(event.target.response)
tableData.value = data.stkInfo[props.ddData.id]
}
return () => (
<>
<div class="detail-item-title">{props.title}</div>
<div class="flex items-center gap-2">
<div class="w-[80px]">STK 文件</div>
<NUpload action="https://www.mocky.io/v2/5e4bafc63100007100d8b70f">
<NUpload
action={`api/${window.settings.apis}/dd/upload-stk`}
data={{ fileId: props.type, daoDanId: props.ddData.id }}
onFinish={handleFinish}
>
<NButton>上传文件</NButton>
</NUpload>
</div>
<div>
<NDataTable
max-height={250}
columns={columns}
data={
props.tableData.length > 0 ? props.tableData : tableData.value
}
></NDataTable>
</div>
</>
)
},

View File

@ -246,7 +246,7 @@ function addDaodan(trajData, type = 0) {
let minTime = 0
function initDaodan() {
saveDataToStore()
// saveDataToStore()
minTime = getMinTime([
...toRaw(trajData.value.data),
// ...toRaw(interceptData.value.map(item => toRaw(item.data))).flat(Infinity),

View File

@ -60,8 +60,7 @@ export function useDDPlay({
function computePath(daodan, trajData, type) {
const { id, data: ddTrajData } = trajData
ddTrajData[1].lon = (ddTrajData[0].lon + ddTrajData[2].lon) / 2
ddTrajData[1].lat = (ddTrajData[0].lat + ddTrajData[2].lat) / 2
const points = ddTrajData.map(item => {
const { time, lon, lat, alt } = item
@ -691,7 +690,7 @@ export function useDDPlay({
position: positionProperty,
polyline: {
positions: positionList,
width: 8,
width: 16,
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.1,
color: type
@ -726,6 +725,8 @@ export function useDDPlay({
return {
entities: [pathLine, ddMap, boosterMap, interceptMap],
addDaodan,
removeAllEntity,
}
}

View File

@ -3,8 +3,7 @@ import { useDaodan } from '../../ddHooks'
import { cartesian32LonLat } from '@/utils/pos'
import { generateId } from '@/utils/id'
import store from 'store2'
import { useDDPlay } from './ddPlayHooks'
// import { useDaodan } from '../../ddHooks'
import { updateDDManualConfigTrajInfo } from '@/api/daodan'
const trajData = ref({
id: 'dd',
@ -21,7 +20,7 @@ const trajData = ref({
lon: null,
lat: null,
alt: 2000000,
time: 1183135280000,
time: null,
},
{
name: '落点',
@ -82,14 +81,29 @@ export function useTestConfig() {
boosterList,
interceptData,
loadStoreData,
loadData,
addIntercept,
handleClickPoint,
saveDataToStore,
addCheckedDaodan,
initDaodan,
saveDataToBackend,
}
}
async function saveDataToBackend() {
const { id, name, country } = toRaw(daodanData.value)
const { data, msg } = await updateDDManualConfigTrajInfo({
id,
gjInfo: {
id,
name,
country,
trajData: trajData.value,
boosterList: boosterList.value,
interceptData: interceptData.value,
},
})
}
function saveDataToStore() {
// test()
const daodanDataRaw = toRaw(daodanData.value)
@ -118,6 +132,15 @@ function loadStoreData() {
}
}
function loadData() {
const daodanDataRaw = toRaw(daodanData.value)
const data = daodanDataRaw.gjInfo
if (data) {
trajData.value = data.trajData
interceptData.value = data.interceptData
}
}
function addIntercept() {
// d
interceptData.value.push({
@ -163,77 +186,3 @@ function handleClickPoint(rowData) {
rowData.lat = position[1]
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
}
// function initDaodan() {
// saveDataToStore()
// const minTime = getMinTime([
// ...toRaw(trajData.value.data),
// // ...toRaw(interceptData.value.map(item => toRaw(item.data))).flat(Infinity),
// ])
// // console.log(minTime)
// const { addDaodan } = useDDPlay({
// ddData: {
// ...toRaw(daodanData.value),
// trajData: trajData.value,
// boosterList: boosterList.value,
// interceptData: interceptData.value,
// },
// startTimeStampOfAnimation: Date.now(),
// isAniCalcBasedOnCurrentTime: true,
// minTime: minTime,
// })
// addDaodan()
// }
function addCheckedDaodan(ids) {
const storeDaodanData = store.get('daodanData')
if (ids.length > 0 && storeDaodanData) {
let daodanList = Object.values(storeDaodanData).filter(daodan => {
return ids.includes(daodan.id)
})
daodanList.forEach(item => {
initDaodan(item)
})
}
}
function initDaodan(daodanData, isAniCalcBasedOnCurrentTime = true) {
const { trajData } = daodanData
const minTime = getMinTime([...trajData.data])
const { entities, addDaodan } = useDDPlay({
ddData: {
...daodanData,
},
startTimeStampOfAnimation: Date.now(),
isAniCalcBasedOnCurrentTime,
minTime: minTime,
})
addDaodan()
setInterval(() => {
console.log('entities', entities)
}, 2000)
}
function getMinTime(data) {
let minTime = Infinity
data.forEach(item => {
minTime = Math.min(item.time, minTime)
})
return minTime
}
function dianhuo(ddPrimitive) {
modelAnimationController({
primitive: ddPrimitive,
type: 'BoosterFlames Size',
initVal: 0,
maxVal: 1,
step: 0.1,
fn: () => {
console.log('%c点火', 'color: red;font-size: 20px;border: 1px solid red')
},
})
}

View File

@ -1,6 +1,8 @@
import { onMounted, ref, watch } from 'vue'
import { getDaodanTree } from '@/api/Daodan'
import store from 'store2'
import { useTree } from '@/utils/tree'
import { difference } from 'lodash'
import { useDDPlay } from './components/hooks/ddPlayHooks'
// import { useTestConfig } from './components/hooks/testHooks'
const isLoading = ref(false)
@ -19,12 +21,87 @@ async function getDaodanTreeData() {
const daodanRes = await getDaodanTree()
const { code, data } = daodanRes
if (code === '200') {
// console.log(data, 'baseRes')
treeData.value = [data]
}
isLoading.value = false
}
const { filterTreeNodeByField } = useTree()
const daodanMap = new Map()
function addCheckedDaodan(ids) {
const addIds = difference(ids, [...daodanMap.keys()])
const removeIds = difference([...daodanMap.keys()], ids)
if (addIds.length > 0) {
const nodes = filterTreeNodeByField({
treeData: treeData.value,
params: addIds,
paramName: 'dataId',
})
nodes.forEach(node => {
console.log(node.data, '-----')
node?.data?.gjInfo && initDaodan(node.data.gjInfo)
})
// console.log(nodes, 'nodes------')
// nodes.forEach(node => {
// const {
// data: { stkInfo },
// } = node
// Object.keys(stkInfo).forEach(key => {
// const color = Cesium.Color.fromRandom().withAlpha(1)
// stkInfo[key].forEach(item => {
// viewer.entities.add({
// position: Cesium.Cartesian3.fromDegrees(
// item.lon,
// item.lat,
// item.alt
// ),
// point: {
// color: color,
// pixelSize: 5,
// },
// })
// })
// })
// })
}
if (removeIds.length > 0) {
// removeDaodan(removeIds)
removeIds.forEach(id => {
daodanMap.get(removeIds[0])?.removeAllEntity()
})
}
}
function initDaodan(daodanData, isAniCalcBasedOnCurrentTime = true) {
const { trajData } = daodanData
const { data } = trajData
data[1].lon = (data[0].lon + data[2].lon) / 2
data[1].lat = (data[0].lat + data[2].lat) / 2
data[1].time = (data[2].time - data[0].time) / 2 + data[0].time
const minTime = getMinTime(data)
console.log(minTime, data)
const daodanPlay = useDDPlay({
ddData: {
...daodanData,
},
startTimeStampOfAnimation: Date.now(),
isAniCalcBasedOnCurrentTime,
minTime: minTime,
})
daodanMap.set(daodanData.id, daodanPlay)
daodanPlay.addDaodan()
}
function getMinTime(data) {
let minTime = Infinity
data.forEach(item => {
minTime = Math.min(item.time, minTime)
})
return minTime
}
export function useDaodan() {
return {
showDdConfigCom,
@ -33,5 +110,6 @@ export function useDaodan() {
isLoading,
daodanData,
treeData,
addCheckedDaodan,
}
}

View File

@ -6,10 +6,15 @@ import { onMounted } from 'vue'
export default defineComponent({
setup() {
const { treeData, isLoading, showOrHideDdConfig, getDaodanTreeData } =
useDaodan()
const {
treeData,
isLoading,
showOrHideDdConfig,
getDaodanTreeData,
addCheckedDaodan,
} = useDaodan()
const { addCheckedDaodan } = useTestConfig()
// const { addCheckedDaodan } = useTestConfig()
onMounted(() => {
getDaodanTreeData()

View File

@ -52,18 +52,18 @@ onMounted(async () => {
viewer.scene.postProcessStages.fxaa.enabled = true
viewer.scene.skyBox = new Cesium.SkyBox({
sources: {
positiveX: 'GV/resources/theme/skyBox/PositiveX.jpg',
negativeX: 'GV/resources/theme/skyBox/NegativeX.jpg',
positiveY: 'GV/resources/theme/skyBox/PositiveY.jpg',
negativeY: 'GV/resources/theme/skyBox/NegativeY.jpg',
positiveZ: 'GV/resources/theme/skyBox/PositiveZ.jpg',
negativeZ: 'GV/resources/theme/skyBox/NegativeZ.jpg',
// positiveX: './images/skybox/skyCube2k_px.jpg',
// negativeX: './images/skybox/skyCube2k_mx.jpg',
// positiveY: './images/skybox/skyCube2k_py.jpg',
// negativeY: './images/skybox/skyCube2k_my.jpg',
// positiveZ: './images/skybox/skyCube2k_pz.jpg',
// negativeZ: './images/skybox/skyCube2k_mz.jpg',
// positiveX: 'GV/resources/theme/skyBox/PositiveX.jpg',
// negativeX: 'GV/resources/theme/skyBox/NegativeX.jpg',
// positiveY: 'GV/resources/theme/skyBox/PositiveY.jpg',
// negativeY: 'GV/resources/theme/skyBox/NegativeY.jpg',
// positiveZ: 'GV/resources/theme/skyBox/PositiveZ.jpg',
// negativeZ: 'GV/resources/theme/skyBox/NegativeZ.jpg',
positiveX: './images/skybox/skyCube2k_px.jpg',
negativeX: './images/skybox/skyCube2k_mx.jpg',
positiveY: './images/skybox/skyCube2k_py.jpg',
negativeY: './images/skybox/skyCube2k_my.jpg',
positiveZ: './images/skybox/skyCube2k_pz.jpg',
negativeZ: './images/skybox/skyCube2k_mz.jpg',
},
})