Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

MouseEvent.js 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * @Author: Caven
  3. * @Date: 2019-12-31 16:58:31
  4. * @Last Modified by: Caven
  5. * @Last Modified time: 2020-02-04 13:27:36
  6. */
  7. import Cesium from '@/namespace'
  8. import Event from './Event'
  9. class MouseEvent extends Event {
  10. constructor(viewer) {
  11. super()
  12. this._viewer = viewer
  13. this._handler = new Cesium.ScreenSpaceEventHandler(this._viewer.canvas)
  14. this._registerEvent()
  15. this.on(Cesium.ScreenSpaceEventType.LEFT_CLICK, this._clickCallback, this)
  16. this.on(
  17. Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
  18. this._dbclickCallback,
  19. this
  20. )
  21. this.on(
  22. Cesium.ScreenSpaceEventType.RIGHT_CLICK,
  23. this._rightClickCallback,
  24. this
  25. )
  26. this.on(
  27. Cesium.ScreenSpaceEventType.MOUSE_MOVE,
  28. this._mouseMoveCallback,
  29. this
  30. )
  31. }
  32. /**
  33. * Register Cesium mouse events
  34. */
  35. _registerEvent() {
  36. for (let key in Cesium.ScreenSpaceEventType) {
  37. let type = Cesium.ScreenSpaceEventType[key]
  38. this._eventCache[type] = new Cesium.Event()
  39. this._handler.setInputAction(movement => {
  40. this._eventCache[type].raiseEvent(movement)
  41. }, type)
  42. }
  43. }
  44. /**
  45. *
  46. * @param {*} target
  47. * gets the target information for the mouse event
  48. */
  49. _getTargetInfo(target) {
  50. let overlay = undefined
  51. let layer = undefined
  52. let feature = undefined
  53. if (target.id && target.id instanceof Cesium.Entity) {
  54. layer = target.id.layer
  55. if (layer && layer.getOverlay) {
  56. overlay = layer.getOverlay(target.id.id)
  57. }
  58. //todo
  59. } else if (target.id instanceof Cesium.Cesium3DTileFeature) {
  60. // todo
  61. }
  62. return { layer: layer, overlay: overlay, feature: feature }
  63. }
  64. /**
  65. * @param {*} type
  66. * @param {*} target
  67. */
  68. _raiseEvent(type, target, position = null) {
  69. let stopPropagation = false
  70. if (target) {
  71. let targetInfo = this._getTargetInfo(target)
  72. let overlay = targetInfo.overlay
  73. if (overlay && overlay.overlayEvent) {
  74. let event = overlay.overlayEvent.getEvent(type)
  75. if (event && event.numberOfListeners > 0) {
  76. event.raiseEvent({
  77. layer: targetInfo.layer,
  78. overlay: overlay,
  79. feature: targetInfo.feature,
  80. position: position
  81. })
  82. stopPropagation = true
  83. }
  84. }
  85. }
  86. if (!stopPropagation) {
  87. let event = this._viewer.viewerEvent.getEvent(type)
  88. if (event && event.numberOfListeners > 0) {
  89. event.raiseEvent({ position: position, overlay: undefined })
  90. }
  91. }
  92. }
  93. /**
  94. *
  95. * @param {*} movement
  96. * default click event callback
  97. */
  98. _clickCallback(movement) {
  99. if (!movement || !movement.position) {
  100. return
  101. }
  102. let target = this._viewer.scene.pick(movement.position)
  103. let cartesian = this._viewer.scene.pickPosition(movement.position)
  104. this._raiseEvent(Cesium.ScreenSpaceEventType.LEFT_CLICK, target, cartesian)
  105. }
  106. /**
  107. *
  108. * @param {*} movement
  109. * default dbclick event callback
  110. */
  111. _dbclickCallback(movement) {
  112. if (!movement || !movement.position) {
  113. return
  114. }
  115. let target = this._viewer.scene.pick(movement.position)
  116. let cartesian = this._viewer.scene.pickPosition(movement.position)
  117. this._raiseEvent(
  118. Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
  119. target,
  120. cartesian
  121. )
  122. }
  123. /**
  124. * @param {*} movement
  125. * default rightclick event callback
  126. */
  127. _rightClickCallback(movement) {
  128. if (!movement || !movement.position) {
  129. return
  130. }
  131. let target = this._viewer.scene.pick(movement.position)
  132. let cartesian = this._viewer.scene.pickPosition(movement.position)
  133. this._raiseEvent(Cesium.ScreenSpaceEventType.RIGHT_CLICK, target, cartesian)
  134. }
  135. /**
  136. *
  137. * @param {*} movement
  138. * default mousemove event callback
  139. */
  140. _mouseMoveCallback(movement) {
  141. if (!movement || !movement.endPosition) {
  142. return
  143. }
  144. let target = this._viewer.scene.pick(movement.endPosition)
  145. this._viewer.canvas.style.cursor = target ? 'pointer' : 'default'
  146. let cartesian = this._viewer.scene.pickPosition(movement.endPosition)
  147. this._raiseEvent(Cesium.ScreenSpaceEventType.MOUSE_MOVE, target, cartesian)
  148. }
  149. }
  150. export default MouseEvent