import { ref, nextTick } from 'vue' import { Subscriber } from 'cesium-extends' import { parseWKT } from '@/utils/parseWKT' import { cesiumTime2Format } from '@/utils/date' import { difference } from 'lodash' import { getMubiao, getMubiaoPos, sendCheckedTargetIds } from '@/api/Mubiao' import { useTree } from '@/utils/tree' import { useMubiaoPopup } from './mubiaoPopup' import { useEntity } from '@/hooks/entity' // import { useEntity } from '@/stores/entity' // import { storeToRefs } from 'pinia' interface IMubiaoNode { country: string targetName: string targetType: string id: string extendInfo: Record<string, any> } interface IMubiao { dataId: string data: IMubiaoNode nodeName: string children?: IMubiao[] } const checkedKeys = ref<Array<string | number>>([]) const data = ref<Record<string, any>[]>([]) const { mubiaoMap, getMBEntityOpt, getEllipsoidEntity, getMBEntityOptOther, createMBConicSensor, mubiaoConicMap, mbPayloadShowMap, } = useEntity() // const { mubiaoMap } = storeToRefs(entity) // const mubiaoMap = ref<Map<string, any>>(new Map()) let subscriber: Subscriber | null = null const { filterTreeNodeByField, getLeafNode } = useTree() const { popupMap, createPopup } = useMubiaoPopup() export const useMubiao = () => { const addMubiao = async (ids: Array<string | number>) => { subscriber = new Subscriber(viewer, { pickResult: { enable: true, }, }) postCheckedIds(ids) // console.log(subscriber, 'subscriber') // const ids = data.map(item => item.id) const addIds = difference(ids, [...mubiaoMap.keys()]) const removeIds = difference([...mubiaoMap.keys()], ids) // 删除 if (removeIds.length > 0) { removeIds.forEach(id => { removeMubiao(id) }) } // 添加 if (addIds.length > 0) { const nodes = filterTreeNodeByField({ treeData: data.value, params: addIds, paramName: 'dataId', }) const targetIdList = nodes.map(({ dataId }: IMubiao) => dataId) // 获取目标坐标 const mbPos = await getMubiaoCurPos(targetIdList) // console.log('mbPos', mbPos) nodes.forEach(async ({ data, dataId: id }: IMubiao) => { const { target_time, target_geom } = mbPos.find(item => item.target_id === id) ?? {} const pos = parseWKT(target_geom).coordinates const [ellipsoidEntity,otherOptEntity] = await addMubiaoEntity({ id, position: pos, target_time, country: data.country, targetType: data.targetType, extendInfo: data.extendInfo, }) if(ellipsoidEntity){ addEventSub(`${id}_model`, ellipsoidEntity, data) mubiaoMap.set(`${id}_model`, ellipsoidEntity) } // console.log(mbEntity, 'mbEntity') addEventSub(id, otherOptEntity, data) mubiaoMap.set(id, otherOptEntity) }) } } async function postCheckedIds(ids: Array<string | number>) { const res = await sendCheckedTargetIds(ids) } const addMubiaoEntity = async ({ id, position, country, target_time, targetType, extendInfo, }: Record<string, string | number | number[]>) => { // 添加目标实体 // console.log(window.settings, targetType, '-----') // const mbEntityOpt = await getMBEntityOpt({ // id, // country, // targetType, // extendInfo, // }) // const mubiaoEntity = viewer.entities.add({ // name: id, // position: Cesium.Cartesian3.fromDegrees( // ...(position as number[]), // targetType === '甲' ? 20000 : 0 // ), // ...mbEntityOpt, // }) let ellipsoid=null; let ellipsoidEntity=null; if(extendInfo?.detectingPayload){ ellipsoid = await getEllipsoidEntity({ id, country, targetType, extendInfo, }) ellipsoidEntity = viewer.entities.add({ name: id, position: Cesium.Cartesian3.fromDegrees( ...(position as number[]), targetType === '甲' ? 20000 : 0 ), ...ellipsoid, }) } const otherOpt = await getMBEntityOptOther({ id, country, targetType, extendInfo, }) const otherOptEntity = viewer.entities.add({ name: id, position: Cesium.Cartesian3.fromDegrees( ...(position as number[]), targetType === '甲' ? 20000 : 0 ), ...otherOpt, }) // const mubiaoEntity = viewer.entities.add({ // name: id, // position: Cesium.Cartesian3.fromDegrees( // ...(position as number[]), // targetType === '甲' ? 20000 : 0 // ), // ...mbEntityOpt, // }) // console.log( mubiaoEntity.position.getValue(),'===== mubiaoEntity.position.getValue()') // console.log( mubiaoEntity.properties.zhName.getValue(),'===== mubiaoEntity.position.getValue()') // console.log( mubiaoEntity.model.show.getValue(),'===== mubiaoEntity.model.show.getValue())') // const zhNameEntity = viewer.entities.add({ // position: new Cesium.CallbackProperty(() => mubiaoEntity.position.getValue(), false), // label: { // text: new Cesium.CallbackProperty(() => // mubiaoEntity.properties.zhName.getValue(), false // ), // show: new Cesium.CallbackProperty(() => // mubiaoEntity.model.show.getValue(), false // 与模型显示状态同步 // ), // font: '12pt 黑体', // fillColor: Cesium.Color.WHITE, // outlineColor: Cesium.Color.BLACK, // pixelOffset: new Cesium.Cartesian2(40, -40), // 在模型右上方 // scaleByDistance: new Cesium.NearFarScalar(7000000, 1.0, 18000000, 0.4) // } // }); if (extendInfo?.detectingPayload?.angle) { const conic = createMBConicSensor({ entity: otherOptEntity, radius: extendInfo?.detectingPayload?.radius, angle: extendInfo?.detectingPayload?.angle, heading: extendInfo?.detectingPayload?.heading, pitch: extendInfo?.detectingPayload?.pitch, show: mbPayloadShowMap.get(id).detectingPayload.show, }) mubiaoConicMap.set(id, conic) } return [ellipsoidEntity,otherOptEntity] } const addEventSub = ( id: string | number, entity: Cesium.Entity, mbData: Record<string, any> ) => { subscriber && subscriber.add( entity, (movement, entity) => { // console.log(movement, 'movement') // console.log(entity, 'entity') createPopup(id, entity, mbData) }, 'LEFT_CLICK' ) // console.log(subscriber, '-------') } const removeMubiao = (id: string | number) => { if (mubiaoMap.has(id)) { subscriber && subscriber.remove(mubiaoMap.get(id), 'LEFT_CLICK') viewer.entities.remove(mubiaoMap.get(id)) mubiaoMap.delete(id) } if (popupMap.has(id)) { popupMap.get(id).windowClose() popupMap.delete(id) } if (mubiaoConicMap.has(id)) { viewer.entities.remove(mubiaoConicMap.get(id)) mubiaoConicMap.delete(id) } } const updateMubiaoPos = async ( mbs: Array<Record<string, string | number>> ) => { // const existsIds = [...mubiaoMap.keys()] if (mbs.length === 0) { return } mbs.forEach( ({ target_id: id, target_lon: lon, target_lat: lat, target_direction, }) => { if (mubiaoMap.has(id)) { const entity = mubiaoMap.get(id) const position = Cesium.Cartesian3.fromDegrees(lon, lat) entity.position = position // console.log(target_direction) entity.billboard.rotation = Cesium.Math.toRadians( 360 - target_direction + 90 ) entity.orientation = getOrientation({ position, heading: target_direction as number, }) } } ) } const getOrientation = ({ position, heading, pitch = 0, roll = 0, }: Record<string, number>) => { //模型朝向 const h = Cesium.Math.toRadians(heading - 90) const p = Cesium.Math.toRadians(pitch) const r = Cesium.Math.toRadians(roll) const hpr = new Cesium.HeadingPitchRoll(h, p, r) const orientation = Cesium.Transforms.headingPitchRollQuaternion( position, hpr ) return orientation } return { data, checkedKeys, getMubiaoData, addMubiao, updateMubiaoPos, } } async function getMubiaoCurPos(ids: Array<string | number>) { const time = cesiumTime2Format(viewer.clock.currentTime) // 获取当前目标位置 const { code, data } = await getMubiaoPos({ ids, current: time }) if (code === '200') { return data } else { return [] } } async function getMubiaoData() { const checked = JSON.parse(JSON.stringify(checkedKeys.value)) // console.log(checked) const { code, data: resData } = await getMubiao() if (code === '200') { data.value = [resData] checkedKeys.value = [] getAllNodesToPayload() nextTick(() => { checkedKeys.value = checked }) } } function getAllNodesToPayload() { const mbList = getLeafNode(data.value[0]) mbList.forEach(node => { const { dataId, data: nodeData } = node const { extendInfo } = nodeData const detectingShow = mbPayloadShowMap.get(dataId)?.detectingPayload?.show || false; if (extendInfo) { mbPayloadShowMap.set(dataId, { data: toRaw(nodeData), detectingPayload: { ...extendInfo, show: detectingShow }, }) } }) console.log('mbPayloadShowMap', mbPayloadShowMap) }