use-mouse-tool.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { reactive } from 'vue'
  2. import pin2d8cf0 from '/@/assets/icons/pin-2d8cf0.svg'
  3. import { MapDoodleType } from '/@/constants/map'
  4. import { getRoot } from '/@/root'
  5. import { MapDoodleEnum } from '/@/types/map-enum'
  6. import { EFlightAreaType } from '../types/flight-area'
  7. import { message } from 'ant-design-vue'
  8. import { ELocalStorageKey } from '../types'
  9. export function useMouseTool() {
  10. const root = getRoot()
  11. const userName = localStorage.getItem(ELocalStorageKey.Username) || ''
  12. const state = reactive({
  13. serial: 1,
  14. currentType: '',
  15. })
  16. const flightAreaColorMap = {
  17. [EFlightAreaType.DFENCE]: '#19be6b',
  18. [EFlightAreaType.NFZ]: '#ff0000',
  19. }
  20. function drawPin(type: MapDoodleType, getDrawCallback: Function) {
  21. root?.$mouseTool.marker({
  22. title: userName + state.serial,
  23. icon: pin2d8cf0,
  24. })
  25. state.serial++
  26. root?.$mouseTool.on('draw', getDrawCallback)
  27. }
  28. function drawPolyline(type: MapDoodleType, getDrawCallback: Function) {
  29. root?.$mouseTool.polyline({
  30. title: userName + state.serial,
  31. strokeColor: '#2d8cf0',
  32. strokeOpacity: 1,
  33. strokeWeight: 2,
  34. strokeStyle: 'solid',
  35. })
  36. state.serial++
  37. root?.$mouseTool.on('draw', getDrawCallback)
  38. }
  39. function drawPolygon(type: MapDoodleType, getDrawCallback: Function) {
  40. root?.$mouseTool.polygon({
  41. title: userName + state.serial,
  42. strokeColor: '#2d8cf0',
  43. strokeOpacity: 1,
  44. strokeWeight: 2,
  45. fillColor: '#1791fc',
  46. fillOpacity: 0.4,
  47. })
  48. state.serial++
  49. root?.$mouseTool.on('draw', getDrawCallback)
  50. }
  51. function drawOff(type: MapDoodleType) {
  52. root?.$mouseTool.close()
  53. root?.$mouseTool.off('draw')
  54. }
  55. function drawFlightAreaPolygon(type: EFlightAreaType, getDrawFlightAreaCallback: Function) {
  56. root?.$mouseTool.polygon({
  57. strokeColor: flightAreaColorMap[type],
  58. strokeOpacity: 1,
  59. strokeWeight: 4,
  60. extData: {
  61. type: type,
  62. mapType: 'polygon',
  63. },
  64. strokeStyle: 'dashed',
  65. strokeDasharray: EFlightAreaType.NFZ === type ? [10, 2] : [10, 1, 2],
  66. fillColor: flightAreaColorMap[type],
  67. fillOpacity: EFlightAreaType.NFZ === type ? 0.3 : 0,
  68. })
  69. root?.$mouseTool.on('draw', getDrawFlightAreaCallback)
  70. }
  71. function drawFlightAreaCircle(type: EFlightAreaType, getDrawFlightAreaCallback: Function) {
  72. root?.$mouseTool.circle({
  73. strokeColor: flightAreaColorMap[type],
  74. strokeOpacity: 1,
  75. strokeWeight: 6,
  76. extData: {
  77. type: type,
  78. mapType: 'circle',
  79. },
  80. strokeStyle: 'dashed',
  81. strokeDasharray: EFlightAreaType.NFZ === type ? [10, 2] : [10, 1, 2],
  82. fillColor: flightAreaColorMap[type],
  83. fillOpacity: EFlightAreaType.NFZ === type ? 0.3 : 0,
  84. })
  85. root?.$mouseTool.on('draw', getDrawFlightAreaCallback)
  86. }
  87. function mouseTool(type: MapDoodleType, getDrawCallback: Function, flightAreaType?: EFlightAreaType) {
  88. state.currentType = type
  89. if (flightAreaType) {
  90. switch (type) {
  91. case MapDoodleEnum.POLYGON:
  92. drawFlightAreaPolygon(flightAreaType, getDrawCallback)
  93. return
  94. case MapDoodleEnum.CIRCLE:
  95. drawFlightAreaCircle(flightAreaType, getDrawCallback)
  96. return
  97. default:
  98. message.error(`Invalid type: ${flightAreaType}`)
  99. return
  100. }
  101. }
  102. switch (type) {
  103. case MapDoodleEnum.PIN:
  104. drawPin(type, getDrawCallback)
  105. break
  106. case MapDoodleEnum.POLYLINE:
  107. drawPolyline(type, getDrawCallback)
  108. break
  109. case MapDoodleEnum.POLYGON:
  110. drawPolygon(type, getDrawCallback)
  111. break
  112. case MapDoodleEnum.Close:
  113. drawOff(type)
  114. break
  115. }
  116. }
  117. return {
  118. mouseTool
  119. }
  120. }