選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /**
  2. * @Author: Caven
  3. * @Date: 2020-08-29 19:26:06
  4. */
  5. import { Cesium } from '@dc-modules/namespace'
  6. import { OverlayType } from '@dc-modules/overlay'
  7. import DrawPoint from './draw/DrawPoint'
  8. import DrawPolyline from './draw/DrawPolyline'
  9. import DrawPolygon from './draw/DrawPolygon'
  10. import DrawCircle from './draw/DrawCircle'
  11. import DrawRectangle from './draw/DrawRectangle'
  12. import DrawBillboard from './draw/DrawBillboard'
  13. import DrawAttackArrow from './draw/DrawAttackArrow'
  14. import DrawDoubleArrow from './draw/DrawDoubleArrow'
  15. import DrawFineArrow from './draw/DrawFineArrow'
  16. import DrawGatheringPlace from './draw/DrawGatheringPlace'
  17. import DrawTailedAttackArrow from './draw/DrawTailedAttackArrow'
  18. import EditPoint from './edit/EditPoint'
  19. import EditPolyline from './edit/EditPolyline'
  20. import EditPolygon from './edit/EditPolygon'
  21. import EditCircle from './edit/EditCircle'
  22. import EditRectangle from './edit/EditRectangle'
  23. import EditBillboard from './edit/EditBillboard'
  24. import EditAttackArrow from './edit/EditAttackArrow'
  25. import EditDoubleArrow from './edit/EditDoubleArrow'
  26. import EditFineArrow from './edit/EditFineArrow'
  27. import EditGatheringPlace from './edit/EditGatheringPlace'
  28. import EditTailedAttackArrow from './edit/EditTailedAttackArrow'
  29. class Plot {
  30. constructor(viewer, options = {}) {
  31. this._viewer = viewer
  32. this._options = options
  33. this._layer = new Cesium.CustomDataSource('plot-layer')
  34. this._viewer.dataSources.add(this._layer)
  35. this._currentWorker = undefined
  36. this._state = undefined
  37. }
  38. get viewer() {
  39. return this._viewer
  40. }
  41. get layer() {
  42. return this._layer
  43. }
  44. get state() {
  45. return this._state
  46. }
  47. /**
  48. *
  49. * @param type
  50. * @param style
  51. * @private
  52. */
  53. _createDrawWorker(type, style) {
  54. let drawWorker = undefined
  55. switch (type) {
  56. case OverlayType.POINT:
  57. drawWorker = new DrawPoint(style)
  58. break
  59. case OverlayType.POLYLINE:
  60. drawWorker = new DrawPolyline(style)
  61. break
  62. case OverlayType.POLYGON:
  63. drawWorker = new DrawPolygon(style)
  64. break
  65. case OverlayType.CIRCLE:
  66. drawWorker = new DrawCircle(style)
  67. break
  68. case OverlayType.RECTANGLE:
  69. drawWorker = new DrawRectangle(style)
  70. break
  71. case OverlayType.BILLBOARD:
  72. drawWorker = new DrawBillboard(style)
  73. break
  74. case OverlayType.ATTACK_ARROW:
  75. drawWorker = new DrawAttackArrow(style)
  76. break
  77. case OverlayType.DOUBLE_ARROW:
  78. drawWorker = new DrawDoubleArrow(style)
  79. break
  80. case OverlayType.FINE_ARROW:
  81. drawWorker = new DrawFineArrow(style)
  82. break
  83. case OverlayType.TAILED_ATTACK_ARROW:
  84. drawWorker = new DrawTailedAttackArrow(style)
  85. break
  86. case OverlayType.GATHERING_PLACE:
  87. drawWorker = new DrawGatheringPlace(style)
  88. break
  89. default:
  90. break
  91. }
  92. return drawWorker
  93. }
  94. /**
  95. *
  96. * @param overlay
  97. * @private
  98. */
  99. _createEditWorker(overlay) {
  100. let editWorker = undefined
  101. switch (overlay.type) {
  102. case OverlayType.POINT:
  103. editWorker = new EditPoint(overlay)
  104. break
  105. case OverlayType.POLYLINE:
  106. editWorker = new EditPolyline(overlay)
  107. break
  108. case OverlayType.POLYGON:
  109. editWorker = new EditPolygon(overlay)
  110. break
  111. case OverlayType.CIRCLE:
  112. editWorker = new EditCircle(overlay)
  113. break
  114. case OverlayType.RECTANGLE:
  115. editWorker = new EditRectangle(overlay)
  116. break
  117. case OverlayType.BILLBOARD:
  118. editWorker = new EditBillboard(overlay)
  119. break
  120. case OverlayType.ATTACK_ARROW:
  121. editWorker = new EditAttackArrow(overlay)
  122. break
  123. case OverlayType.DOUBLE_ARROW:
  124. editWorker = new EditDoubleArrow(overlay)
  125. break
  126. case OverlayType.FINE_ARROW:
  127. editWorker = new EditFineArrow(overlay)
  128. break
  129. case OverlayType.TAILED_ATTACK_ARROW:
  130. editWorker = new EditTailedAttackArrow(overlay)
  131. break
  132. case OverlayType.GATHERING_PLACE:
  133. editWorker = new EditGatheringPlace(overlay)
  134. break
  135. default:
  136. break
  137. }
  138. return editWorker
  139. }
  140. /**
  141. *
  142. * @param type
  143. * @param callback
  144. * @param style
  145. * @param clampToModel
  146. * @returns {Plot}
  147. */
  148. draw(type, callback, style = {}, clampToModel = false) {
  149. this._state = 'draw'
  150. if (this._currentWorker) {
  151. this._currentWorker.stop()
  152. }
  153. let maxAnchorSize = style?.maxAnchorSize || 999
  154. style && delete style['maxAnchorSize']
  155. this._currentWorker = this._createDrawWorker(type, style)?.start(this, {
  156. ...this._options,
  157. maxAnchorSize: maxAnchorSize,
  158. onDrawStop: callback,
  159. clampToModel: clampToModel ?? this._options.clampToModel
  160. })
  161. return this
  162. }
  163. /**
  164. *
  165. * @param overlay
  166. * @param callback
  167. * @param clampToModel
  168. * @returns {Plot}
  169. */
  170. edit(overlay, callback, clampToModel = false) {
  171. this._state = 'edit'
  172. if (this._currentWorker) {
  173. this._currentWorker.stop()
  174. }
  175. this._currentWorker = this._createEditWorker(overlay)?.start(this, {
  176. ...this._options,
  177. onEditStop: callback,
  178. clampToModel: clampToModel ?? this._options.clampToModel
  179. })
  180. return this
  181. }
  182. /**
  183. *
  184. * @return {Plot}
  185. */
  186. stop() {
  187. if (this._currentWorker) {
  188. this._currentWorker.stop()
  189. }
  190. this._currentWorker = null
  191. return undefined
  192. }
  193. /**
  194. *
  195. * @returns {Plot}
  196. */
  197. destroy() {
  198. this._viewer.dataSources.remove(this._layer)
  199. this._viewer = undefined
  200. return this
  201. }
  202. }
  203. export default Plot