Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * @Author: Caven
  3. * @Date: 2020-04-01 10:36:36
  4. */
  5. import { Cesium } from '@dc-modules/namespace'
  6. import { SceneEventType, TrackEventType } from '@dc-modules/event'
  7. import TrackViewMode from './TrackViewMode'
  8. class TrackController {
  9. constructor(viewer) {
  10. this._viewer = viewer
  11. this._cache = {}
  12. this._delegete = new Cesium.CustomDataSource('history-track-layer')
  13. this._viewer.dataSources.add(this._delegete)
  14. this._activedTrack = undefined
  15. this._viewMode = undefined
  16. this._viewOption = {}
  17. this._stopTime = undefined
  18. }
  19. get delegate() {
  20. return this._delegete.entities
  21. }
  22. /**
  23. * @private
  24. */
  25. _onPostRender() {
  26. Object.keys(this._cache).forEach(key => {
  27. let track = this._cache[key]
  28. track.trackEvent &&
  29. track.trackEvent.fire(TrackEventType.POST_RENDER, {
  30. viewer: this._viewer,
  31. viewOption: this._viewOption
  32. })
  33. })
  34. this._viewer.scene.requestRender()
  35. }
  36. /**
  37. *
  38. * @param track
  39. * @returns {TrackController}
  40. */
  41. addTrack(track) {
  42. if (
  43. track &&
  44. track.trackEvent &&
  45. !this._cache.hasOwnProperty(track.trackId)
  46. ) {
  47. track.trackEvent.fire(TrackEventType.ADD, this)
  48. this._cache[track.trackId] = track
  49. }
  50. return this
  51. }
  52. /**
  53. *
  54. * @param tracks
  55. * @returns {TrackController}
  56. */
  57. addTracks(tracks) {
  58. if (Array.isArray(tracks)) {
  59. tracks.forEach(item => {
  60. this.addTrack(item)
  61. })
  62. }
  63. return this
  64. }
  65. /**
  66. * Returns a track
  67. * @param id
  68. * @returns {*|undefined}
  69. */
  70. getTrack(id) {
  71. let filters = this.getTracks().filter(item => item.id === id)
  72. return filters && filters.length ? filters[0] : undefined
  73. }
  74. /**
  75. * Removes a track
  76. * @param track
  77. * @returns {TrackController}
  78. */
  79. removeTrack(track) {
  80. if (
  81. track &&
  82. track.trackEvent &&
  83. this._cache.hasOwnProperty(track.trackId)
  84. ) {
  85. track.trackEvent.fire(TrackEventType.REMOVE, this)
  86. delete this._cache[track.trackId]
  87. }
  88. return this
  89. }
  90. /**
  91. *
  92. * @returns {*[]}
  93. */
  94. getTracks() {
  95. let result = []
  96. Object.keys(this._cache).forEach(key => {
  97. result.push(this._cache[key])
  98. })
  99. return result
  100. }
  101. /**
  102. * Starts play all path
  103. * @returns {TrackController}
  104. */
  105. play() {
  106. let now = Cesium.JulianDate.now()
  107. Object.keys(this._cache).forEach(key => {
  108. let track = this._cache[key]
  109. track.startTime = now
  110. track.viewed = false
  111. })
  112. this._activedTrack = undefined
  113. this._stopTime = undefined
  114. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  115. this._viewer.on(SceneEventType.POST_RENDER, this._onPostRender, this)
  116. return this
  117. }
  118. /**
  119. *
  120. */
  121. pause() {
  122. this._stopTime = Cesium.JulianDate.now()
  123. this._viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
  124. this._viewer.delegate.trackedEntity = undefined
  125. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  126. return this
  127. }
  128. /**
  129. *
  130. */
  131. restore() {
  132. if (this._stopTime) {
  133. let now = Cesium.JulianDate.now()
  134. Object.keys(this._cache).forEach(key => {
  135. let track = this._cache[key]
  136. track.trackEvent.fire(TrackEventType.RESET_TIME_LINE, {
  137. stopTime: this._stopTime,
  138. duration: Cesium.JulianDate.secondsDifference(now, this._stopTime)
  139. })
  140. })
  141. }
  142. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  143. this._viewer.on(SceneEventType.POST_RENDER, this._onPostRender, this)
  144. return this
  145. }
  146. /**
  147. *
  148. * @param speed
  149. * @returns {TrackController}
  150. */
  151. changeSpeed(speed) {
  152. this._viewer.clock.multiplier = speed
  153. return this
  154. }
  155. /**
  156. *
  157. * @param track
  158. * @param viewOption
  159. * @returns {TrackController}
  160. */
  161. viewTrack(track, viewOption = {}) {
  162. if (!this._cache.hasOwnProperty(track.trackId)) {
  163. throw new Error('TrackController: track does not added ')
  164. }
  165. this._viewOption = viewOption
  166. if (this._activedTrack) {
  167. this._activedTrack.viewed = false
  168. }
  169. track.viewed = true
  170. this._activedTrack = track
  171. if (viewOption.mode === TrackViewMode.FREE) {
  172. this._viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
  173. this._viewer.delegate.trackedEntity = undefined
  174. }
  175. return this
  176. }
  177. /**
  178. *
  179. * @param track
  180. * @returns {TrackController}
  181. */
  182. releaseTrack(track) {
  183. if (!this._cache.hasOwnProperty(track.trackId)) {
  184. throw new Error('TrackController: track does not added ')
  185. }
  186. if (track.viewed) {
  187. track.viewed = false
  188. }
  189. this._activedTrack = undefined
  190. this._viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
  191. this._viewer.delegate.trackedEntity = undefined
  192. return this
  193. }
  194. /**
  195. *
  196. * @returns {TrackController}
  197. */
  198. clear() {
  199. this._cache = {}
  200. this._activedTrack && (this._activedTrack.viewed = false)
  201. this._activedTrack = undefined
  202. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  203. return this
  204. }
  205. }
  206. export default TrackController