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.

ModelCollectionPrimitive.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /**
  2. * @Author: Caven
  3. * @Date: 2021-08-02 20:12:04
  4. */
  5. import { Cesium } from '@dc-modules/namespace'
  6. import State from '@dc-modules/state/State'
  7. import Parse from '@dc-modules/parse/Parse'
  8. import { Transform } from '@dc-modules/transform'
  9. import Overlay from '../Overlay'
  10. class ModelCollectionPrimitive extends Overlay {
  11. constructor(positions, modelUrl) {
  12. super()
  13. this._positions = Parse.parsePositions(positions)
  14. this._modelUrl = modelUrl
  15. this._attrs = []
  16. this._state = State.INITIALIZED
  17. }
  18. get type() {
  19. return Overlay.getOverlayType('model_collection_primitive')
  20. }
  21. get readyPromise() {
  22. return this._delegate.readyPromise
  23. }
  24. set attrs(attrs) {
  25. this._attrs = attrs
  26. return this
  27. }
  28. get attrs() {
  29. return this._attrs
  30. }
  31. set positions(positions) {
  32. this._positions = Parse.parsePositions(positions)
  33. if (this._layer) {
  34. this._resetDelegate()
  35. this._layer.delegate.add(this._delegate)
  36. }
  37. return this
  38. }
  39. set modelUrl(modelUrl) {
  40. this._modelUrl = modelUrl
  41. if (this._layer) {
  42. this._resetDelegate()
  43. this._layer.delegate.add(this._delegate)
  44. }
  45. return this
  46. }
  47. get modelUrl() {
  48. return this._modelUrl
  49. }
  50. _resetDelegate() {
  51. this._delegate = this._delegate && this._delegate.destroy()
  52. this._delegate = new Cesium.ModelInstanceCollection({
  53. url: this._modelUrl,
  54. instances: this._positions.map(item => {
  55. let origin = Transform.transformWGS84ToCartesian(item)
  56. let modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
  57. origin,
  58. new Cesium.HeadingPitchRoll(
  59. Cesium.Math.toRadians(item.heading),
  60. Cesium.Math.toRadians(item.pitch),
  61. Cesium.Math.toRadians(item.roll)
  62. )
  63. )
  64. this._style?.scale &&
  65. Cesium.Matrix4.multiplyByUniformScale(
  66. modelMatrix,
  67. this._style?.scale,
  68. modelMatrix
  69. )
  70. return {
  71. modelMatrix
  72. }
  73. }),
  74. ...this._style
  75. })
  76. this._delegate.layerId = this._layer?.layerId
  77. this._delegate.overlayId = this._id
  78. }
  79. _mountedHook() {
  80. this._resetDelegate()
  81. }
  82. /**
  83. *
  84. * @param instanceId
  85. * @returns {undefined}
  86. */
  87. getModelInstance(instanceId) {
  88. return this._delegate._instances[instanceId] || undefined
  89. }
  90. /**
  91. *
  92. * @param instanceId
  93. * @returns {*|{}}
  94. */
  95. getAttrByInstanceId(instanceId) {
  96. return this._attrs[instanceId] || {}
  97. }
  98. /**
  99. *
  100. * @param style
  101. * @returns {ModelCollectionPrimitive}
  102. */
  103. setStyle(style) {
  104. if (!style || Object.keys(style).length === 0) {
  105. return this
  106. }
  107. delete style['instances'] && delete style['url']
  108. this._style = style
  109. if (this._layer) {
  110. this._resetDelegate()
  111. this._layer.delegate.add(this._delegate)
  112. }
  113. return this
  114. }
  115. }
  116. Overlay.registerType('model_collection_primitive')
  117. export default ModelCollectionPrimitive