dd and so on

This commit is contained in:
严争鸣 2025-02-14 16:33:28 +08:00
parent f1a9ca65ed
commit f642f0d705
37 changed files with 1344 additions and 493 deletions

7
package-lock.json generated
View File

@ -29,6 +29,7 @@
"pinia": "^2.0.28", "pinia": "^2.0.28",
"satellite.js": "^5.0.0", "satellite.js": "^5.0.0",
"seemly": "^0.3.9", "seemly": "^0.3.9",
"store2": "^2.14.4",
"v-viewer": "^3.0.21", "v-viewer": "^3.0.21",
"vanilla-js-wheel-zoom": "^9.0.4", "vanilla-js-wheel-zoom": "^9.0.4",
"viewerjs": "^1.11.7", "viewerjs": "^1.11.7",
@ -14465,6 +14466,12 @@
"integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==", "integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==",
"license": "BDS-3-Clause" "license": "BDS-3-Clause"
}, },
"node_modules/store2": {
"version": "2.14.4",
"resolved": "https://registry.npmmirror.com/store2/-/store2-2.14.4.tgz",
"integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==",
"license": "MIT"
},
"node_modules/stream-source": { "node_modules/stream-source": {
"version": "0.3.5", "version": "0.3.5",
"resolved": "https://registry.npmmirror.com/stream-source/-/stream-source-0.3.5.tgz", "resolved": "https://registry.npmmirror.com/stream-source/-/stream-source-0.3.5.tgz",

View File

@ -32,6 +32,7 @@
"pinia": "^2.0.28", "pinia": "^2.0.28",
"satellite.js": "^5.0.0", "satellite.js": "^5.0.0",
"seemly": "^0.3.9", "seemly": "^0.3.9",
"store2": "^2.14.4",
"v-viewer": "^3.0.21", "v-viewer": "^3.0.21",
"vanilla-js-wheel-zoom": "^9.0.4", "vanilla-js-wheel-zoom": "^9.0.4",
"viewerjs": "^1.11.7", "viewerjs": "^1.11.7",

BIN
public/images/影像.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 KiB

View File

@ -1,44 +1,162 @@
const main = [ const sub = [
{ {
id: 0, id: 0,
name: 'DD-1', name: 'DD',
start: '2024-11-15', // start: '2024-11-15',
end: '2024-11-21', // end: '2024-11-21',
type: 'eventType',
children: [ children: [
{ {
id: 1, id: 1,
name: 'DD', name: '发射事件',
start: '2024-11-15', start: '2024-11-15',
end: '2024-11-17', end: '2024-11-17',
children: [ type: 'subEvent',
{ trajData: {},
id: 122,
name: '发射',
start: '2024-11-15',
end: '2024-11-17',
type: 'DD',
avatar: avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg', 'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
}, },
], ],
}, },
{ {
id: 2, id: 300,
name: '飞机', name: '飞机',
type: 'eventType',
children: [
{
id: 5,
name: '起飞',
start: '2024-11-18',
end: '2024-11-21',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
},
],
},
{
name: '舰船',
type: 'eventType',
children: [
{
id: 6,
name: '停留',
start: '2024-11-20',
end: '2024-11-22',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
},
{
id: 7,
name: '扫描',
start: '2024-11-18',
end: '2024-11-19',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
},
],
},
{
name: '航J',
type: 'eventType',
children: [
{
id: 8,
name: '航J事件',
start: '2024-11-20',
end: '2024-11-21',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
},
{
id: 9,
name: '航J事件-2',
start: '2024-11-22',
end: '2024-11-26',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
},
],
},
{
name: 'xx',
type: 'eventType',
children: [
{
id: 13,
name: 'xx-事件-1',
start: '2024-11-22',
end: '2024-11-25',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
},
{
id: 14,
name: 'xx-事件-2',
start: '2024-11-27',
end: '2024-11-30',
type: 'subEvent',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
},
],
},
]
const main = [
{
id: 0,
name: 'DD-1',
start: '2024-11-15',
end: '2024-11-21',
type: 'dd',
children: [
{
id: 1,
name: '事件1-1',
start: '2024-11-15',
end: '2024-11-17',
type: 'mainEvent',
// children: [
// {
// id: 122,
// name: '发射',
// start: '2024-11-15',
// end: '2024-11-17',
// type: 'DD',
// avatar:
// 'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
// },
// ],
children: sub,
},
{
id: 2,
name: '事件1-2',
start: '2024-11-17', start: '2024-11-17',
end: '2024-11-18', end: '2024-11-18',
type: 'mainEvent',
}, },
{ {
id: 3, id: 3,
name: '船', name: '事件1-3',
start: '2024-11-19', start: '2024-11-19',
end: '2024-11-20', end: '2024-11-20',
type: 'mainEvent',
}, },
{ {
id: 4, id: 4,
name: 'H景', name: '事件1-4',
start: '2024-11-18', start: '2024-11-18',
end: '2024-11-19', end: '2024-11-19',
type: 'mainEvent',
}, },
], ],
}, },
@ -51,6 +169,7 @@ const main = [
name: '事件-2-1', name: '事件-2-1',
start: '2024-11-18', start: '2024-11-18',
end: '2024-11-21', end: '2024-11-21',
type: 'mainEvent',
}, },
], ],
}, },
@ -62,12 +181,14 @@ const main = [
name: '事件-3-1', name: '事件-3-1',
start: '2024-11-21', start: '2024-11-21',
end: '2024-11-22', end: '2024-11-22',
type: 'mainEvent',
}, },
{ {
id: 7, id: 7,
name: '事件-3-2', name: '事件-3-2',
start: '2024-11-18', start: '2024-11-18',
end: '2024-11-19', end: '2024-11-19',
type: 'mainEvent',
}, },
], ],
}, },
@ -80,30 +201,35 @@ const main = [
name: '事件-4-1', name: '事件-4-1',
start: '2024-11-20', start: '2024-11-20',
end: '2024-11-21', end: '2024-11-21',
type: 'mainEvent',
}, },
{ {
id: 9, id: 9,
name: '事件-4-2', name: '事件-4-2',
start: '2024-11-25', start: '2024-11-25',
end: '2024-11-26', end: '2024-11-26',
type: 'mainEvent',
}, },
{ {
id: 10, id: 10,
name: '事件-4-3', name: '事件-4-3',
start: '2024-11-17', start: '2024-11-17',
end: '2024-11-18', end: '2024-11-18',
type: 'mainEvent',
}, },
{ {
id: 11, id: 11,
name: '事件-4-4', name: '事件-4-4',
start: '2024-11-22', start: '2024-11-22',
end: '2024-11-25', end: '2024-11-25',
type: 'mainEvent',
}, },
{ {
id: 12, id: 12,
name: '事件-4-5', name: '事件-4-5',
start: '2024-11-23', start: '2024-11-23',
end: '2024-11-24', end: '2024-11-24',
type: 'mainEvent',
}, },
], ],
}, },
@ -115,18 +241,21 @@ const main = [
name: '事件-5-1', name: '事件-5-1',
start: '2024-11-22', start: '2024-11-22',
end: '2024-11-25', end: '2024-11-25',
type: 'mainEvent',
}, },
{ {
id: 14, id: 14,
name: '事件-5-2', name: '事件-5-2',
start: '2024-11-27', start: '2024-11-27',
end: '2024-11-30', end: '2024-11-30',
type: 'mainEvent',
}, },
{ {
id: 15, id: 15,
name: '事件-5-3', name: '事件-5-3',
start: '2024-12-10', start: '2024-12-10',
end: '2024-12-18', end: '2024-12-18',
type: 'mainEvent',
}, },
], ],
}, },
@ -138,12 +267,14 @@ const main = [
name: '事件-6-1', name: '事件-6-1',
start: '2024-11-20', start: '2024-11-20',
end: '2024-11-30', end: '2024-11-30',
type: 'mainEvent',
}, },
{ {
id: 17, id: 17,
name: '事件-6-2', name: '事件-6-2',
start: '2024-12-02', start: '2024-12-02',
end: '2024-12-18', end: '2024-12-18',
type: 'mainEvent',
}, },
], ],
}, },
@ -155,6 +286,7 @@ const main = [
name: '事件-7-1', name: '事件-7-1',
start: '2024-12-22', start: '2024-12-22',
end: '2024-12-28', end: '2024-12-28',
type: 'mainEvent',
}, },
], ],
}, },
@ -166,134 +298,14 @@ const main = [
name: '事件-8-1', name: '事件-8-1',
start: '2024-11-25', start: '2024-11-25',
end: '2024-11-30', end: '2024-11-30',
type: 'mainEvent',
}, },
{ {
id: 20, id: 20,
name: '事件-8-2', name: '事件-8-2',
start: '2024-12-01', start: '2024-12-01',
end: '2024-12-18', end: '2024-12-18',
}, type: 'mainEvent',
],
},
]
const sub = [
{
id: 0,
name: 'DD',
start: '2024-11-15',
end: '2024-11-21',
children: [
{
id: 1,
name: '发射',
start: '2024-11-15',
end: '2024-11-17',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
},
{
id: 2,
name: '脱离-1',
start: '2024-11-17',
end: '2024-11-18',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
},
{
id: 3,
name: '脱离-2',
start: '2024-11-19',
end: '2024-11-20',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
},
{
id: 4,
name: '落地',
start: '2024-11-21',
end: '2024-11-21',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
},
],
},
{
id: 300,
name: '飞机',
children: [
{
id: 5,
name: '起飞',
start: '2024-11-18',
end: '2024-11-21',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
},
],
},
{
name: '舰船',
children: [
{
id: 6,
name: '停留',
start: '2024-11-21',
end: '2024-11-22',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
},
{
id: 7,
name: '扫描',
start: '2024-11-18',
end: '2024-11-19',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/flower.jpg',
},
],
},
{
name: '航J',
children: [
{
id: 8,
name: '航J事件',
start: '2024-11-20',
end: '2024-11-21',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/bear.jpg',
},
{
id: 9,
name: '航J事件-2',
start: '2024-11-25',
end: '2024-11-26',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/wolf.jpg',
},
],
},
{
name: 'xx',
children: [
{
id: 13,
name: 'xx-事件-1',
start: '2024-11-22',
end: '2024-11-25',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/rabbit.jpg',
},
{
id: 14,
name: 'xx-事件-2',
start: '2024-11-27',
end: '2024-11-30',
avatar:
'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/custom-render/cat.jpg',
}, },
], ],
}, },
@ -312,7 +324,15 @@ export function getMainGantt(data = {}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
setTimeout(() => { setTimeout(() => {
resolve(main) resolve(main)
}, 1000) }, 200)
})
}
export function getEventListByDDType(ddType) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(main.find(item => item.name === ddType))
}, 200)
}) })
} }
@ -320,7 +340,7 @@ export function getSubGantt(subId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
setTimeout(() => { setTimeout(() => {
resolve(sub) resolve(sub)
}, 1000) }, 200)
}) })
} }
@ -328,6 +348,6 @@ export function getTask() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
setTimeout(() => { setTimeout(() => {
resolve(task) resolve(task)
}, 1000) }, 200)
}) })
} }

