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

ModelCollectionPrimitive.js 3.0KB

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