You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MouseEvent.js 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * @Author: Caven
  3. * @Date: 2019-12-31 16:58:31
  4. * @Last Modified by: Caven
  5. * @Last Modified time: 2020-05-15 19:38:39
  6. */
  7. import { MouseEventType } from './EventType'
  8. import Event from './Event'
  9. const { Cesium } = DC.Namespace
  10. /**
  11. * Mouse events in 3D scene, optimized Cesium event model
  12. */
  13. class MouseEvent extends Event {
  14. constructor(viewer) {
  15. super()
  16. this._viewer = viewer
  17. this._selected = undefined
  18. this._setInputAction()
  19. this.on(MouseEventType.CLICK, this._clickHandler, this)
  20. this.on(MouseEventType.DB_CLICK, this._dbClickHandler, this)
  21. this.on(MouseEventType.RIGHT_CLICK, this._rightClickHandler, this)
  22. this.on(MouseEventType.MOUSE_MOVE, this._mouseMoveHandler, this)
  23. }
  24. /**
  25. *
  26. * Register Cesium mouse events
  27. *
  28. */
  29. _setInputAction() {
  30. let handler = new Cesium.ScreenSpaceEventHandler(this._viewer.canvas)
  31. Object.keys(Cesium.ScreenSpaceEventType).forEach(key => {
  32. let type = Cesium.ScreenSpaceEventType[key]
  33. this._cache[type] = new Cesium.Event()
  34. handler.setInputAction(movement => {
  35. this._cache[type].raiseEvent(movement)
  36. }, type)
  37. })
  38. }
  39. /**
  40. *
  41. * Gets the mouse information for the mouse event
  42. * @param {*} position
  43. *
  44. */
  45. _getMouseInfo(position) {
  46. let scene = this._viewer.scene
  47. let target = scene.pick(position)
  48. let cartesian = undefined
  49. if (scene.pickPositionSupported) {
  50. cartesian = scene.pickPosition(position)
  51. }
  52. let surfaceCartesian = undefined
  53. if (scene.mode === Cesium.SceneMode.SCENE3D) {
  54. let ray = scene.camera.getPickRay(position)
  55. surfaceCartesian = scene.globe.pick(ray, scene)
  56. } else {
  57. surfaceCartesian = scene.camera.pickEllipsoid(
  58. position,
  59. Cesium.Ellipsoid.WGS84
  60. )
  61. }
  62. return {
  63. target: target,
  64. windowPosition: position,
  65. position: cartesian,
  66. surfacePosition: surfaceCartesian
  67. }
  68. }
  69. /**
  70. * Gets the Overlay id
  71. * @param {*} target
  72. */
  73. _getOverlayId(target) {
  74. let overlayId = undefined
  75. /**
  76. * Entity
  77. */
  78. if (target && target.id && target.id instanceof Cesium.Entity) {
  79. overlayId = target.id.overlayId
  80. }
  81. /**
  82. * Cesium3DTileFeature
  83. */
  84. if (target && target instanceof Cesium.Cesium3DTileFeature) {
  85. overlayId = target.tileset.overlayId
  86. }
  87. return overlayId
  88. }
  89. /**
  90. *
  91. * Gets the target information for the mouse event
  92. * @param {*} target
  93. *
  94. */
  95. _getTargetInfo(target) {
  96. let overlay = undefined
  97. let layer = undefined
  98. let feature = undefined
  99. /**
  100. * Entity
  101. */
  102. if (target && target.id && target.id instanceof Cesium.Entity) {
  103. layer = target.id.layer
  104. if (layer && layer.getOverlay) {
  105. overlay = layer.getOverlay(target.id.overlayId)
  106. }
  107. }
  108. /**
  109. * Cesium3DTileFeature
  110. */
  111. if (target && target instanceof Cesium.Cesium3DTileFeature) {
  112. layer = target.tileset.layer
  113. feature = target
  114. if (layer && layer.getOverlay) {
  115. overlay = layer.getOverlay(target.tileset.overlayId)
  116. let propertyNames = feature.getPropertyNames()
  117. propertyNames.forEach(item => {
  118. overlay.attr[item] = feature.getProperty(item)
  119. })
  120. }
  121. }
  122. return { layer: layer, overlay: overlay, feature: feature }
  123. }
  124. /**
  125. *
  126. * @param {*} type
  127. * @param {*} mouseInfo
  128. *
  129. */
  130. _raiseEvent(type, mouseInfo = {}) {
  131. let event = undefined
  132. let targetInfo = this._getTargetInfo(mouseInfo.target)
  133. let overlay = targetInfo.overlay
  134. if (overlay && overlay.overlayEvent) {
  135. event = overlay.overlayEvent.getEvent(type)
  136. }
  137. // stopPropagation
  138. !event && (event = this._viewer.viewerEvent.getEvent(type))
  139. event &&
  140. event.numberOfListeners > 0 &&
  141. event.raiseEvent({
  142. ...targetInfo,
  143. ...mouseInfo
  144. })
  145. }
  146. /**
  147. *
  148. * Default click event handler
  149. * @param {*} movement
  150. *
  151. */
  152. _clickHandler(movement) {
  153. if (!movement || !movement.position) {
  154. return false
  155. }
  156. let mouseInfo = this._getMouseInfo(movement.position)
  157. this._raiseEvent(MouseEventType.CLICK, mouseInfo)
  158. }
  159. /**
  160. *
  161. * Default dbClick event handler
  162. * @param {*} movement
  163. *
  164. */
  165. _dbClickHandler(movement) {
  166. if (!movement || !movement.position) {
  167. return false
  168. }
  169. let mouseInfo = this._getMouseInfo(movement.position)
  170. this._raiseEvent(MouseEventType.DB_CLICK, mouseInfo)
  171. }
  172. /**
  173. *
  174. * Default rightclick event handler
  175. * @param {*} movement
  176. *
  177. */
  178. _rightClickHandler(movement) {
  179. if (!movement || !movement.position) {
  180. return false
  181. }
  182. let mouseInfo = this._getMouseInfo(movement.position)
  183. this._raiseEvent(MouseEventType.RIGHT_CLICK, mouseInfo)
  184. }
  185. /**
  186. *
  187. * Default mousemove event handler
  188. * @param {*} movement
  189. *
  190. */
  191. _mouseMoveHandler(movement) {
  192. if (!movement || !movement.endPosition) {
  193. return false
  194. }
  195. let mouseInfo = this._getMouseInfo(movement.endPosition)
  196. this._viewer.canvas.style.cursor = mouseInfo.target ? 'pointer' : 'default'
  197. this._raiseEvent(MouseEventType.MOUSE_MOVE, mouseInfo)
  198. // add event for overlay
  199. if (
  200. !this._selected ||
  201. this._getOverlayId(this._selected.target) !==
  202. this._getOverlayId(mouseInfo.target)
  203. ) {
  204. this._raiseEvent(MouseEventType.MOUSE_OUT, this._selected)
  205. this._raiseEvent(MouseEventType.MOUSE_OVER, mouseInfo)
  206. this._selected = mouseInfo
  207. }
  208. }
  209. }
  210. export default MouseEvent