View File

@ -100,4 +100,11 @@
#textMsgContainer .n-alert { #textMsgContainer .n-alert {
height: 100%; height: 100%;
.n-base-close.n-alert__close {
z-index: inherit;
}
}
.n-dialog {
@apply bg-[#1c202cee];
} }

View File

@ -13,6 +13,8 @@ export const useEntity = () => {
getMBEntityOpt, getMBEntityOpt,
iconOrModel, iconOrModel,
changeIconOrModel, changeIconOrModel,
showOrHideLoad,
changeShowOrHideLoad,
} }
} }
@ -104,7 +106,7 @@ function getMBEntityOpt({
minimumPixelSize: 50, minimumPixelSize: 50,
}, },
ellipsoid: { ellipsoid: {
show: true, show: showOrHideLoad.value,
radii: new Cesium.Cartesian3(100000, 100000, 100000), radii: new Cesium.Cartesian3(100000, 100000, 100000),
innerRadii: new Cesium.Cartesian3(1.0, 1.0, 1.0), innerRadii: new Cesium.Cartesian3(1.0, 1.0, 1.0),
maximumCone: Cesium.Math.toRadians(90), maximumCone: Cesium.Math.toRadians(90),
@ -133,3 +135,16 @@ function changeIconOrModel() {
entity.billboard.show = !entity.billboard.show._value entity.billboard.show = !entity.billboard.show._value
}) })
} }
const showOrHideLoad = ref(true)
function changeShowOrHideLoad() {
showOrHideLoad.value = !showOrHideLoad.value
;[...mubiaoMap.values()].forEach(entity => {
entity.ellipsoid.show = !entity.ellipsoid.show._value
})
;[...satelliteMap.values()].forEach(satellite => {
satellite.sensor = showOrHideLoad.value
console.log(satellite)
})
}

View File

