智慧水务管理系统 - 精河县供水工程综合管理平台

I3SSublayer.js 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import Check from "../Core/Check.js";
  2. import defined from "../Core/defined.js";
  3. import I3SDataProvider from "./I3SDataProvider.js";
  4. import I3SLayer from "./I3SLayer.js";
  5. import Resource from "../Core/Resource.js";
  6. /**
  7. * This class implements an I3S sublayer for Building Scene Layer.
  8. * <p>
  9. * This object is normally not instantiated directly, use {@link I3SSublayer.fromData}.
  10. * </p>
  11. * @alias I3SSublayer
  12. * @internalConstructor
  13. */
  14. function I3SSublayer(dataProvider, parent, sublayerData) {
  15. this._dataProvider = dataProvider;
  16. this._parent = parent;
  17. this._data = sublayerData;
  18. this._name = sublayerData.name;
  19. this._modelName = sublayerData.modelName;
  20. this._visibility = sublayerData.visibility ?? true;
  21. this._resource = undefined;
  22. this._sublayers = [];
  23. this._i3sLayers = [];
  24. }
  25. Object.defineProperties(I3SSublayer.prototype, {
  26. /**
  27. * Gets the resource for the sublayer
  28. * @memberof I3SSublayer.prototype
  29. * @type {Resource}
  30. * @readonly
  31. */
  32. resource: {
  33. get: function () {
  34. return this._resource;
  35. },
  36. },
  37. /**
  38. * Gets the I3S data for this object.
  39. * @memberof I3SSublayer.prototype
  40. * @type {object}
  41. * @readonly
  42. */
  43. data: {
  44. get: function () {
  45. return this._data;
  46. },
  47. },
  48. /**
  49. * Gets the name for the sublayer.
  50. * @memberof I3SSublayer.prototype
  51. * @type {string}
  52. * @readonly
  53. */
  54. name: {
  55. get: function () {
  56. return this._name;
  57. },
  58. },
  59. /**
  60. * Gets the model name for the sublayer.
  61. * @memberof I3SSublayer.prototype
  62. * @type {string}
  63. * @readonly
  64. */
  65. modelName: {
  66. get: function () {
  67. return this._modelName;
  68. },
  69. },
  70. /**
  71. * Gets the collection of child sublayers.
  72. * @memberof I3SSublayer.prototype
  73. * @type {I3SSublayer[]}
  74. * @readonly
  75. */
  76. sublayers: {
  77. get: function () {
  78. return this._sublayers;
  79. },
  80. },
  81. /**
  82. * Gets or sets the sublayer visibility.
  83. * @memberof I3SSublayer.prototype
  84. * @type {boolean}
  85. */
  86. visibility: {
  87. get: function () {
  88. return this._visibility;
  89. },
  90. set: function (value) {
  91. //>>includeStart('debug', pragmas.debug);
  92. Check.defined("value", value);
  93. //>>includeEnd('debug');
  94. if (this._visibility !== value) {
  95. this._visibility = value;
  96. for (let i = 0; i < this._i3sLayers.length; i++) {
  97. this._i3sLayers[i]._updateVisibility();
  98. }
  99. }
  100. },
  101. },
  102. /**
  103. * Determines if the sublayer will be shown.
  104. * @memberof I3SSublayer.prototype
  105. * @type {boolean}
  106. * @readonly
  107. */
  108. show: {
  109. get: function () {
  110. return this._visibility && this._parent.show;
  111. },
  112. },
  113. });
  114. /**
  115. * @private
  116. */
  117. I3SSublayer._fromData = async function (
  118. dataProvider,
  119. buildingLayerUrl,
  120. sublayerData,
  121. parent,
  122. ) {
  123. const sublayer = new I3SSublayer(dataProvider, parent, sublayerData);
  124. if (sublayer._data.layerType === "group") {
  125. const sublayers = sublayer._data.sublayers;
  126. if (defined(sublayers)) {
  127. const promises = [];
  128. for (let i = 0; i < sublayers.length; i++) {
  129. const promise = I3SSublayer._fromData(
  130. dataProvider,
  131. buildingLayerUrl,
  132. sublayers[i],
  133. sublayer,
  134. );
  135. promises.push(promise);
  136. }
  137. const childSublayers = await Promise.all(promises);
  138. for (let i = 0; i < childSublayers.length; i++) {
  139. const childSublayer = childSublayers[i];
  140. sublayer._sublayers.push(childSublayer);
  141. sublayer._i3sLayers.push(...childSublayer._i3sLayers);
  142. }
  143. }
  144. } else if (sublayer._data.layerType === "3DObject") {
  145. const sublayerUrl = buildingLayerUrl.concat(
  146. `/sublayers/${sublayer._data.id}`,
  147. );
  148. const resource = new Resource({ url: sublayerUrl });
  149. resource.setQueryParameters(dataProvider.resource.queryParameters);
  150. resource.appendForwardSlash();
  151. sublayer._resource = resource;
  152. const layerData = await I3SDataProvider.loadJson(sublayer._resource);
  153. const layer = new I3SLayer(dataProvider, layerData, sublayer);
  154. sublayer._i3sLayers.push(layer);
  155. } else {
  156. // Filter other scene layer types out
  157. console.log(
  158. `${sublayer._data.layerType} layer ${sublayer._data.name} is skipped as not supported.`,
  159. );
  160. }
  161. return sublayer;
  162. };
  163. export default I3SSublayer;