| New file |
| | |
| | | <template> |
| | | <div></div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import * as Cesium from 'cesium' |
| | | import { ElMessage } from 'element-plus' |
| | | |
| | | let curPolygonPosition = [] |
| | | let savePolygonPosition = [] |
| | | let curPolygon = null |
| | | let curPolygonEntity = null |
| | | let curPolygonObj = null |
| | | let menuPanel = null |
| | | let saveMenuPanel = null |
| | | |
| | | const viewInstance = inject('viewInstance') |
| | | const homeViewer = inject('homeViewer') |
| | | |
| | | const updateBoxSelect = inject('updateBoxSelect') |
| | | |
| | | function preventDefault(event) { |
| | | event.preventDefault() |
| | | |
| | | return |
| | | } |
| | | |
| | | function init() { |
| | | // draw.drawPlane(); |
| | | curPolygon = new Cesium.PolygonHierarchy() |
| | | curPolygonEntity = new Cesium.Entity() |
| | | |
| | | homeViewer.value.scene.globe.depthTestAgainstTerrain = true |
| | | |
| | | viewInstance.value.addLeftClickEvent(null, addPlanerPointEvent, 'drawCustomPolygon') |
| | | viewInstance.value.addRightClickEvent(null, addPlanarMenuEvent, 'drawCustomPolygon') |
| | | viewInstance.value.addMouseHandler(null, mouseMoveEvent, 'drawCustomPolygon') |
| | | } |
| | | |
| | | function mouseMoveEvent(movement, viewer) { |
| | | const mouseInfo = viewInstance.value.getMouseInfoAll(movement.endPosition) |
| | | |
| | | const { x, y } = mouseInfo.windowPosition |
| | | |
| | | if (!menuPanel) { |
| | | menuPanel = createMenuPanel() |
| | | viewer.container.appendChild(menuPanel) |
| | | } |
| | | |
| | | menuPanel.style.transform = `translate3d(${x}px, ${y}px, 0)` |
| | | |
| | | if ( |
| | | curPolygonObj && |
| | | mouseInfo.surfacePosition && |
| | | mouseInfo.surfacePosition != null && |
| | | curPolygonPosition.length >= 1 |
| | | ) { |
| | | curPolygonPosition.pop() |
| | | curPolygonPosition.push(mouseInfo.surfacePosition) |
| | | |
| | | curPolygon.positions.pop() |
| | | curPolygon.positions.push(mouseInfo.surfacePosition) |
| | | } |
| | | } |
| | | |
| | | function addPlanerPointEvent(click, pick) { |
| | | const { position } = click |
| | | |
| | | const mouseInfo = viewInstance.value.getMouseInfoAll(position) |
| | | |
| | | if (mouseInfo.surfacePosition && mouseInfo.surfacePosition != null) drawCustomPolygon(mouseInfo) |
| | | } |
| | | |
| | | function addPlanarMenuEvent(click, pick, viewer) { |
| | | if (savePolygonPosition.length <= 2) { |
| | | ElMessage.warning('当前绘制无法形成面,请继续绘制或取消绘制!!') |
| | | |
| | | return |
| | | } |
| | | const { position } = click |
| | | |
| | | const mouseInfo = viewInstance.value.getMouseInfoAll(position) |
| | | |
| | | remove() |
| | | removeMenuPanel() |
| | | |
| | | if (mouseInfo.surfacePosition && mouseInfo.surfacePosition != null) drawCustomPolygon(mouseInfo) |
| | | |
| | | const { x, y } = position |
| | | saveMenuPanel = createSaveMenuPanel() |
| | | saveMenuPanel.addEventListener('click', saveMenuClickEvent) |
| | | saveMenuPanel.style.transform = `translate3d(${x}px, ${y}px, 0)` |
| | | viewer.container.appendChild(saveMenuPanel) |
| | | } |
| | | |
| | | function createSaveMenuPanel() { |
| | | const menuPanel = document.createElement('div') |
| | | menuPanel.className = 'planar-menu-panel' |
| | | |
| | | const arr = [ |
| | | { title: '保存框选', class: 'save-draw' }, |
| | | { title: '清除框选', class: 'anew-draw' }, |
| | | ] |
| | | |
| | | arr.forEach(item => { |
| | | const title = document.createElement('div') |
| | | title.innerText = item.title |
| | | title.className = item.class |
| | | menuPanel.appendChild(title) |
| | | }) |
| | | |
| | | return menuPanel |
| | | } |
| | | |
| | | const emit = defineEmits(['upDateBoxSelect']) |
| | | |
| | | function saveMenuClickEvent(e) { |
| | | const className = e.target.className |
| | | if (className === 'save-draw') { |
| | | emit('upDateBoxSelect') |
| | | updateBoxSelect(savePolygonPosition) |
| | | } |
| | | if (className == 'anew-draw') { |
| | | cancel() |
| | | } |
| | | |
| | | removeSaveMenuPanel() |
| | | } |
| | | |
| | | function removeSaveMenuPanel() { |
| | | if (saveMenuPanel) { |
| | | homeViewer.value.container?.removeChild(saveMenuPanel) |
| | | saveMenuPanel.removeEventListener('click', saveMenuClickEvent) |
| | | saveMenuPanel = null |
| | | } |
| | | } |
| | | |
| | | function createMenuPanel() { |
| | | const menuPanel = document.createElement('div') |
| | | menuPanel.className = 'planar-menu-panel' |
| | | |
| | | const title = document.createElement('div') |
| | | title.innerText = '左击选择点位,右击结束' |
| | | title.className = 'proof-custom-add-polygon' |
| | | menuPanel.appendChild(title) |
| | | |
| | | return menuPanel |
| | | } |
| | | |
| | | function removeMenuPanel() { |
| | | if (menuPanel) { |
| | | homeViewer.value.container?.removeChild(menuPanel) |
| | | menuPanel = null |
| | | } |
| | | } |
| | | |
| | | function drawCustomPolygon(point) { |
| | | if (curPolygonPosition.length == 0) { |
| | | curPolygonPosition.push(point.surfacePosition.clone()) |
| | | curPolygon.positions.push(point.surfacePosition.clone()) |
| | | } |
| | | |
| | | savePolygonPosition.push(point.wgs84SurfacePosition) |
| | | curPolygonPosition.push(point.surfacePosition.clone()) |
| | | curPolygon.positions.push(point.surfacePosition.clone()) |
| | | |
| | | if (!curPolygonObj) { |
| | | curPolygonEntity.polyline = { |
| | | width: 2, |
| | | material: Cesium.Color.WHITE, |
| | | clampToGround: false, |
| | | } |
| | | |
| | | curPolygonEntity.polyline.positions = new Cesium.CallbackProperty(function () { |
| | | return curPolygonPosition |
| | | }, false) |
| | | |
| | | curPolygonEntity.polygon = { |
| | | hierarchy: new Cesium.CallbackProperty(function () { |
| | | return curPolygon |
| | | }, false), |
| | | |
| | | material: Cesium.Color.fromCssColorString('#00ffff').withAlpha(0.4), |
| | | clampToGround: false, |
| | | } |
| | | curPolygonEntity.name = 'customProofPolygon' |
| | | |
| | | curPolygonEntity._id = 'customProofPolygon' |
| | | curPolygonObj = homeViewer.value.entities.add(curPolygonEntity) |
| | | } |
| | | } |
| | | |
| | | function clearPlanar() { |
| | | homeViewer.value.entities.remove(curPolygonObj) |
| | | curPolygonObj = null |
| | | curPolygon = null |
| | | curPolygonEntity = null |
| | | curPolygonPosition = [] |
| | | savePolygonPosition = [] |
| | | } |
| | | |
| | | function remove() { |
| | | viewInstance.value.removeLeftClickEvent('drawCustomPolygon') |
| | | viewInstance.value.removeRightClickEvent('drawCustomPolygon') |
| | | viewInstance.value.removeMouseHandler('drawCustomPolygon') |
| | | } |
| | | |
| | | function cancel() { |
| | | remove() |
| | | removeMenuPanel() |
| | | clearPlanar() |
| | | |
| | | init() |
| | | } |
| | | |
| | | onMounted(() => { |
| | | document.addEventListener('contextmenu', preventDefault) |
| | | |
| | | init() |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | | document.removeEventListener('contextmenu', preventDefault) |
| | | |
| | | remove() |
| | | removeMenuPanel() |
| | | removeSaveMenuPanel() |
| | | clearPlanar() |
| | | homeViewer.value.scene.globe.depthTestAgainstTerrain = false |
| | | }) |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | p { |
| | | text-indent: 2em; |
| | | color: #ffffff; |
| | | font-size: 18px; |
| | | } |
| | | |
| | | .export-btns { |
| | | margin-top: 44px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-around; |
| | | |
| | | .el-button { |
| | | background-color: transparent !important; |
| | | } |
| | | } |
| | | </style> |