@ -14,7 +14,7 @@ function distanceMeasure() {
//贴地测量距离函数 //贴地测量距离函数
// var terrainProvider = this.terrainProvider // var terrainProvider = this.terrainProvider
// viewer.scene.globe.depthTestAgainstTerrain = true viewer.scene.globe.depthTestAgainstTerrain = true
handler = new Cesium.ScreenSpaceEventHandler( handler = new Cesium.ScreenSpaceEventHandler(
viewer.scene._imageryLayerCollection viewer.scene._imageryLayerCollection
@ -78,6 +78,7 @@ function distanceMeasure() {
// tooltip.style.display = "none"; // tooltip.style.display = "none";
bMeasuring = false bMeasuring = false
viewer._container.style.cursor = '' viewer._container.style.cursor = ''
viewer.scene.globe.depthTestAgainstTerrain = false
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK) }, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
const PolyLinePrimitive = (function () { const PolyLinePrimitive = (function () {
@ -180,7 +181,7 @@ function distanceMeasure() {
}, },
label: { label: {
text: textDistance, text: textDistance,
font: '18px sans-serif', font: '14px sans-serif',
fillColor: Cesium.Color.GOLD, fillColor: Cesium.Color.GOLD,
style: Cesium.LabelStyle.FILL_AND_OUTLINE, style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2, outlineWidth: 2,
@ -205,11 +206,11 @@ function angleMeasure() {
let floatingPoint //浮动点 let floatingPoint //浮动点
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas) handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
handler.setInputAction(function (movement) { handler.setInputAction(function (movement) {
let cartesian = viewer.scene.pickPosition(movement.endPosition) // let cartesian = viewer.scene.pickPosition(movement.endPosition)
if (!Cesium.defined(cartesian)) { // if (!Cesium.defined(cartesian)) {
const ray = viewer.camera.getPickRay(movement.endPosition) const ray = viewer.camera.getPickRay(movement.endPosition)
cartesian = viewer.scene.globe.pick(ray, viewer.scene) let cartesian = viewer.scene.globe.pick(ray, viewer.scene)
} // }
//cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid); //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
if (distanceLineNum === 1) { if (distanceLineNum === 1) {
pArr.length = 1 pArr.length = 1
@ -219,13 +220,13 @@ function angleMeasure() {
} }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE) }, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
handler.setInputAction(function (movement) { handler.setInputAction(function (movement) {
let cartesian = viewer.scene.pickPosition(movement.position) // let cartesian = viewer.scene.pickPosition(movement.position)
// console.log('cartesian', cartesian32LonLat(cartesian)) // console.log('cartesian', cartesian32LonLat(cartesian))
if (!Cesium.defined(cartesian)) { // if (!Cesium.defined(cartesian)) {
// console.log('false') // console.log('false')
const ray = viewer.camera.getPickRay(movement.position) const ray = viewer.camera.getPickRay(movement.position)
cartesian = viewer.scene.globe.pick(ray, viewer.scene) let cartesian = viewer.scene.globe.pick(ray, viewer.scene)
} // }
// var cartesian = viewer.scene.pickPosition(movement.position); // var cartesian = viewer.scene.pickPosition(movement.position);
distanceLineNum++ distanceLineNum++
@ -351,12 +352,10 @@ function angleMeasure() {
text: '角度:' + angle + '°\n距离:' + textDistance, text: '角度:' + angle + '°\n距离:' + textDistance,
// scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4), // scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4),
// translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0), // translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
font: '24px 楷体', font: '14px sans-serif',
fillColor: Cesium.Color.WHITE, fillColor: Cesium.Color.GOLD,
outlineColor: Cesium.Color.BLACK,
style: Cesium.LabelStyle.FILL_AND_OUTLINE, style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2, outlineWidth: 2,
scale: 0.5,
pixelOffset: new Cesium.Cartesian2(0, -20), pixelOffset: new Cesium.Cartesian2(0, -20),
disableDepthTestDistance: Number.POSITIVE_INFINITY, disableDepthTestDistance: Number.POSITIVE_INFINITY,
backgroundColor: new Cesium.Color.fromCssColorString( backgroundColor: new Cesium.Color.fromCssColorString(

View File

@ -43,6 +43,10 @@ class SatelliteEntity {
} else if (this._sensorType === 'rectangle') { } else if (this._sensorType === 'rectangle') {
this.createRectangleSensor(this.entity) this.createRectangleSensor(this.entity)
} }
} else {
// if(this.sensorEntity) {
this.removeSensor()
// }
} }
} }
@ -356,6 +360,9 @@ class SatelliteEntity {
}) })
this._listener = (scene, time) => { this._listener = (scene, time) => {
if (!this.sensorEntity) {
return
}
conicSensor.show = false conicSensor.show = false
let position = Cesium.Property.getValueOrUndefined( let position = Cesium.Property.getValueOrUndefined(
satellite.position, satellite.position,
@ -485,6 +492,8 @@ class SatelliteEntity {
viewer.scene.primitives.remove(this.sensorEntity) viewer.scene.primitives.remove(this.sensorEntity)
} }
this.sensorEntity = null this.sensorEntity = null
viewer.scene.preRender.addEventListener(this._listener)
this._listener = null
} }
} }
destroy() { destroy() {

View File

@ -1,6 +1,7 @@
export const useTree = () => { export const useTree = () => {
return { return {
filterTreeNodeByField, filterTreeNodeByField,
getAllKeys,
} }
} }
@ -22,3 +23,16 @@ function filterTreeNodeByField({ treeData, params, paramName, icon = '' }) {
return acc return acc
}, []) }, [])
} }
function getAllKeys(treeData, key) {
const data = 'value' in treeData ? treeData.value : treeData
return data.reduce((acc, node) => {
// console.log(node, '---')
acc.push(node[key])
if (node.children) {
acc = acc.concat(getAllKeys(node.children, key))
}
return acc
}, [])
}

View File

@ -24,7 +24,7 @@ export default defineComponent({
const wz = WZoom.create(`#image-${image.id}`, { const wz = WZoom.create(`#image-${image.id}`, {
type: 'html', type: 'html',
maxScale: 3, maxScale: 3,
minScale: 0.2, minScale: 1,
// zoomOnDoubleClick: true, // zoomOnDoubleClick: true,
width: imageElement.naturalWidth, width: imageElement.naturalWidth,
height: imageElement.naturalHeight, height: imageElement.naturalHeight,

View File

@ -63,7 +63,7 @@ const getImage = async () => {
imageList.value = new Array(10).fill(1).map((item, index) => { imageList.value = new Array(10).fill(1).map((item, index) => {
return { return {
id: index, id: index,
imgPath: `https://picsum.photos/300/200?random=${index}`, imgPath: `/images/影像.jpg`,
imgId: index, imgId: index,
} }
}) })

View File

@ -6,6 +6,7 @@ import { useTree } from '@/utils/tree'
import { parseWKT } from '@/utils/parseWKT' import { parseWKT } from '@/utils/parseWKT'
import { useBasePopup } from './basePopup' import { useBasePopup } from './basePopup'
import { useEntity } from '@/hooks/entity' import { useEntity } from '@/hooks/entity'
// import { storeToRefs } from 'pinia' // import { storeToRefs } from 'pinia'
const treeData = ref([]) const treeData = ref([])
@ -18,7 +19,7 @@ const allKeys = ref([])
let subscriber: Subscriber | null = null let subscriber: Subscriber | null = null
const { filterTreeNodeByField } = useTree() const { filterTreeNodeByField, getAllKeys } = useTree()
const { popupMap, createPopup } = useBasePopup() const { popupMap, createPopup } = useBasePopup()
@ -26,7 +27,7 @@ const isLoading = ref(false)
export const useBase = () => { export const useBase = () => {
onMounted(async () => { onMounted(async () => {
await getSheshiData() await getSheshiData()
allKeys.value = getAllKeys(treeData.value) allKeys.value = getAllKeys(treeData.value, 'dataId')
}) })
const addBaseFacilities = (ids: Array<string | number>) => { const addBaseFacilities = (ids: Array<string | number>) => {
subscriber = new Subscriber(viewer, { subscriber = new Subscriber(viewer, {
@ -221,18 +222,18 @@ function addEventSub(
// console.log(subscriber, '-------') // console.log(subscriber, '-------')
} }
function getAllKeys(treeData: any) { // function getAllKeys(treeData: any) {
const data = 'value' in treeData ? treeData.value : treeData // const data = 'value' in treeData ? treeData.value : treeData
return data.reduce((acc, node) => { // return data.reduce((acc, node) => {
// console.log(node, '---') // // console.log(node, '---')
acc.push(node.dataId) // acc.push(node.dataId)
if (node.children) { // if (node.children) {
acc = acc.concat(getAllKeys(node.children)) // acc = acc.concat(getAllKeys(node.children))
} // }
return acc // return acc
}, []) // }, [])
} // }
function addEntity(data: TBaseNode) { function addEntity(data: TBaseNode) {
const { id, sheShiName, sheShiType, geom } = data const { id, sheShiName, sheShiType, geom } = data
@ -257,9 +258,11 @@ function addEntity(data: TBaseNode) {
18000000, 18000000,
0.4 0.4
), ),
// eyeOffset: new Cesium.Cartesian3(0.0, 20000.0, 0.0), // eyeOffset: new Cesium.Cartesian3(0.0, 20000.0, 0.0),
scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4), scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4),
disableDepthTestDistance: 1000000000, // disableDepthTestDistance: 30000000,
// disableDepthTestDistance: Number.POSITIVE_INFINITY,
}, },
billboard: { billboard: {
show: !iconOrModel.value, show: !iconOrModel.value,
@ -271,7 +274,7 @@ function addEntity(data: TBaseNode) {
scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4), scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4),
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
// verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: 1000000000, // disableDepthTestDistance: Number.POSITIVE_INFINITY,
}, },
model: { model: {
show: iconOrModel.value, show: iconOrModel.value,

View File

@ -2,7 +2,7 @@ import { NIcon, NPopover } from 'naive-ui'
import { useEntity } from '@/hooks/entity' import { useEntity } from '@/hooks/entity'
export default defineComponent({ export default defineComponent({
setup() { setup() {
const { changeIconOrModel } = useEntity() const { showOrHideLoad, changeShowOrHideLoad } = useEntity()
return () => ( return () => (
<> <>
<NPopover <NPopover
@ -10,7 +10,10 @@ export default defineComponent({
placement="bottom" placement="bottom"
v-slots={{ v-slots={{
trigger: () => ( trigger: () => (
<div class="btn-class" onClick={changeIconOrModel}> <div
class={`btn-class ${showOrHideLoad.value ? 'checked' : ''}`}
onClick={changeShowOrHideLoad}
>
<NIcon size="16"> <NIcon size="16">
<svg <svg
t="1736488615012" t="1736488615012"

View File

@ -8,11 +8,11 @@ export default defineComponent({
const showOrHideTraj = show => { const showOrHideTraj = show => {
// console.log(value, 'showOrHideTraj') // console.log(value, 'showOrHideTraj')
// if (show) { if (show) {
// showTrajHour.value > 0 && getCurTraj() showTrajHour.value > 0 && getCurTraj()
// } else { } else {
// removeAllCurTraj() removeAllCurTraj()
// } }
} }
return () => ( return () => (
@ -53,7 +53,7 @@ export default defineComponent({
<span>航迹配置</span> <span>航迹配置</span>
</NPopover> </NPopover>
{showTrajSet.value ? ( {showTrajSet.value ? (
<div class="corner-border absolute top-10 z-30 flex w-[150px] flex-col gap-2 bg-[var(--color-bg)] p-2"> <div class="corner-border absolute top-10 z-30 flex w-[230px] flex-col gap-2 bg-[var(--color-bg)] p-2">
<div>轨迹时长</div> <div>轨迹时长</div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<NInputNumber <NInputNumber
@ -67,12 +67,12 @@ export default defineComponent({
<NButton <NButton
type="primary" type="primary"
size="small" size="small"
onClick={showOrHideTraj(true)} onClick={() => showOrHideTraj(true)}
> >
确定 显示所有航迹
</NButton> </NButton>
<NButton size="small" onClick={showOrHideTraj(false)}> <NButton size="small" onClick={() => showOrHideTraj(false)}>
关闭航迹 关闭所有航迹
</NButton> </NButton>
{/* <NSwitch {/* <NSwitch
// rail-style="railStyle" // rail-style="railStyle"

View File

@ -18,7 +18,7 @@ import Daodan from '../Daodan'
import TextMessage from '../TextReport/components/Message' import TextMessage from '../TextReport/components/Message'
import DaodanTestConfig from '../Daodan/components/TestConfig' import DaodanTestConfig from '../Daodan/components/ConfigContainer'
// import HeatMap from '../Mubiao/components/HeatMap/index.vue' // import HeatMap from '../Mubiao/components/HeatMap/index.vue'
// import TextDetailModal from '../TextReport/components/DetailsModal/index.vue' // import TextDetailModal from '../TextReport/components/DetailsModal/index.vue'
@ -241,7 +241,7 @@ const showOrHideTextReport = () => {
<div <div
class="absolute bottom-0 flex h-full w-full flex-col items-center justify-end" class="absolute bottom-0 flex h-full w-full flex-col items-center justify-end"
> >
<text-message class="z-15 absolute h-[200px] w-full"></text-message> <text-message class="absolute h-[200px] w-full"></text-message>
<mubiao-his-trajectory <mubiao-his-trajectory
v-if="showHisTrajCom" v-if="showHisTrajCom"
class="z-30 h-[260px] w-full" class="z-30 h-[260px] w-full"

View File

@ -0,0 +1,25 @@
import { NTabs, NTabPane, NButton, NScrollbar } from 'naive-ui'
import TrajTable from './TrajTable'
import TrajUpload from './TrajUpload'
import Panel from '@/components/Panel/index.vue'
import { useDaodan } from '../ddHooks'
import TestConfig from './TestConfig'
import { useTestConfig } from './hooks/testHooks'
export default defineComponent({
name: 'ConfigContainer',
props: {},
setup() {
const { daodanData } = useDaodan()
return () => (
<div>
<Panel title={`${daodanData.value.name}试验配置`}>
<div class="flex h-full w-full flex-col gap-2 p-2">
<TestConfig />
</div>
</Panel>
</div>
)
},
})

View File

@ -9,15 +9,20 @@ const panels = ['手动配置', 'STK轨迹文件配置']
export default defineComponent({ export default defineComponent({
setup() { setup() {
const { daodanData, showOrHideDdConfig } = useDaodan() const { daodanData, showOrHideDdConfig } = useDaodan()
const { trajData, interceptData, addIntercept, initDaodan } = const { trajData, interceptData, loadStoreData, addIntercept, initDaodan } =
useTestConfig() useTestConfig()
watch(daodanData, newval => {
loadStoreData()
// console.log(newval, '-=----')
})
const name = ref('手动配置') const name = ref('手动配置')
const handleClose = () => {} // const handleClose = () => {}
const confirm = () => { const confirm = () => {
showOrHideDdConfig({})
initDaodan() initDaodan()
showOrHideDdConfig({})
} }
const removeIntercept = id => { const removeIntercept = id => {
@ -27,15 +32,15 @@ export default defineComponent({
) )
} }
return () => ( return () => (
<div> // <div>
<Panel title={`${daodanData.value.name}试验配置`}> // <Panel title={`${daodanData.value.name}`}>
<div class="flex h-full w-full flex-col gap-2 p-2"> <div class="flex h-full w-full flex-col gap-2 p-2">
<NTabs <NTabs
class="flex h-[calc(100%-42px)] flex-col" class="flex h-[calc(100%-42px)] flex-col"
v-model:value={name.value} v-model:value={name.value}
type="card" type="card"
tab-style="min-width: 80px;" tab-style="min-width: 80px;"
onClose={handleClose} // onClose={handleClose}
> >
{panels.map(panel => ( {panels.map(panel => (
<NTabPane <NTabPane
@ -86,8 +91,8 @@ export default defineComponent({
<NButton onClick={() => showOrHideDdConfig({})}>取消</NButton> <NButton onClick={() => showOrHideDdConfig({})}>取消</NButton>
</div> </div>
</div> </div>
</Panel> // </Panel>
</div> // </div>
) )
}, },
}) })

View File

@ -21,6 +21,10 @@ export default defineComponent({
type: Object, type: Object,
default: () => ({}), default: () => ({}),
}, },
showPosIcon: {
type: Boolean,
default: true,
},
}, },
setup(props, { emit }) { setup(props, { emit }) {
const { handleClickPoint } = useTestConfig() const { handleClickPoint } = useTestConfig()
@ -35,6 +39,7 @@ export default defineComponent({
return ( return (
<div class="flex items-center justify-between gap-2"> <div class="flex items-center justify-between gap-2">
<div>{row.name} </div> <div>{row.name} </div>
{props.showPosIcon && (
<NButton <NButton
// quaternary // quaternary
// type="primary" // type="primary"
@ -64,6 +69,7 @@ export default defineComponent({
handleClickPoint(row) handleClickPoint(row)
}} }}
/> />
)}
</div> </div>
) )
}, },

View File

@ -3,6 +3,8 @@ import { useDaodan } from '../../ddHooks'
import { cartesian32LonLat } from '@/utils/pos' import { cartesian32LonLat } from '@/utils/pos'
import ExplosionEffect from '@/js/Explosion' import ExplosionEffect from '@/js/Explosion'
import { generateId } from '@/utils/id' import { generateId } from '@/utils/id'
import store from 'store2'
// import { useDaodan } from '../../ddHooks'
const trajData = ref({ const trajData = ref({
id: 'dd', id: 'dd',
@ -36,7 +38,7 @@ const trajData = ref({
lat: 21, lat: 21,
alt: 2000000, alt: 2000000,
time: 1183135280000, time: 1183135280000,
detached: false, detached: true,
}, },
{ {
name: '落点', name: '落点',
@ -76,17 +78,45 @@ const interceptData = ref([
], ],
}, },
]) ])
const { daodanData, showDdConfigCom } = useDaodan()
export function useTestConfig() { export function useTestConfig() {
return { return {
trajData, trajData,
interceptData, interceptData,
loadStoreData,
addIntercept, addIntercept,
addFeaturePoint,
handleClickPoint, handleClickPoint,
initDaodan, initDaodan,
} }
} }
function saveDataToStore() {
const daodanDataRaw = toRaw(daodanData.value)
const storeData = store.get('daodanData')
store.set('daodanData', {
...storeData,
[daodanDataRaw.id]: {
...daodanDataRaw,
trajData: trajData.value,
interceptData: interceptData.value,
},
})
}
function loadStoreData() {
const storeData = store.get('daodanData')
if (storeData) {
const daodanDataRaw = toRaw(daodanData.value)
const data = storeData[daodanDataRaw.id]
if (data) {
trajData.value = data.trajData
interceptData.value = data.interceptData
}
}
}
function addIntercept() { function addIntercept() {
// d // d
interceptData.value.push({ interceptData.value.push({
@ -107,31 +137,22 @@ function addIntercept() {
time: 1183135260000, time: 1183135260000,
detached: false, detached: false,
}, },
{ trajData.value.data.at(-1),
name: '落点',
lon: 120,
lat: 21,
alt: 0,
time: 1183135260000,
},
], ],
}) })
} }
function addFeaturePoint() {
//
}
let handler = null let handler = null
function handleClickPoint(rowData) { function handleClickPoint(rowData) {
const { showDdConfigCom } = useDaodan()
// //
// console.log(rowData) // console.log(rowData)
showDdConfigCom.value = false showDdConfigCom.value = false
viewer._container.style.cursor = 'crosshair' viewer._container.style.cursor = 'crosshair'
handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas) handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)
handler.setInputAction(movement => { handler.setInputAction(movement => {
const cartesian = viewer.scene.pickPosition(movement.position) // const cartesian = viewer.scene.pickPosition(movement.position)
const ray = viewer.camera.getPickRay(movement.position)
const cartesian = viewer.scene.globe.pick(ray, viewer.scene)
const position = cartesian32LonLat(cartesian) const position = cartesian32LonLat(cartesian)
// console.log(position) // console.log(position)
viewer._container.style.cursor = '' viewer._container.style.cursor = ''
@ -144,7 +165,8 @@ function handleClickPoint(rowData) {
let nodes = [] let nodes = []
let ddMap = new Map() let ddMap = new Map()
function addDaodan(id, ddTrajData, type = 0) { function addDaodan(trajData, type = 0) {
const { id, data: ddTrajData } = trajData
const position = Cesium.Cartesian3.fromDegrees( const position = Cesium.Cartesian3.fromDegrees(
ddTrajData[0].lon, ddTrajData[0].lon,
ddTrajData[0].lat, ddTrajData[0].lat,
@ -194,26 +216,28 @@ function addDaodan(id, ddTrajData, type = 0) {
model.getNode(i._name).show = false model.getNode(i._name).show = false
} }
}) })
computePath(ddPrimitive, ddTrajData, type) computePath(ddPrimitive, trajData, type)
// setTimeout(() => { // setTimeout(() => {
playDaodan(ddPrimitive, nodes) // playDaodan(ddPrimitive, nodes)
// }, 3000) // }, 3000)
}) })
} }
let minTime = 0 let minTime = 0
function initDaodan() { function initDaodan() {
minTime = getMinTime([ saveDataToStore()
...toRaw(trajData.value.data), // minTime = getMinTime([
...toRaw(interceptData.value.map(item => toRaw(item.data))).flat(Infinity), // ...toRaw(trajData.value.data),
]) // ...toRaw(interceptData.value.map(item => toRaw(item.data))).flat(Infinity),
// ])
// console.log(minTime) // // console.log(minTime)
addDaodan(trajData.value.id, trajData.value.data) // addDaodan(trajData.value)
interceptData.value.forEach(item => { // aniIndexMap.set(trajData.value.id, 0)
const { id, data } = item // interceptData.value.forEach(item => {
addDaodan(id, data, 1) // const { id, data } = item
}) // addDaodan(item, 1)
// aniIndexMap.set(id, 0)
// })
} }
function getMinTime(data) { function getMinTime(data) {
@ -224,106 +248,14 @@ function getMinTime(data) {
return minTime return minTime
} }
function playDaodan(daodan, nodes) { function computePath(daodan, trajData, type) {
modelAnimationController({ const { data: ddTrajData } = trajData
primitive: daodan,
type: 'BoosterFlames Size',
initVal: 0,
maxVal: 1,
step: 0.1,
fn: () => {
console.log('1------BoosterFlames Size')
},
})
setTimeout(() => {
modelAnimationController({
primitive: daodan,
type: 'BoosterFlames Size',
initVal: 1,
minVal: 0,
step: -0.05,
fn: () => {
console.log('2------BoosterFlames Size')
},
})
modelAnimationController({
primitive: daodan,
type: 'Booster MoveZ',
initVal: 0,
minVal: -150,
step: -1,
fn: () => {
console.log(nodes, '=======')
console.log('3------Booster MoveZ')
nodes.forEach(i => {
const nodeName = i._name
// new RegExp(/Fairing\d/).test(nodeName) ||
if (new RegExp(/Booster/).test(nodeName)) {
daodan.getNode(nodeName).show = false
}
})
},
})
modelAnimationController({
primitive: daodan,
type: 'UpperStageFlames Size',
initVal: 0,
maxVal: 1,
step: 0.05,
fn: () => {
console.log('4------UpperStageFlames Size')
},
})
}, 2000)
setTimeout(() => {
modelAnimationController({
primitive: daodan,
type: 'InterstageAdapter MoveZ',
initVal: 0,
minVal: -150,
step: -1,
fn: () => {
console.log('5------InterstageAdapter MoveZ')
nodes.forEach(i => {
const nodeName = i._name
if (new RegExp(/InterstageAdapter/).test(nodeName)) {
console.log(daodan.getNode(nodeName))
daodan.getNode(nodeName).show = false
}
})
},
})
}, 4000)
setTimeout(() => {
modelAnimationController({
primitive: daodan,
type: 'UpperStageFlames Size',
initVal: 1,
maxVal: 0,
step: -0.05,
fn: () => {
console.log('6------UpperStageFlames Size')
modelAnimationController({
primitive: daodan,
type: 'UpperStage MoveZ',
initVal: 0,
minVal: -150,
step: -1,
})
},
})
}, 6000)
}
function computePath(daodan, ddTrajData, type) {
const points = ddTrajData.map(item => { const points = ddTrajData.map(item => {
const { time, lon, lat, alt } = item const { time, lon, lat, alt, detached } = item
return { return {
position: Cesium.Cartesian3.fromDegrees(lon, lat, alt), position: Cesium.Cartesian3.fromDegrees(lon, lat, alt),
time: time - minTime, time: time - minTime,
detached,
} }
}) })
const totalAnimationTime = points.at(-1).time const totalAnimationTime = points.at(-1).time
@ -347,21 +279,32 @@ function computePath(daodan, ddTrajData, type) {
positionProperty.addSample(time, point.position) positionProperty.addSample(time, point.position)
}) })
positionProperty.setInterpolationOptions({ positionProperty.setInterpolationOptions({
interpolationDegree: 5, interpolationDegree: 2,
interpolationAlgorithm: Cesium.HermitePolynomialApproximation, interpolationAlgorithm: Cesium.HermitePolynomialApproximation,
// interpolationDegree: 5, // interpolationDegree: 5,
// interpolationAlgorithm: Cesium.LagrangePolynomialApproximation, // interpolationAlgorithm: Cesium.LagrangePolynomialApproximation,
}) })
createLine({ totalAnimationTime, startTime, positionProperty, type }) createLine({ totalAnimationTime, startTime, positionProperty, type })
daodanAnimation({ totalAnimationTime, startTime, positionProperty, daodan }) daodanAnimation({
totalAnimationTime,
startTime,
positionProperty,
daodan,
trajData,
})
} }
function daodanAnimation(params) { function daodanAnimation(params) {
const { totalAnimationTime, startTime, positionProperty, daodan } = params const { totalAnimationTime, startTime, positionProperty, daodan, trajData } =
params
// const { data: ddTrajData } = trajData
dianhuo(daodan)
let lastFrameTime = performance.now() let lastFrameTime = performance.now()
let customElapsedTime = 0 let customElapsedTime = 0
let isAnimationRunning = true let isAnimationRunning = true
let explosion = null let explosion = null
viewer.scene.preRender.addEventListener(() => { viewer.scene.preRender.addEventListener(() => {
if (!isAnimationRunning) { if (!isAnimationRunning) {
return return
@ -374,6 +317,11 @@ function daodanAnimation(params) {
customElapsedTime = totalAnimationTime // customElapsedTime = totalAnimationTime //
isAnimationRunning = false // isAnimationRunning = false //
} }
ddNodesAnimationController({
ddPrimitive: daodan,
curTime: minTime + customElapsedTime * 1000,
trajData,
})
// //
const customTime = Cesium.JulianDate.addSeconds( const customTime = Cesium.JulianDate.addSeconds(
@ -424,6 +372,197 @@ function daodanAnimation(params) {
} }
}) })
} }
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')
},
})
}
const aniIndexMap = new Map()
function ddNodesAnimationController(params) {
const { ddPrimitive, curTime, trajData } = params
const { id: ddId, data: ddTrajData } = trajData
const nodeAniList = ddTrajData.filter(item => item.detached)
// console.log(
// curTime,
// aniIndex,
// nodeAniList[aniIndex].time,
// curTime >= nodeAniList[aniIndex].time,
// 'curTime'
// )
if (!ddPrimitive || !aniIndexMap.has(ddId)) return
const aniIndex = aniIndexMap.get(ddId)
const aniTime = nodeAniList[aniIndex]?.time || Infinity
if (curTime >= aniTime) {
if (aniIndex === 0) {
aniIndexMap.set(ddId, aniIndexMap.get(ddId) + 1)
modelAnimationController({
primitive: ddPrimitive,
type: 'BoosterFlames Size',
initVal: 1,
minVal: 0,
step: -0.05,
fn: function () {
console.log(
`%c${ddId}--熄火`,
'color: red;font-size: 20px;border: 1px solid red'
)
modelAnimationController({
primitive: ddPrimitive,
type: 'UpperStageFlames Size',
initVal: 0,
maxVal: 1,
step: 0.05,
fn: () => {
console.log(
`%c${ddId}--二级点火`,
'color: red;font-size: 20px;border: 1px solid red'
)
},
})
modelAnimationController({
primitive: ddPrimitive,
type: 'Booster MoveZ',
initVal: 0,
minVal: -450,
step: -3,
fn: () => {
console.log(
`%c${ddId}--一级脱离`,
'color: red;font-size: 20px;border: 1px solid red'
)
nodes.forEach(i => {
const nodeName = i._name
if (new RegExp(/Booster/).test(nodeName)) {
ddPrimitive.getNode(nodeName).show = false
}
})
},
})
modelAnimationController({
primitive: ddPrimitive,
type: 'Booster MoveY',
initVal: 0,
minVal: -15,
step: -0.1,
})
},
})
} else if (aniIndex === 1) {
aniIndexMap.set(ddId, aniIndexMap.get(ddId) + 1)
modelAnimationController({
primitive: ddPrimitive,
type: 'Fairing Open',
initVal: 0,
maxVal: 45,
step: 0.5,
})
modelAnimationController({
primitive: ddPrimitive,
type: 'Fairing Separate',
initVal: 0,
minVal: -10,
step: -0.1,
})
modelAnimationController({
primitive: ddPrimitive,
type: 'Fairing Drop',
initVal: 0,
minVal: -450,
step: -3,
fn: () => {
console.log(
`%c${ddId}--二级脱离`,
'color: red;font-size: 20px;border: 1px solid red'
)
nodes.forEach(i => {
const nodeName = i._name
if (new RegExp(/Fairing\d/).test(nodeName)) {
ddPrimitive.getNode(nodeName).show = false
}
})
},
})
modelAnimationController({
primitive: ddPrimitive,
type: 'Fairing MoveY',
initVal: 0,
minVal: -150,
step: -3,
})
} else if (aniIndex === 2) {
aniIndexMap.set(ddId, aniIndexMap.get(ddId) + 1)
modelAnimationController({
primitive: ddPrimitive,
type: 'InterstageAdapter MoveZ',
initVal: 0,
minVal: -200,
step: -2,
fn: () => {
console.log(
`%c${ddId}--三级脱离`,
'color: red;font-size: 20px;border: 1px solid red'
)
nodes.forEach(i => {
const nodeName = i._name
if (new RegExp(/InterstageAdapter/).test(nodeName)) {
ddPrimitive.getNode(nodeName).show = false
}
})
},
})
modelAnimationController({
primitive: ddPrimitive,
type: 'InterstageAdapter MoveY',
initVal: 0,
minVal: -300,
step: -2,
})
modelAnimationController({
primitive: ddPrimitive,
type: 'UpperStageFlames Size',
initVal: 1,
minVal: 0,
step: -0.05,
fn: () => {
console.log(
`%c${ddId}--二级熄火`,
'color: red;font-size: 20px;border: 1px solid red'
)
// modelAnimationController({
// primitive: ddPrimitive,
// type: 'Booster MoveZ',
// initVal: 0,
// minVal: -150,
// step: -1,
// fn: () => {
// console.log(
// `%c${ddId}--`,
// 'color: red;font-size: 20px;border: 1px solid red'
// )
// },
// })
},
})
}
}
}
function getHeadingPitchRoll(curPos, nextPos) { function getHeadingPitchRoll(curPos, nextPos) {
if (!curPos || !nextPos || Cesium.Cartesian3.equals(curPos, nextPos)) { if (!curPos || !nextPos || Cesium.Cartesian3.equals(curPos, nextPos)) {
@ -492,14 +631,15 @@ function modelAnimationController(controller) {
const { type, initVal, maxVal, fn, step, minVal, primitive } = controller const { type, initVal, maxVal, fn, step, minVal, primitive } = controller
let num = initVal let num = initVal
let stopFrame let stopFrame
const max = maxVal || 1 const max = maxVal ?? 1
const min = minVal || -99999 const min = minVal ?? -99999
const duration = step || 0.1 const duration = step ?? 0.1
const render = () => { const render = () => {
num += duration num += duration
primitive.setArticulationStage(type, num) primitive.setArticulationStage(type, num)
primitive.applyArticulations() primitive.applyArticulations()
stopFrame = requestAnimationFrame(render) stopFrame = requestAnimationFrame(render)
// console.log(num >= max || num <= min, type, num, min)
if (num > max || num <= min) { if (num > max || num <= min) {
window.cancelAnimationFrame(stopFrame) window.cancelAnimationFrame(stopFrame)
fn && fn() fn && fn()

View File

@ -1,4 +1,4 @@
import { onMounted, ref } from 'vue' import { onMounted, ref, watch } from 'vue'
import { getDaodanTree } from '@/api/Daodan' import { getDaodanTree } from '@/api/Daodan'
const isLoading = ref(false) const isLoading = ref(false)

View File

@ -1,6 +1,7 @@
import Tree from '@/components/Tree/index.vue' import Tree from '@/components/Tree/index.vue'
import { useDaodan } from './ddHooks' import { useDaodan } from './ddHooks'
import { NButton } from 'naive-ui' import { NButton } from 'naive-ui'
import { useTestConfig } from './components/hooks/testHooks'
export default defineComponent({ export default defineComponent({
setup() { setup() {
@ -25,6 +26,10 @@ export default defineComponent({
} }
return () => ( return () => (
<div class="w-h-full" v-loading={isLoading.value}> <div class="w-h-full" v-loading={isLoading.value}>
{/* <NButton type="primary" onClick={showOrHideDdConfig}>
aaaaa
</NButton> */}
<Tree <Tree
data={treeData.value} data={treeData.value}
key-field="dataId" key-field="dataId"

View File

@ -67,13 +67,13 @@ onMounted(async () => {
}, },
}) })
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({ // viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
url: 'http://192.168.10.201:2022/api/maptilecache/service/terrain/taiwan-HeightMap-4326', // url: 'http://192.168.10.201:2022/api/maptilecache/service/terrain/taiwan-HeightMap-4326',
// url: Cesium.IonResource.fromAssetId(3956), // // url: Cesium.IonResource.fromAssetId(3956),
// url: 'http://data.marsgis.cn/terrain', // // url: 'http://data.marsgis.cn/terrain',
requestVertexNormals: true, // requestVertexNormals: true,
requestWaterMask: true, // requestWaterMask: true,
}) // })
// viewer.terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl( // viewer.terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl(
// 'http://192.168.10.201:2022/api/maptilecache/service/terrain/taiwan-HeightMap-4326', // 'http://192.168.10.201:2022/api/maptilecache/service/terrain/taiwan-HeightMap-4326',
@ -82,7 +82,7 @@ onMounted(async () => {
// requestWaterMask: true, // requestWaterMask: true,
// } // }
// ) // )
viewer.scene.globe.depthTestAgainstTerrain = true // viewer.scene.globe.depthTestAgainstTerrain = true
// setTimeout(() => { // setTimeout(() => {
// const tooltip = new MouseTooltip(window.viewer, { // const tooltip = new MouseTooltip(window.viewer, {
// offset: [10, -10], // offset: [10, -10],

View File

@ -0,0 +1,94 @@
import { NTabs, NTabPane, NButton, NScrollbar } from 'naive-ui'
import TrajTable from '@/views/Daodan/components/TrajTable'
import TrajUpload from '@/views/Daodan/components/TrajUpload'
import { useEventDdConfig } from './useEventDdConfig'
const panels = ['手动配置', 'STK轨迹文件配置']
export default defineComponent({
name: 'EventDaodan',
props: {
data: {
type: Object,
default: () => ({}),
},
},
setup() {
const name = ref('手动配置')
const { trajData, interceptData, addIntercept } = useEventDdConfig()
// const { trajData, interceptData, updateInterceptData } = useEvent()
const removeIntercept = id => {
interceptData.value.splice(
interceptData.value.findIndex(item => item.id === id),
1
)
}
const showOrHideDdConfig = () => {}
return () => (
<div class="flex h-full w-[80vw] flex-col gap-2 p-2">
<NTabs
class="flex h-[calc(100%-42px)] flex-col"
v-model:value={name.value}
type="card"
tab-style="min-width: 80px;"
>
{panels.map(panel => (
<NTabPane
class="flex-1 overflow-y-auto rounded-b-[var(--n-tab-border-radius)] border border-[var(--n-tab-border-color)] border-t-transparent"
key={panel}
tab={panel}
name={panel}
>
<NScrollbar>
<div class="px-4 pb-4">
<div class="detail-container">
{panel === '手动配置' ? (
<>
<div class="rounded border border-blue-500 p-4">
<TrajTable
title="轨迹点"
showPosIcon={false}
data={trajData.value}
/>
</div>
<div class="flex flex-col gap-4 rounded border border-red-500 p-4">
{interceptData.value.map(data => (
<TrajTable
title="拦截"
data={data}
showPosIcon={false}
onRemoveIntercept={removeIntercept}
/>
))}
<div>
<NButton type="primary" onClick={addIntercept}>
添加拦截
</NButton>
</div>
</div>
</>
) : (
<>
<TrajUpload title="轨迹点" />
<TrajUpload title="拦截" />
</>
)}
</div>
</div>
</NScrollbar>
</NTabPane>
))}
</NTabs>
<div class="flex justify-end gap-2">
<NButton type="primary" onClick={confirm}>
确认
</NButton>
<NButton onClick={() => showOrHideDdConfig({})}>取消</NButton>
</div>
</div>
)
},
})

View File

@ -0,0 +1,60 @@
import {
NForm,
NFormItem,
NInput,
NButton,
NDatePicker,
NUpload,
} from 'naive-ui'
import ModalCom from '@/components/Modal/index.vue'
import { useEvent } from '../hooks'
export default defineComponent({
// props: {
// show: {
// type: Boolean,
// default: false,
// },
// },
setup() {
const { showMainEvent, mainEventData } = useEvent()
const close = () => {
showNewEvent.value = false
}
watch(
[() => mainEventData.value.start, () => mainEventData.value.end],
([start, end]) => {
timeRange.value = start ? [start, end] : null
}
)
const timeRange = ref(null)
return () => (
<ModalCom v-model:show={showMainEvent.value} title="编辑事件">
<NForm
class="w-[500px]"
model={mainEventData}
label-placement="left"
label-width="auto"
>
<NFormItem label="事件名称" path="name">
<NInput v-model:value={mainEventData.value.name} />
</NFormItem>
<NFormItem label="事件时间" path="description">
<NDatePicker
v-model:value={timeRange.value}
type="daterange"
clearable
/>
</NFormItem>
</NForm>
<div class="flex justify-end gap-2">
<NButton onClick={close}>取消</NButton>
<NButton type="primary">确认</NButton>
</div>
</ModalCom>
)
},
})

View File

@ -0,0 +1,81 @@
import {
NForm,
NFormItem,
NInput,
NButton,
NDatePicker,
NUpload,
} from 'naive-ui'
import ModalCom from '@/components/Modal/index.vue'
import { useEvent } from '../hooks'
export default defineComponent({
// props: {
// show: {
// type: Boolean,
// default: false,
// },
// },
setup() {
const { showNewEvent, eventData } = useEvent()
const close = () => {
showNewEvent.value = false
}
watch(
[
() => eventData.value.start,
() => eventData.value.end,
() => eventData.value.avatar,
],
([start, end, avatar]) => {
timeRange.value = start ? [start, end] : null
uploadImg.value = [
{
url: avatar,
status: 'finished',
},
]
}
)
const timeRange = ref(null)
const uploadImg = ref([])
return () => (
<ModalCom
v-model:show={showNewEvent.value}
title={`${eventData.value.id ? '编辑' : '添加'}子事件`}
>
<NForm
class="w-[500px]"
model={eventData}
label-placement="left"
label-width="auto"
>
<NFormItem label="事件名称" path="name">
<NInput v-model:value={eventData.value.name} />
</NFormItem>
<NFormItem label="事件时间" path="description">
<NDatePicker
v-model:value={timeRange.value}
type="daterange"
clearable
/>
</NFormItem>
<NFormItem label="上传图片" path="avatar">
<NUpload
default-file-list={uploadImg.value}
list-type="image-card"
max={1}
/>
</NFormItem>
</NForm>
<div class="flex justify-end gap-2">
<NButton onClick={close}>取消</NButton>
<NButton type="primary">确认</NButton>
</div>
</ModalCom>
)
},
})

View File

@ -0,0 +1,103 @@
export const useEventDdConfig = () => {
const trajData = ref({
id: 'dd',
data: [
{
name: '起始点',
lon: 120,
lat: 21,
alt: 0,
time: 1183135260000,
},
{
name: '中间特征点',
lon: 122,
lat: 21,
alt: 1000000,
time: 1183135265000,
detached: true,
},
{
name: '中间特征点',
lon: 124,
lat: 21,
alt: 1500000,
time: 1183135270000,
detached: true,
},
{
name: '中间特征点',
lon: 128,
lat: 21,
alt: 2000000,
time: 1183135280000,
detached: true,
},
{
name: '落点',
lon: 135,
lat: 21,
alt: 1500000,
time: 1183135290000,
},
],
})
const interceptData = ref([
{
id: 'dd1',
data: [
{
name: '起始点',
lon: 137,
lat: 25,
alt: 0,
time: 1183135270000,
},
{
name: '中间特征点',
lon: 138,
lat: 24,
alt: 1000000,
time: 1183135280000,
detached: true,
},
{
name: '落点',
lon: 135,
lat: 21,
alt: 1500000,
time: 1183135290000,
},
],
},
])
function addIntercept() {
// d
interceptData.value.push({
data: [
{
name: '起始点',
lon: 120,
lat: 21,
alt: 0,
time: 1183135260000,
},
{
name: '中间特征点',
lon: 120,
lat: 21,
alt: 0,
time: 1183135260000,
detached: false,
},
trajData.value.data.at(-1),
],
})
}
return {
trajData,
interceptData,
addIntercept,
}
}

View File

@ -0,0 +1,29 @@
import { generateId } from '@/utils/id'
const showMainEvent = ref(false)
const mainEventData = ref({
name: '',
start: '',
end: '',
type: 'mainEvent',
})
const showNewEvent = ref(false)
const eventData = ref({
name: '',
start: '',
end: '',
avatar: '',
type: 'subEvent',
})
export const useEvent = () => {
return {
showMainEvent,
mainEventData,
showNewEvent,
eventData,
}
}

View File

@ -1,5 +1,6 @@
import { NDataTable, NIcon, NButton } from 'naive-ui' import { NDataTable, NIcon, NButton, useDialog, NTag } from 'naive-ui'
import { getMainGantt } from '@/api/gantt' import { getEventListByDDType } from '@/api/gantt'
import { useTree } from '@/utils/tree'
import { import {
HelpCircleOutline, HelpCircleOutline,
CreateOutline, CreateOutline,
@ -8,19 +9,47 @@ import {
EnterOutline, EnterOutline,
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import MainEventEdit from './components/MainEventEdit'
import SubEventEdit from './components/SubEventEdit'
import EventDdConfig from './components/EventDdConfig'
import { useEvent } from './hooks'
export default defineComponent({ export default defineComponent({
setup() { props: {
dd: {
type: String,
require: true,
},
},
setup(props) {
const { showMainEvent, mainEventData, showNewEvent, eventData } = useEvent()
const dict = {
mainEvent: { label: '主事件', color: 'success' },
eventType: { label: '事件分类', color: 'info' },
subEvent: { label: '子事件', color: 'warning' },
}
const columns = [ const columns = [
{ {
title: '导弹类型/事件名称', title: '事件名称',
key: 'name', key: 'name',
width: 220, width: 'auto',
render: row => { render: row => {
return ( return (
<div class="inline-flex items-center gap-2"> <div class="inline-flex items-center gap-2">
<NIcon> {/* <NIcon>
<HelpCircleOutline /> <HelpCircleOutline />
</NIcon> </NIcon> */}
<NTag
size="small"
round
bordered={false}
type={dict[row.type].color}
>
{dict[row.type].label}
</NTag>
{row.name} {row.name}
</div> </div>
) )
@ -34,10 +63,22 @@ export default defineComponent({
title: '结束时间', title: '结束时间',
key: 'end', key: 'end',
}, },
{ // {
title: '类型', // title: '',
key: 'type', // key: 'type',
}, // render(row) {
// return (
// <NTag
// size="small"
// round
// bordered={false}
// type={dict[row.type].color}
// >
// {dict[row.type].label}
// </NTag>
// )
// },
// },
{ {
title: '图片', title: '图片',
key: 'avatar', key: 'avatar',
@ -52,37 +93,81 @@ export default defineComponent({
{ {
title: '操作', title: '操作',
key: 'action', key: 'action',
render(row) { render(row, rowIndex) {
// console.log(row, rowIndex)
return ( return (
<div class="flex justify-end"> <div class="flex justify-end">
{!row.avatar ? ( {row.type === 'mainEvent' && (
<NButton
type="success"
size="small"
quaternary
onClick={() => handleEdit(row)}
>
<NIcon>
<AddCircleOutline />
</NIcon>
</NButton>
) : null}
<NButton <NButton
type="primary" type="primary"
size="small" size="small"
quaternary quaternary
onClick={() => handleEdit(row)} onClick={() => editMainEvent(row)}
> >
<NIcon> <NIcon>
<CreateOutline /> <CreateOutline />
</NIcon> </NIcon>
编辑事件
</NButton> </NButton>
{row.name.indexOf('DD') === -1 ? ( )}
{row.type === 'eventType' ? (
<NButton
type="success"
size="small"
quaternary
onClick={() => addSubEvent(row)}
>
<NIcon>
<AddCircleOutline />
</NIcon>
添加子事件
</NButton>
) : null}
{row.type === 'isDD' && (
<NButton
type="primary"
size="small"
quaternary
onClick={() => editSubEvent(row)}
>
<NIcon>
<CreateOutline />
</NIcon>
编辑子事件
</NButton>
)}
{Reflect.has(row, 'trajData') && (
<NButton
type="primary"
size="small"
quaternary
onClick={() => ddConfig(row)}
>
<NIcon>
<CreateOutline />
</NIcon>
编辑DD轨迹
</NButton>
)}
{row.type === 'subEvent' && (
<NButton
type="primary"
size="small"
quaternary
onClick={() => editSubEvent(row)}
>
<NIcon>
<CreateOutline />
</NIcon>
编辑子事件
</NButton>
)}
{row.type !== 'eventType' ? (
<NButton <NButton
type="error" type="error"
size="small" size="small"
quaternary quaternary
onClick={() => handleEdit(row)} onClick={() => deleteEvent(row)}
> >
<NIcon> <NIcon>
<TrashBinOutline /> <TrashBinOutline />
@ -96,20 +181,85 @@ export default defineComponent({
}, },
}, },
] ]
function editMainEvent(row) {
showMainEvent.value = true
mainEventData.value = row
}
function addSubEvent(row) {
showNewEvent.value = true
}
function editSubEvent(row) {
showNewEvent.value = true
eventData.value = row
}
const dialog = useDialog()
function deleteEvent(row) {
dialog.warning({
title: '删除事件',
content: `确定删除事件 ${row.name} 吗?`,
positiveText: '确定',
negativeText: '取消',
onPositiveClick: async () => {
// await deleteEventById(row.id)
// getEventList()
},
})
}
function ddConfig(row) {
console.log(row)
dialog.create({
style: 'width:auto;height:90vh',
maskClosable: false,
class: 'flex flex-col',
title: 'DD轨迹',
contentClass: 'flex-1 h-0',
content: () => <EventDdConfig />,
// positiveText: '',
// negativeText: '',
// onPositiveClick: () => {},
})
}
const tableData = ref([]) const tableData = ref([])
onMounted(async () => { onMounted(async () => {
const res = await getMainGantt() await getEventList()
tableData.value = res
}) })
const { getAllKeys } = useTree()
const expandedRowKeys = ref([])
async function getEventList() {
const res = await getEventListByDDType(props.dd)
tableData.value = res.children
expandedRowKeys.value = getAllKeys(tableData.value, 'name')
}
watch(
() => props.dd,
async () => {
getEventList()
}
)
return () => ( return () => (
<>
<NDataTable <NDataTable
class="h-full" class="h-full"
flex-height flex-height
indent={30}
v-model:expanded-row-keys={expandedRowKeys.value}
columns={columns} columns={columns}
data={tableData.value} data={tableData.value}
row-key={row => row.name} row-key={row => row.name}
/> />
<MainEventEdit v-model:show={showMainEvent.value} />
<SubEventEdit v-model:show={showNewEvent.value} />
</>
) )
}, },
}) })

View File

@ -20,9 +20,9 @@ export default defineComponent({
<NRadioButton value="hour" label="日" /> <NRadioButton value="hour" label="日" />
<NRadioButton value="day" label="月" /> <NRadioButton value="day" label="月" />
</NRadioGroup> </NRadioGroup>
<NButton class="ml-auto" type="primary" onClick={editEvent}> {/* <NButton class="ml-auto" type="primary" onClick={editEvent}>
编辑事件 编辑事件
</NButton> </NButton> */}
</div> </div>
<GanttCom scale={value.value} /> <GanttCom scale={value.value} />
</> </>

View File

@ -1,4 +1,5 @@
import { NDataTable, NIcon, NButton } from 'naive-ui' import { NDataTable, NIcon, NButton, NTag } from 'naive-ui'
import { useTree } from '@/utils/tree'
import { getTask } from '@/api/gantt' import { getTask } from '@/api/gantt'
import { import {
HelpCircleOutline, HelpCircleOutline,
@ -10,17 +11,34 @@ import {
export default defineComponent({ export default defineComponent({
setup() { setup() {
const dict = {
task: { label: '任务', color: 'error' },
dd: { label: '主体' },
mainEvent: { label: '主事件', color: 'success' },
eventType: { label: '事件分类', color: 'info' },
subEvent: { label: '子事件', color: 'warning' },
}
const columns = [ const columns = [
{ {
title: '任务名称/事件名称', title: '任务名称/事件名称',
key: 'name', key: 'name',
width: 220, width: 'auto',
render: row => { render: row => {
return ( return (
<div class="inline-flex items-center gap-2"> <div class="inline-flex items-center gap-2">
<NIcon> {row.type && (
<HelpCircleOutline /> <NTag
</NIcon> size="small"
round
bordered={false}
type={dict[row.type]?.color}
>
{dict[row.type].label}
</NTag>
)}
{row.name} {row.name}
</div> </div>
) )
@ -34,10 +52,24 @@ export default defineComponent({
title: '结束时间', title: '结束时间',
key: 'end', key: 'end',
}, },
{ // {
title: '类型', // title: '',
key: 'type', // key: 'type',
}, // render(row) {
// return (
// row.type && (
// <NTag
// size="small"
// round
// bordered={false}
// type={dict[row.type]?.color}
// >
// {dict[row.type].label}
// </NTag>
// )
// )
// },
// },
{ {
title: '图片', title: '图片',
key: 'avatar', key: 'avatar',
@ -110,15 +142,24 @@ export default defineComponent({
}, },
] ]
const tableData = ref([]) const tableData = ref([])
const { getAllKeys } = useTree()
const expandedRowKeys = ref([])
onMounted(async () => { onMounted(async () => {
await getTaskList()
})
async function getTaskList() {
const res = await getTask() const res = await getTask()
tableData.value = res tableData.value = res
}) expandedRowKeys.value = getAllKeys(tableData.value, 'name')
}
return () => ( return () => (
<NDataTable <NDataTable
class="h-full" class="h-full"
flex-height flex-height
indent={30}
v-model:expanded-row-keys={expandedRowKeys.value}
columns={columns} columns={columns}
data={tableData.value} data={tableData.value}
row-key={row => row.name} row-key={row => row.name}

View File

@ -8,12 +8,14 @@ import {
NDrawerContent, NDrawerContent,
NTabs, NTabs,
NTabPane, NTabPane,
NSelect,
} from 'naive-ui' } from 'naive-ui'
import { ArrowForward } from '@vicons/ionicons5' import { ArrowForward } from '@vicons/ionicons5'
import HeaderCom from '../Content/components/Header/index.vue' import HeaderCom from '../Content/components/Header/index.vue'
import TaskList from './components/TaskList' import TaskList from './components/TaskList'
import EventList from './components/EventList' import EventList from './components/EventList'
import NewTask from './components/TaskList/components/NewTask' import NewTask from './components/TaskList/components/NewTask'
import useTask from './components/TaskList/components/NewTask/hooks' import useTask from './components/TaskList/components/NewTask/hooks'
export default defineComponent({ export default defineComponent({
setup() { setup() {
@ -26,6 +28,13 @@ export default defineComponent({
showNewTask.value = true showNewTask.value = true
} }
const ddList = Array.from({ length: 8 }, (_, i) => ({
label: `DD-${i + 1}`,
value: `DD-${i + 1}`,
}))
const dd = ref(`DD-1`)
const paneClass = `border-1 h-full border-l-0 border-[var(--n-tab-border-color)] !p-2` const paneClass = `border-1 h-full border-l-0 border-[var(--n-tab-border-color)] !p-2`
return () => ( return () => (
<div class="flex flex-col bg-[#1c202c] w-h-full"> <div class="flex flex-col bg-[#1c202c] w-h-full">
@ -51,7 +60,7 @@ export default defineComponent({
<NDrawer <NDrawer
class="h-[100vh] bg-[#1c202cee]" class="h-[100vh] bg-[#1c202cee]"
v-model:show={show.value} v-model:show={show.value}
width={document.body.clientWidth - 300} width={document.body.clientWidth - 200}
placement="left" placement="left"
display-directive={'show'} display-directive={'show'}
> >
@ -95,6 +104,11 @@ export default defineComponent({
> >
<div class="flex h-full flex-col gap-2"> <div class="flex h-full flex-col gap-2">
<div class="flex justify-end gap-2 "> <div class="flex justify-end gap-2 ">
<NSelect
class="w-[200px]"
v-model:value={dd.value}
options={ddList}
></NSelect>
<NDatePicker <NDatePicker
v-model:value={range.value} v-model:value={range.value}
type="daterange" type="daterange"
@ -105,7 +119,7 @@ export default defineComponent({
</NButton> */} </NButton> */}
</div> </div>
<div class="flex-1"> <div class="flex-1">
<EventList /> <EventList dd={dd.value} />
</div> </div>
</div> </div>
</NTabPane> </NTabPane>

View File

@ -3,7 +3,7 @@ import { time2Format } from '@/utils/date'
const { mubiaoMap, getHisTraj } = useEntity() const { mubiaoMap, getHisTraj } = useEntity()
const showTrajHour = ref(0) const showTrajHour = ref(5)
const allEntity = ref<Cesium.Entity[]>([]) const allEntity = ref<Cesium.Entity[]>([])
@ -34,35 +34,36 @@ async function getCurTraj(mbId: string) {
const startTime = time2Format(nowDate - showTrajHour.value * 60 * 60 * 1000) const startTime = time2Format(nowDate - showTrajHour.value * 60 * 60 * 1000)
// console.log(object); // console.log(object);
if (mbId) { if (mbId) {
initTraj(mbId)
} else {
;[...mubiaoMap.keys()].forEach(async id => {
initTraj(id)
})
}
async function initTraj(id: string) {
if (entityMap.value.has(id)) {
entityMap.value.get(id)?.forEach(entity => {
viewer.entities.remove(entity)
})
entityMap.value.delete(id)
}
const { points, posArray } = await getHisTraj({ const { points, posArray } = await getHisTraj({
id: mbId, id,
timeRange: [startTime, endDate], timeRange: [startTime, endDate],
}) })
// console.log(points, posArray, 'pos')
const color = Cesium.Color.fromRandom({ alpha: 1 }) const color = Cesium.Color.fromRandom({ alpha: 1 })
const linePoints = Cesium.Cartesian3.fromDegreesArrayHeights(posArray)
drawLine(id, linePoints, color)
drawPoints( drawPoints(
mbId, id,
points.map(point => point.position), points.map(point => point.position),
color color
) )
const linePoints = Cesium.Cartesian3.fromDegreesArrayHeights(posArray)
drawLine(mbId, linePoints, color)
} }
// ;[...mubiaoMap.keys()].forEach(async id => {
// const { points, posArray } = await getHisTraj({
// id,
// timeRange: [startTime, nowDate],
// })
// const color = Cesium.Color.fromRandom({ alpha: 1 })
// drawPoints(points, color)
// const linePoints = Cesium.Cartesian3.fromDegreesArrayHeights(posArray)
// drawLine(linePoints, color)
// })
} }
function drawLine( function drawLine(
@ -111,6 +112,7 @@ function removeAllCurTraj() {
entityMap.value.get(id)?.forEach(entity => { entityMap.value.get(id)?.forEach(entity => {
viewer.entities.remove(entity) viewer.entities.remove(entity)
}) })
entityMap.value.delete(id)
}) })
// allEntity.value.forEach(entity => { // allEntity.value.forEach(entity => {
// viewer.entities.remove(entity) // viewer.entities.remove(entity)

View File

@ -164,7 +164,10 @@ export const useMubiao = () => {
const entity = mubiaoMap.get(id) const entity = mubiaoMap.get(id)
const position = Cesium.Cartesian3.fromDegrees(lon, lat) const position = Cesium.Cartesian3.fromDegrees(lon, lat)
entity.position = position entity.position = position
// console.log(target_direction)
entity.billboard.rotation = Cesium.Math.toRadians(
360 - target_direction + 90
)
entity.orientation = getOrientation({ entity.orientation = getOrientation({
position, position,
heading: target_direction as number, heading: target_direction as number,

View File

@ -16,7 +16,7 @@ interface IBaseFilterParam {
} }
const satelliteList = ref<ISatellite[]>([]) const satelliteList = ref<ISatellite[]>([])
const { satelliteMap } = useEntity() const { satelliteMap, showOrHideLoad } = useEntity()
const showPoint = ref(true) const showPoint = ref(true)
function showPointUnderSat(id?: string) { function showPointUnderSat(id?: string) {
@ -61,7 +61,7 @@ export function useSatellite() {
setTimeout(() => { setTimeout(() => {
// satellite.sensorType = Math.random() > 0.5 ? 'conic' : 'rectangle' // satellite.sensorType = Math.random() > 0.5 ? 'conic' : 'rectangle'
satellite.sensor = true satellite.sensor = showOrHideLoad.value
}, 1000) }, 1000)
// viewer.clock.multiplier = 100 // viewer.clock.multiplier = 100

View File

@ -11,8 +11,19 @@ export default defineComponent({
type: String, type: String,
default: '内容', default: '内容',
}, },
app: {
type: Object,
},
div: {
type: HTMLDivElement,
},
}, },
setup(props, { slots }) { setup(props, { slots }) {
const onClose = () => {
event.stopPropagation()
props.app.mount()
props.div.remove()
}
return () => ( return () => (
<div class="h-[180px] w-[180px] cursor-pointer"> <div class="h-[180px] w-[180px] cursor-pointer">
<NConfigProvider <NConfigProvider
@ -23,13 +34,14 @@ export default defineComponent({
date-locale={dateZhCN} date-locale={dateZhCN}
> >
<NAlert <NAlert
class="h-full !bg-[var(--color-bg)]" class="relative z-30 h-full !bg-[var(--color-bg)]"
type="info" type="info"
title={props.title} title={props.title}
closable closable
v-slots={{ v-slots={{
icon: () => slots.icon(), icon: () => slots.icon(),
}} }}
onClose={onClose}
> >
{props.content} {props.content}
</NAlert> </NAlert>

View File

@ -113,6 +113,8 @@ export const useTextReport = () => {
{ {
title: data.title, title: data.title,
content: data.detailContent, content: data.detailContent,
app: app,
div: div,
}, },
{ {
icon: () => icon: () =>
@ -133,6 +135,7 @@ export const useTextReport = () => {
app.unmount() app.unmount()
div.remove() div.remove()
}, toastMsgTimeSec * 1000 || 10000) }, toastMsgTimeSec * 1000 || 10000)
// }, 100000)
} }
} }

View File

@ -72,7 +72,7 @@ function createWeatherPoint(data) {
height: 30, height: 30,
scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4), scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4),
disableDepthTestDistance: 1000000000, // disableDepthTestDistance: 1000000000,
}, },
}) })
return entity return entity