use-mouse-tool.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. export function useMouseTool() {
  9. const root = getRoot()
  10. const state = reactive({
  11. pinNum: 0,
  12. polylineNum: 0,
  13. PolygonNum: 0,
  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: type + state.pinNum,
  23. icon: pin2d8cf0,
  24. })
  25. state.pinNum++
  26. root?.$mouseTool.on('draw', getDrawCallback)
  27. }
  28. function drawPolyline(type: MapDoodleType, getDrawCallback: Function) {
  29. root?.$mouseTool.polyline({
  30. strokeColor: '#2d8cf0',
  31. strokeOpacity: 1,
  32. strokeWeight: 2,
  33. strokeStyle: 'solid',
  34. title: type + state.polylineNum++
  35. })
  36. root?.$mouseTool.on('draw', getDrawCallback)
  37. }
  38. function drawPolygon(type: MapDoodleType, getDrawCallback: Function) {
  39. root?.$mouseTool.polygon({
  40. strokeColor: '#2d8cf0',
  41. strokeOpacity: 1,
  42. strokeWeight: 2,
  43. fillColor: '#1791fc',
  44. fillOpacity: 0.4,
  45. title: type + state.PolygonNum++
  46. })
  47. root?.$mouseTool.on('draw', getDrawCallback)
  48. }
  49. function drawOff(type: MapDoodleType) {
  50. root?.$mouseTool.close()
  51. root?.$mouseTool.off('draw')
  52. }
  53. function drawFlightAreaPolygon(type: EFlightAreaType, getDrawFlightAreaCallback: Function) {
  54. root?.$mouseTool.polygon({
  55. strokeColor: flightAreaColorMap[type],
  56. strokeOpacity: 1,
  57. strokeWeight: 4,
  58. extData: {
  59. type: type,
  60. mapType: 'polygon',
  61. },
  62. strokeStyle: 'dashed',
  63. strokeDasharray: EFlightAreaType.NFZ === type ? [10, 2] : [10, 1, 2],
  64. fillColor: flightAreaColorMap[type],
  65. fillOpacity: EFlightAreaType.NFZ === type ? 0.3 : 0,
  66. })
  67. root?.$mouseTool.on('draw', getDrawFlightAreaCallback)
  68. }
  69. function drawFlightAreaCircle(type: EFlightAreaType, getDrawFlightAreaCallback: Function) {
  70. root?.$mouseTool.circle({
  71. strokeColor: flightAreaColorMap[type],
  72. strokeOpacity: 1,
  73. strokeWeight: 6,
  74. extData: {
  75. type: type,
  76. mapType: 'circle',
  77. },
  78. strokeStyle: 'dashed',
  79. strokeDasharray: EFlightAreaType.NFZ === type ? [10, 2] : [10, 1, 2],
  80. fillColor: flightAreaColorMap[type],
  81. fillOpacity: EFlightAreaType.NFZ === type ? 0.3 : 0,
  82. })
  83. root?.$mouseTool.on('draw', getDrawFlightAreaCallback)
  84. }
  85. function mouseTool(type: MapDoodleType, getDrawCallback: Function, flightAreaType?: EFlightAreaType) {
  86. state.currentType = type
  87. if (flightAreaType) {
  88. switch (type) {
  89. case MapDoodleEnum.POLYGON:
  90. drawFlightAreaPolygon(flightAreaType, getDrawCallback)
  91. return
  92. case MapDoodleEnum.CIRCLE:
  93. drawFlightAreaCircle(flightAreaType, getDrawCallback)
  94. return
  95. default:
  96. message.error(`Invalid type: ${flightAreaType}`)
  97. return
  98. }
  99. }
  100. switch (type) {
  101. case MapDoodleEnum.PIN:
  102. drawPin(type, getDrawCallback)
  103. break
  104. case MapDoodleEnum.POLYLINE:
  105. drawPolyline(type, getDrawCallback)
  106. break
  107. case MapDoodleEnum.POLYGON:
  108. drawPolygon(type, getDrawCallback)
  109. break
  110. case MapDoodleEnum.Close:
  111. drawOff(type)
  112. break
  113. }
  114. }
  115. return {
  116. mouseTool
  117. }
  118. }