bruce-cesium 5.7.9 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/dist/bruce-cesium.es5.js +32308 -0
  2. package/dist/bruce-cesium.es5.js.map +1 -0
  3. package/dist/bruce-cesium.umd.js +32232 -0
  4. package/dist/bruce-cesium.umd.js.map +1 -0
  5. package/dist/lib/bruce-cesium.js +76 -0
  6. package/dist/lib/bruce-cesium.js.map +1 -0
  7. package/dist/lib/internal/cesium-utils.js +109 -0
  8. package/dist/lib/internal/cesium-utils.js.map +1 -0
  9. package/dist/lib/internal/js-utils.js +22 -0
  10. package/dist/lib/internal/js-utils.js.map +1 -0
  11. package/dist/lib/internal/limited-log.js +17 -0
  12. package/dist/lib/internal/limited-log.js.map +1 -0
  13. package/dist/lib/rendering/cesium-animated-in-out.js +166 -0
  14. package/dist/lib/rendering/cesium-animated-in-out.js.map +1 -0
  15. package/dist/lib/rendering/cesium-animated-property.js +1111 -0
  16. package/dist/lib/rendering/cesium-animated-property.js.map +1 -0
  17. package/dist/lib/rendering/entity-gatherer.js +327 -0
  18. package/dist/lib/rendering/entity-gatherer.js.map +1 -0
  19. package/dist/lib/rendering/entity-render-engine-model3d.js +689 -0
  20. package/dist/lib/rendering/entity-render-engine-model3d.js.map +1 -0
  21. package/dist/lib/rendering/entity-render-engine-point.js +984 -0
  22. package/dist/lib/rendering/entity-render-engine-point.js.map +1 -0
  23. package/dist/lib/rendering/entity-render-engine-polygon.js +669 -0
  24. package/dist/lib/rendering/entity-render-engine-polygon.js.map +1 -0
  25. package/dist/lib/rendering/entity-render-engine-polyline.js +415 -0
  26. package/dist/lib/rendering/entity-render-engine-polyline.js.map +1 -0
  27. package/dist/lib/rendering/entity-render-engine.js +442 -0
  28. package/dist/lib/rendering/entity-render-engine.js.map +1 -0
  29. package/dist/lib/rendering/getters/batched-data-getter.js +91 -0
  30. package/dist/lib/rendering/getters/batched-data-getter.js.map +1 -0
  31. package/dist/lib/rendering/getters/entity-filter-getter.js +634 -0
  32. package/dist/lib/rendering/getters/entity-filter-getter.js.map +1 -0
  33. package/dist/lib/rendering/getters/entity-globe.js +172 -0
  34. package/dist/lib/rendering/getters/entity-globe.js.map +1 -0
  35. package/dist/lib/rendering/menu-item-creator.js +354 -0
  36. package/dist/lib/rendering/menu-item-creator.js.map +1 -0
  37. package/dist/lib/rendering/menu-item-manager.js +464 -0
  38. package/dist/lib/rendering/menu-item-manager.js.map +1 -0
  39. package/dist/lib/rendering/relation-render-engine.js +235 -0
  40. package/dist/lib/rendering/relation-render-engine.js.map +1 -0
  41. package/dist/lib/rendering/render-managers/common/cesium-parabola.js +368 -0
  42. package/dist/lib/rendering/render-managers/common/cesium-parabola.js.map +1 -0
  43. package/dist/lib/rendering/render-managers/common/entity-label.js +703 -0
  44. package/dist/lib/rendering/render-managers/common/entity-label.js.map +1 -0
  45. package/dist/lib/rendering/render-managers/common/point-clustering.js +826 -0
  46. package/dist/lib/rendering/render-managers/common/point-clustering.js.map +1 -0
  47. package/dist/lib/rendering/render-managers/common/shared-getters.js +187 -0
  48. package/dist/lib/rendering/render-managers/common/shared-getters.js.map +1 -0
  49. package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js +668 -0
  50. package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js.map +1 -0
  51. package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js +92 -0
  52. package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js.map +1 -0
  53. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js +143 -0
  54. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js.map +1 -0
  55. package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js +510 -0
  56. package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js.map +1 -0
  57. package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js +717 -0
  58. package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js.map +1 -0
  59. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js +999 -0
  60. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -0
  61. package/dist/lib/rendering/render-managers/entities/entity-render-manager.js +186 -0
  62. package/dist/lib/rendering/render-managers/entities/entity-render-manager.js.map +1 -0
  63. package/dist/lib/rendering/render-managers/other/assembly-render-manager.js +226 -0
  64. package/dist/lib/rendering/render-managers/other/assembly-render-manager.js.map +1 -0
  65. package/dist/lib/rendering/render-managers/other/google-search-render-manager.js +430 -0
  66. package/dist/lib/rendering/render-managers/other/google-search-render-manager.js.map +1 -0
  67. package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js +290 -0
  68. package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js.map +1 -0
  69. package/dist/lib/rendering/render-managers/other/relations-render-manager.js +401 -0
  70. package/dist/lib/rendering/render-managers/other/relations-render-manager.js.map +1 -0
  71. package/dist/lib/rendering/render-managers/render-manager.js +276 -0
  72. package/dist/lib/rendering/render-managers/render-manager.js.map +1 -0
  73. package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js +356 -0
  74. package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js.map +1 -0
  75. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js +861 -0
  76. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js.map +1 -0
  77. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js +279 -0
  78. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js.map +1 -0
  79. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js +104 -0
  80. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js.map +1 -0
  81. package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js +81 -0
  82. package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js.map +1 -0
  83. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js +378 -0
  84. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js.map +1 -0
  85. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js +140 -0
  86. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js.map +1 -0
  87. package/dist/lib/rendering/tile-render-engine.js +1328 -0
  88. package/dist/lib/rendering/tile-render-engine.js.map +1 -0
  89. package/dist/lib/rendering/tileset-render-engine.js +588 -0
  90. package/dist/lib/rendering/tileset-render-engine.js.map +1 -0
  91. package/dist/lib/rendering/tileset-styler.js +590 -0
  92. package/dist/lib/rendering/tileset-styler.js.map +1 -0
  93. package/dist/lib/rendering/view-render-engine.js +1004 -0
  94. package/dist/lib/rendering/view-render-engine.js.map +1 -0
  95. package/dist/lib/rendering/visual-register-culler.js +676 -0
  96. package/dist/lib/rendering/visual-register-culler.js.map +1 -0
  97. package/dist/lib/rendering/visuals-register.js +1741 -0
  98. package/dist/lib/rendering/visuals-register.js.map +1 -0
  99. package/dist/lib/utils/cesium-entity-styler.js +914 -0
  100. package/dist/lib/utils/cesium-entity-styler.js.map +1 -0
  101. package/dist/lib/utils/drawing-utils.js +308 -0
  102. package/dist/lib/utils/drawing-utils.js.map +1 -0
  103. package/dist/lib/utils/entity-utils.js +1382 -0
  104. package/dist/lib/utils/entity-utils.js.map +1 -0
  105. package/dist/lib/utils/measure-utils.js +73 -0
  106. package/dist/lib/utils/measure-utils.js.map +1 -0
  107. package/dist/lib/utils/simplify-geometry.js +323 -0
  108. package/dist/lib/utils/simplify-geometry.js.map +1 -0
  109. package/dist/lib/utils/view-utils.js +392 -0
  110. package/dist/lib/utils/view-utils.js.map +1 -0
  111. package/dist/lib/viewer/cesium-view-monitor.js +393 -0
  112. package/dist/lib/viewer/cesium-view-monitor.js.map +1 -0
  113. package/dist/lib/viewer/viewer-event-tracker.js +70 -0
  114. package/dist/lib/viewer/viewer-event-tracker.js.map +1 -0
  115. package/dist/lib/viewer/viewer-utils.js +310 -0
  116. package/dist/lib/viewer/viewer-utils.js.map +1 -0
  117. package/dist/lib/widgets/common/draw-3d-polygon.js +458 -0
  118. package/dist/lib/widgets/common/draw-3d-polygon.js.map +1 -0
  119. package/dist/lib/widgets/common/draw-3d-polyline.js +415 -0
  120. package/dist/lib/widgets/common/draw-3d-polyline.js.map +1 -0
  121. package/dist/lib/widgets/common/measure-creator.js +468 -0
  122. package/dist/lib/widgets/common/measure-creator.js.map +1 -0
  123. package/dist/lib/widgets/common/walkthrough.js +336 -0
  124. package/dist/lib/widgets/common/walkthrough.js.map +1 -0
  125. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js +36 -0
  126. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js.map +1 -0
  127. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js +437 -0
  128. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js.map +1 -0
  129. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js +38 -0
  130. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js.map +1 -0
  131. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js +219 -0
  132. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js.map +1 -0
  133. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js +304 -0
  134. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js.map +1 -0
  135. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js +29 -0
  136. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js.map +1 -0
  137. package/dist/lib/widgets/widget-bookmarks.js +497 -0
  138. package/dist/lib/widgets/widget-bookmarks.js.map +1 -0
  139. package/dist/lib/widgets/widget-branding.js +165 -0
  140. package/dist/lib/widgets/widget-branding.js.map +1 -0
  141. package/dist/lib/widgets/widget-cursorbar.js +1179 -0
  142. package/dist/lib/widgets/widget-cursorbar.js.map +1 -0
  143. package/dist/lib/widgets/widget-embedded-info-view.js +201 -0
  144. package/dist/lib/widgets/widget-embedded-info-view.js.map +1 -0
  145. package/dist/lib/widgets/widget-info-view.js +681 -0
  146. package/dist/lib/widgets/widget-info-view.js.map +1 -0
  147. package/dist/lib/widgets/widget-left-panel.js +548 -0
  148. package/dist/lib/widgets/widget-left-panel.js.map +1 -0
  149. package/dist/lib/widgets/widget-nav-compass.js +469 -0
  150. package/dist/lib/widgets/widget-nav-compass.js.map +1 -0
  151. package/dist/lib/widgets/widget-view-bar.js +284 -0
  152. package/dist/lib/widgets/widget-view-bar.js.map +1 -0
  153. package/dist/lib/widgets/widget.js +66 -0
  154. package/dist/lib/widgets/widget.js.map +1 -0
  155. package/dist/types/bruce-cesium.d.ts +58 -0
  156. package/dist/types/internal/cesium-utils.d.ts +23 -0
  157. package/dist/types/internal/js-utils.d.ts +8 -0
  158. package/dist/types/internal/limited-log.d.ts +6 -0
  159. package/dist/types/rendering/cesium-animated-in-out.d.ts +12 -0
  160. package/dist/types/rendering/cesium-animated-property.d.ts +245 -0
  161. package/dist/types/rendering/entity-gatherer.d.ts +36 -0
  162. package/dist/types/rendering/entity-render-engine-model3d.d.ts +56 -0
  163. package/dist/types/rendering/entity-render-engine-point.d.ts +73 -0
  164. package/dist/types/rendering/entity-render-engine-polygon.d.ts +26 -0
  165. package/dist/types/rendering/entity-render-engine-polyline.d.ts +47 -0
  166. package/dist/types/rendering/entity-render-engine.d.ts +108 -0
  167. package/dist/types/rendering/getters/batched-data-getter.d.ts +28 -0
  168. package/dist/types/rendering/getters/entity-filter-getter.d.ts +104 -0
  169. package/dist/types/rendering/getters/entity-globe.d.ts +21 -0
  170. package/dist/types/rendering/menu-item-creator.d.ts +53 -0
  171. package/dist/types/rendering/menu-item-manager.d.ts +85 -0
  172. package/dist/types/rendering/relation-render-engine.d.ts +32 -0
  173. package/dist/types/rendering/render-managers/common/cesium-parabola.d.ts +39 -0
  174. package/dist/types/rendering/render-managers/common/entity-label.d.ts +82 -0
  175. package/dist/types/rendering/render-managers/common/point-clustering.d.ts +91 -0
  176. package/dist/types/rendering/render-managers/common/shared-getters.d.ts +41 -0
  177. package/dist/types/rendering/render-managers/data-source/data-source-static-csv-manager.d.ts +41 -0
  178. package/dist/types/rendering/render-managers/data-source/data-source-static-kml-manager.d.ts +25 -0
  179. package/dist/types/rendering/render-managers/entities/entities-datalab-render-manager.d.ts +31 -0
  180. package/dist/types/rendering/render-managers/entities/entities-ids-render-manager.d.ts +76 -0
  181. package/dist/types/rendering/render-managers/entities/entities-loaded-render-manager.d.ts +90 -0
  182. package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +90 -0
  183. package/dist/types/rendering/render-managers/entities/entity-render-manager.d.ts +42 -0
  184. package/dist/types/rendering/render-managers/other/assembly-render-manager.d.ts +38 -0
  185. package/dist/types/rendering/render-managers/other/google-search-render-manager.d.ts +45 -0
  186. package/dist/types/rendering/render-managers/other/legacy-relations-render-manager.d.ts +60 -0
  187. package/dist/types/rendering/render-managers/other/relations-render-manager.d.ts +53 -0
  188. package/dist/types/rendering/render-managers/render-manager.d.ts +30 -0
  189. package/dist/types/rendering/render-managers/tilesets/tileset-arb-render-manager.d.ts +37 -0
  190. package/dist/types/rendering/render-managers/tilesets/tileset-cad-render-manager.d.ts +86 -0
  191. package/dist/types/rendering/render-managers/tilesets/tileset-entities-render-manager.d.ts +41 -0
  192. package/dist/types/rendering/render-managers/tilesets/tileset-google-photos-render-manager.d.ts +26 -0
  193. package/dist/types/rendering/render-managers/tilesets/tileset-i3s-render-manager.d.ts +25 -0
  194. package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +48 -0
  195. package/dist/types/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.d.ts +27 -0
  196. package/dist/types/rendering/tile-render-engine.d.ts +80 -0
  197. package/dist/types/rendering/tileset-render-engine.d.ts +99 -0
  198. package/dist/types/rendering/tileset-styler.d.ts +86 -0
  199. package/dist/types/rendering/view-render-engine.d.ts +32 -0
  200. package/dist/types/rendering/visual-register-culler.d.ts +18 -0
  201. package/dist/types/rendering/visuals-register.d.ts +361 -0
  202. package/dist/types/utils/cesium-entity-styler.d.ts +103 -0
  203. package/dist/types/utils/drawing-utils.d.ts +59 -0
  204. package/dist/types/utils/entity-utils.d.ts +133 -0
  205. package/dist/types/utils/measure-utils.d.ts +20 -0
  206. package/dist/types/utils/simplify-geometry.d.ts +19 -0
  207. package/dist/types/utils/view-utils.d.ts +101 -0
  208. package/dist/types/viewer/cesium-view-monitor.d.ts +35 -0
  209. package/dist/types/viewer/viewer-event-tracker.d.ts +47 -0
  210. package/dist/types/viewer/viewer-utils.d.ts +88 -0
  211. package/dist/types/widgets/common/draw-3d-polygon.d.ts +62 -0
  212. package/dist/types/widgets/common/draw-3d-polyline.d.ts +50 -0
  213. package/dist/types/widgets/common/measure-creator.d.ts +60 -0
  214. package/dist/types/widgets/common/walkthrough.d.ts +37 -0
  215. package/dist/types/widgets/controls-view-bar/widget-control-view-bar-fullscreen.d.ts +10 -0
  216. package/dist/types/widgets/controls-view-bar/widget-control-view-bar-search.d.ts +18 -0
  217. package/dist/types/widgets/controls-view-bar/widget-control-view-bar.d.ts +23 -0
  218. package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.d.ts +11 -0
  219. package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-user.d.ts +24 -0
  220. package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab.d.ts +17 -0
  221. package/dist/types/widgets/widget-bookmarks.d.ts +40 -0
  222. package/dist/types/widgets/widget-branding.d.ts +15 -0
  223. package/dist/types/widgets/widget-cursorbar.d.ts +48 -0
  224. package/dist/types/widgets/widget-embedded-info-view.d.ts +13 -0
  225. package/dist/types/widgets/widget-info-view.d.ts +21 -0
  226. package/dist/types/widgets/widget-left-panel.d.ts +73 -0
  227. package/dist/types/widgets/widget-nav-compass.d.ts +27 -0
  228. package/dist/types/widgets/widget-view-bar.d.ts +37 -0
  229. package/dist/types/widgets/widget.d.ts +29 -0
  230. package/package.json +1 -1
@@ -0,0 +1,999 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntitiesRenderManager = void 0;
4
+ const bruce_models_1 = require("bruce-models");
5
+ const Cesium = require("cesium");
6
+ const entity_render_engine_1 = require("../../entity-render-engine");
7
+ const visuals_register_1 = require("../../visuals-register");
8
+ const render_manager_1 = require("../render-manager");
9
+ const point_clustering_1 = require("../common/point-clustering");
10
+ const js_utils_1 = require("../../../internal/js-utils");
11
+ const simplify_geometry_1 = require("../../../utils/simplify-geometry");
12
+ const BATCH_SIZE = 500;
13
+ const CHECK_BATCH_SIZE = 250;
14
+ function getValue(viewer, obj) {
15
+ if (obj === null || obj === void 0 ? void 0 : obj.getValue) {
16
+ let date = viewer.scene.lastRenderTime;
17
+ if (!date) {
18
+ date = viewer.clock.currentTime;
19
+ }
20
+ return obj.getValue(date);
21
+ }
22
+ return obj;
23
+ }
24
+ function colorToCColor(color) {
25
+ return new Cesium.Color(color.red ? color.red / 255 : 0, color.green ? color.green / 255 : 0, color.blue ? color.blue / 255 : 0, color.alpha);
26
+ }
27
+ function getShowDebugBounds() {
28
+ if (!window) {
29
+ return false;
30
+ }
31
+ let showBounds = window === null || window === void 0 ? void 0 : window.ENTITIES_RENDER_MANAGER_SHOW_BOUNDS;
32
+ if (showBounds) {
33
+ return true;
34
+ }
35
+ if (window.location.search) {
36
+ const params = new URLSearchParams(window.location.search);
37
+ showBounds = params.get("debugScanBounds");
38
+ }
39
+ return showBounds == "true" || showBounds == "1" || showBounds == "yes";
40
+ }
41
+ /**
42
+ * Manager for rendering Bruce entities.
43
+ * This will request entities based on setup menu item filter.
44
+ */
45
+ var EntitiesRenderManager;
46
+ (function (EntitiesRenderManager) {
47
+ class Manager {
48
+ get Disposed() {
49
+ return this.disposed;
50
+ }
51
+ constructor(params) {
52
+ this.getter = null;
53
+ this.getterSub = null;
54
+ this.disposed = false;
55
+ this.renderedEntities = {};
56
+ this.entityCheckQueue = null;
57
+ this.entityCheckQueueIds = [];
58
+ this.entityCheckRemoval = null;
59
+ this.isRunningCheck = false;
60
+ this.viewMonitorRemoval = null;
61
+ this.renderQueue = [];
62
+ this.renderQueueInterval = null;
63
+ this.sources = [];
64
+ // Highly experimental flag to try improve rendering large sets of polygons and polylines.
65
+ // Many things are not supported when this is enabled.
66
+ this.useGeojson = false;
67
+ // Zoom control to reference.
68
+ this.zoomControl = [];
69
+ // Scenario for retrieving Entities.
70
+ this.scenario = null;
71
+ // Type IDs that we'll allow to be rendered when receiving Entities.
72
+ // This might be exactly the Menu Item Type ID because of local data sources.
73
+ this.allowedTypeIDs = [];
74
+ const { viewer, apiGetter, monitor, item, register: visualsManager, sharedGetters } = params;
75
+ this.viewer = viewer;
76
+ this.sharedGetters = sharedGetters;
77
+ this.monitor = monitor;
78
+ this.apiGetter = apiGetter;
79
+ this.item = item;
80
+ this.visualsManager = visualsManager;
81
+ this.useGeojson = item.renderAsGeojson == true;
82
+ if (item.enableClustering) {
83
+ this.clustering = new point_clustering_1.PointClustering(this.visualsManager, this.item.id);
84
+ }
85
+ }
86
+ Init(params) {
87
+ if (this.disposed) {
88
+ throw (new Error("This item is disposed."));
89
+ }
90
+ if (params === null || params === void 0 ? void 0 : params.item) {
91
+ this.item = params.item;
92
+ }
93
+ (async () => {
94
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
95
+ if (this.disposed) {
96
+ return;
97
+ }
98
+ try {
99
+ // Reset allowed list if there's change.
100
+ if (((_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a["EntityType.ID"]) && !this.allowedTypeIDs.includes((_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"])) {
101
+ this.allowedTypeIDs = [];
102
+ if ((_c = this.item.BruceEntity) === null || _c === void 0 ? void 0 : _c["EntityType.ID"]) {
103
+ this.allowedTypeIDs.push((_d = this.item.BruceEntity) === null || _d === void 0 ? void 0 : _d["EntityType.ID"]);
104
+ }
105
+ }
106
+ if (this.disposed) {
107
+ return;
108
+ }
109
+ this.zoomControl = this.item.CameraZoomSettings;
110
+ if (!((_e = this.zoomControl) === null || _e === void 0 ? void 0 : _e.length)) {
111
+ this.zoomControl = [
112
+ {
113
+ MinZoom: 0,
114
+ MaxZoom: 200000,
115
+ DisplayType: bruce_models_1.ZoomControl.EDisplayType.Model3D,
116
+ LODCategoryID: "glb",
117
+ LODLevel: 0,
118
+ StyleID: 0
119
+ }
120
+ ];
121
+ }
122
+ this.renderPriority = this.item.renderPriority;
123
+ if (this.renderPriority == null) {
124
+ this.renderPriority = 1;
125
+ }
126
+ if (this.useGeojson && this.zoomControl.length > 1) {
127
+ console.warn("Geojson rendering does not support multiple zoom controls. Only the first one will be used.");
128
+ this.zoomControl = [this.zoomControl[0]];
129
+ }
130
+ this.scenario = (_f = this.item.BruceEntity) === null || _f === void 0 ? void 0 : _f.Scenario;
131
+ const isTagItem = Boolean(this.item.BruceEntity.ExpandLayers);
132
+ let tagsToRender = isTagItem ? this.item.BruceEntity.SelectedExpandLayers : null;
133
+ if (!tagsToRender) {
134
+ tagsToRender = [];
135
+ }
136
+ tagsToRender = [].concat(tagsToRender);
137
+ const shouldRender = !isTagItem || tagsToRender.length > 0;
138
+ this.unsetGetter();
139
+ (_g = this.viewMonitorRemoval) === null || _g === void 0 ? void 0 : _g.call(this);
140
+ this.viewMonitorRemoval = null;
141
+ (_h = this.entityCheckQueue) === null || _h === void 0 ? void 0 : _h.Dispose();
142
+ this.entityCheckQueue = null;
143
+ clearInterval(this.renderQueueInterval);
144
+ this.renderQueueInterval = null;
145
+ this.renderQueue = [];
146
+ // Remove just the ones that shouldn't be rendered.
147
+ // Eg: for a tag menu item we can see what tags are selected and only render those.
148
+ if (shouldRender) {
149
+ this.visualsManager.RemoveRegos({
150
+ menuItemId: this.item.id,
151
+ retainTagIds: tagsToRender
152
+ });
153
+ (_j = this.clustering) === null || _j === void 0 ? void 0 : _j.Dispose();
154
+ }
155
+ else {
156
+ this.visualsManager.RemoveRegos({
157
+ menuItemId: this.item.id
158
+ });
159
+ (_k = this.clustering) === null || _k === void 0 ? void 0 : _k.Dispose();
160
+ return;
161
+ }
162
+ if (this.item.enableClustering) {
163
+ this.clustering = new point_clustering_1.PointClustering(this.visualsManager, this.item.id, (_l = this.item) === null || _l === void 0 ? void 0 : _l.clustering);
164
+ }
165
+ this.setGetter();
166
+ this.viewMonitorRemoval = this.monitor.Updated().Subscribe(() => {
167
+ this.entityCheckQueue.Call();
168
+ });
169
+ this.entityCheckQueue = new bruce_models_1.DelayQueue(() => {
170
+ // Don't bother checking for zoom control changes if we only have 1 item.
171
+ // We'll let Cesium handle hide/show at max zoom range.
172
+ const shouldCheck = this.zoomControl && this.zoomControl.length > 1;
173
+ if (shouldCheck) {
174
+ this.doEntityCheck(Object.keys(this.renderedEntities));
175
+ }
176
+ }, 3000);
177
+ }
178
+ catch (e) {
179
+ console.error(e);
180
+ }
181
+ })();
182
+ }
183
+ /**
184
+ * Updates allowedTypeIDs values based in incoming data.
185
+ * We might request 'x' Entity Type, but get 'y' Entities due to local Data Sources.
186
+ * So we'll dynamically construct allowed type IDs to help filter out unwanted Entities from further ReRender calls.
187
+ * @param typeSources
188
+ * @param entities
189
+ */
190
+ updateAllowedTypeIDs(typeSources, entities) {
191
+ var _a, _b;
192
+ const sourceLookup = new Map();
193
+ if (typeSources) {
194
+ for (const source of typeSources) {
195
+ sourceLookup.set(source.ID, source);
196
+ }
197
+ }
198
+ for (let i = 0; i < entities.length; i++) {
199
+ const entity = entities[i];
200
+ const typeId = (_a = entity.Bruce) === null || _a === void 0 ? void 0 : _a["EntityType.ID"];
201
+ if (!typeId || this.allowedTypeIDs.includes(typeId)) {
202
+ continue;
203
+ }
204
+ // If an Entity is not from the allowed Entity Type, but has a source matching it, then it's allowed.
205
+ // Therefor we will add it to the allowedTypeIDs list.
206
+ if (!((_b = entity.Bruce["Outline"]) === null || _b === void 0 ? void 0 : _b.length)) {
207
+ continue;
208
+ }
209
+ const outlineItems = entity.Bruce["Outline"];
210
+ for (const item of outlineItems) {
211
+ if (!item["EntityType.Source.ID"]) {
212
+ continue;
213
+ }
214
+ const sRecord = sourceLookup.get(item["EntityType.Source.ID"]);
215
+ if (!sRecord) {
216
+ continue;
217
+ }
218
+ if (sRecord["EntityType.ID"] && this.allowedTypeIDs.includes(sRecord["EntityType.ID"])) {
219
+ const toAddTypeId = sRecord["Source.EntityType.ID"];
220
+ if (toAddTypeId && !this.allowedTypeIDs.includes(toAddTypeId)) {
221
+ this.allowedTypeIDs.push(toAddTypeId);
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+ setGetter() {
228
+ var _a, _b, _c;
229
+ this.unsetGetter();
230
+ const isTagItem = Boolean(this.item.BruceEntity.ExpandLayers);
231
+ let tagsToRender = isTagItem ? this.item.BruceEntity.SelectedExpandLayers : null;
232
+ if (!tagsToRender) {
233
+ tagsToRender = [];
234
+ }
235
+ tagsToRender = [].concat(tagsToRender);
236
+ this.getter = this.sharedGetters.GetOrCreateFilterGetter({
237
+ api: this.apiGetter.getApi(),
238
+ attrFilter: (_a = this.item.BruceEntity.Filter) !== null && _a !== void 0 ? _a : {},
239
+ batchSize: BATCH_SIZE,
240
+ typeId: this.item.BruceEntity["EntityType.ID"],
241
+ monitor: this.monitor,
242
+ viewer: this.viewer,
243
+ // Unfortunately this searches as an "AND" rather than "OR" which does not meet our needs here.
244
+ // So for multiple tags we'll manually sort on UI end...
245
+ tagIds: (tagsToRender === null || tagsToRender === void 0 ? void 0 : tagsToRender.length) ? tagsToRender : [],
246
+ debugShowBounds: getShowDebugBounds(),
247
+ cdn: this.item.cdnEnabled,
248
+ historic: (_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b.historic,
249
+ historicAttrKey: this.item.BruceEntity.historicAttrKey,
250
+ historicInterpolation: this.item.historicInterpolation,
251
+ schemaId: (_c = this.item.BruceEntity) === null || _c === void 0 ? void 0 : _c.schemaId,
252
+ scenario: this.scenario
253
+ });
254
+ const minMax = render_manager_1.RenderManager.GetZoomMinMax({
255
+ zoomControl: this.zoomControl
256
+ });
257
+ this.getter.IncludeMenuItem(this.item.id, this.item.BruceEntity["EntityType.ID"], (tagsToRender === null || tagsToRender === void 0 ? void 0 : tagsToRender.length) ? tagsToRender : [], minMax[0], minMax[1]);
258
+ this.getterSub = this.getter.OnUpdate.Subscribe((data) => {
259
+ var _a;
260
+ if (!((_a = data === null || data === void 0 ? void 0 : data.entities) === null || _a === void 0 ? void 0 : _a.length)) {
261
+ return;
262
+ }
263
+ this.updateAllowedTypeIDs(data.entityTypeSources, data.entities);
264
+ if (isTagItem) {
265
+ this.distributeForRender(data.entities.filter((entity) => {
266
+ let entityTags = entity.Bruce["Layer.ID"];
267
+ if (!entityTags) {
268
+ entityTags = [];
269
+ }
270
+ return entityTags.some((tag) => {
271
+ return tagsToRender.indexOf(tag) !== -1;
272
+ });
273
+ }));
274
+ }
275
+ else {
276
+ this.distributeForRender(data.entities);
277
+ }
278
+ });
279
+ }
280
+ unsetGetter() {
281
+ var _a, _b;
282
+ (_a = this.getter) === null || _a === void 0 ? void 0 : _a.ExcludeMenuItem(this.item.id);
283
+ this.getter = null;
284
+ (_b = this.getterSub) === null || _b === void 0 ? void 0 : _b.call(this);
285
+ this.getterSub = null;
286
+ }
287
+ Dispose() {
288
+ if (this.disposed) {
289
+ return;
290
+ }
291
+ this.doDispose();
292
+ }
293
+ doDispose() {
294
+ var _a, _b, _c;
295
+ this.unsetGetter();
296
+ this.disposed = true;
297
+ this.visualsManager.RemoveRegos({
298
+ menuItemId: this.item.id
299
+ });
300
+ (_a = this.entityCheckRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
301
+ (_b = this.viewMonitorRemoval) === null || _b === void 0 ? void 0 : _b.call(this);
302
+ clearInterval(this.renderQueueInterval);
303
+ this.renderQueue = [];
304
+ (_c = this.clustering) === null || _c === void 0 ? void 0 : _c.Dispose();
305
+ this.clustering = null;
306
+ for (let i = 0; i < this.sources.length; i++) {
307
+ const source = this.sources[i];
308
+ this.viewer.dataSources.remove(source);
309
+ }
310
+ this.sources = [];
311
+ }
312
+ async ReRender(params) {
313
+ var _a, _b;
314
+ let { entityIds, force, entities } = params;
315
+ if (entities && !entityIds) {
316
+ entityIds = entities.map(x => { var _a; return (_a = x.Bruce) === null || _a === void 0 ? void 0 : _a.ID; });
317
+ }
318
+ if (entityIds == null) {
319
+ entityIds = Object.keys(this.renderedEntities);
320
+ }
321
+ this.visualsManager.MarkStale({
322
+ entityIds: entityIds,
323
+ menuItemIds: [this.item.id]
324
+ });
325
+ if (entities === null || entities === void 0 ? void 0 : entities.length) {
326
+ entities = [].concat(entities).filter(x => { var _a; return entityIds.includes((_a = x.Bruce) === null || _a === void 0 ? void 0 : _a.ID); });
327
+ }
328
+ // Forcing to skip queue and to render immediately.
329
+ if (force) {
330
+ if (entities === null || entities === void 0 ? void 0 : entities.length) {
331
+ this.renderEntities(entities, true);
332
+ }
333
+ else {
334
+ try {
335
+ const data = await bruce_models_1.Entity.GetListByIds({
336
+ api: this.apiGetter.getApi(),
337
+ entityIds,
338
+ historicKey: (_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a.historicAttrKey,
339
+ historicPoint: this.viewer.clock.currentTime.toString(),
340
+ schemaId: (_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b.schemaId,
341
+ migrated: true
342
+ });
343
+ this.renderEntities(data.entities, true);
344
+ }
345
+ catch (e) {
346
+ console.error(e);
347
+ }
348
+ }
349
+ }
350
+ else {
351
+ if (entities === null || entities === void 0 ? void 0 : entities.length) {
352
+ this.distributeForRender(entities);
353
+ }
354
+ else {
355
+ await this.doEntityCheck(entityIds);
356
+ }
357
+ }
358
+ }
359
+ UpdateSettings(params) {
360
+ const { zoomControl: CameraZoomSettings, queueRerender, scenario } = params;
361
+ if (this.disposed) {
362
+ return;
363
+ }
364
+ let changed = false;
365
+ if (CameraZoomSettings === null || CameraZoomSettings === void 0 ? void 0 : CameraZoomSettings.length) {
366
+ this.zoomControl = CameraZoomSettings;
367
+ if (this.renderAsGeojson && this.zoomControl.length > 1) {
368
+ console.warn("Geojson rendering does not support multiple zoom controls. Only the first one will be used.");
369
+ this.zoomControl = [this.zoomControl[0]];
370
+ }
371
+ changed = true;
372
+ }
373
+ if (scenario != null) {
374
+ this.scenario = scenario;
375
+ changed = true;
376
+ }
377
+ if (changed) {
378
+ this.setGetter();
379
+ }
380
+ if (queueRerender != false) {
381
+ const entityIds = Object.keys(this.renderedEntities);
382
+ this.visualsManager.MarkStale({
383
+ entityIds: entityIds,
384
+ menuItemIds: [this.item.id]
385
+ });
386
+ this.doEntityCheck(entityIds);
387
+ }
388
+ }
389
+ async doEntityCheck(ids) {
390
+ if (this.isRunningCheck) {
391
+ this.entityCheckQueueIds = this.entityCheckQueueIds.concat(ids);
392
+ this.entityCheckQueue.Call();
393
+ return;
394
+ }
395
+ ids.concat(this.entityCheckQueueIds);
396
+ this.entityCheckQueueIds = [];
397
+ ids = ids.filter((id, index) => {
398
+ return ids.indexOf(id) === index;
399
+ });
400
+ this.isRunningCheck = true;
401
+ const api = this.apiGetter.getApi();
402
+ try {
403
+ if (this.disposed) {
404
+ return;
405
+ }
406
+ if (ids.length > 0) {
407
+ const checkBatch = async () => {
408
+ var _a, _b;
409
+ const entityIds = ids.splice(0, CHECK_BATCH_SIZE);
410
+ const { entities } = await bruce_models_1.Entity.GetListByIds({
411
+ api,
412
+ entityIds,
413
+ historicKey: (_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a.historicAttrKey,
414
+ historicPoint: this.viewer.clock.currentTime.toString(),
415
+ schemaId: (_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b.schemaId,
416
+ migrated: true
417
+ });
418
+ if (this.disposed) {
419
+ return;
420
+ }
421
+ this.distributeForRender(entities);
422
+ };
423
+ while (ids.length > 0) {
424
+ await checkBatch();
425
+ }
426
+ }
427
+ }
428
+ catch (e) {
429
+ console.error(e);
430
+ }
431
+ this.isRunningCheck = false;
432
+ }
433
+ distributeForRender(entities) {
434
+ this.renderQueue = this.renderQueue.concat(entities);
435
+ if (!this.renderQueueInterval && this.renderQueue.length) {
436
+ this.renderQueueInterval = setInterval(() => {
437
+ const batch = this.renderQueue.splice(0, BATCH_SIZE);
438
+ this.renderEntities(batch);
439
+ if (this.renderQueue.length <= 0) {
440
+ clearInterval(this.renderQueueInterval);
441
+ this.renderQueueInterval = null;
442
+ }
443
+ }, 50);
444
+ }
445
+ }
446
+ async renderEntities(entities, force = false) {
447
+ var _a;
448
+ try {
449
+ if (this.disposed || this.viewer.isDestroyed() || !(entities === null || entities === void 0 ? void 0 : entities.length)) {
450
+ return;
451
+ }
452
+ // Ensuring a re-render call with improper entity ids doesn't cause them to render here.
453
+ if (this.allowedTypeIDs) {
454
+ const typeId = (_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a["EntityType.ID"];
455
+ if (typeId) {
456
+ entities = entities.filter(x => { var _a; return this.allowedTypeIDs.includes((_a = x.Bruce) === null || _a === void 0 ? void 0 : _a["EntityType.ID"]); });
457
+ }
458
+ }
459
+ if (this.useGeojson) {
460
+ const zoomItem = this.zoomControl[0];
461
+ if (zoomItem.DisplayType == bruce_models_1.ZoomControl.EDisplayType.Point) {
462
+ // We'll just render these as individuals since we don't support point geojson.
463
+ await this.renderAsIndividuals(entities, force);
464
+ }
465
+ else {
466
+ await this.renderAsGeojson(entities, force);
467
+ }
468
+ }
469
+ else {
470
+ await this.renderAsIndividuals(entities, force);
471
+ }
472
+ }
473
+ catch (e) {
474
+ console.error(e);
475
+ }
476
+ }
477
+ /**
478
+ * Our optimized and more stable path.
479
+ * We construct a geojson that we draw in one go.
480
+ * @param entities
481
+ * @param force TODO: This should re-render entities that are already rendered.
482
+ */
483
+ async renderAsGeojson(entities, force) {
484
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
485
+ entities = entities.filter((entity) => {
486
+ var _a;
487
+ return !this.renderedEntities[(_a = entity.Bruce) === null || _a === void 0 ? void 0 : _a.ID];
488
+ });
489
+ // Mark these as rendered.
490
+ entities.forEach((entity) => {
491
+ var _a;
492
+ this.renderedEntities[(_a = entity.Bruce) === null || _a === void 0 ? void 0 : _a.ID] = true;
493
+ });
494
+ // This process only supports a single zoom control item.
495
+ const zoomItem = this.zoomControl[0];
496
+ // If we're after 3d models then we'll check if there are LODs and render those as individuals.
497
+ if (zoomItem.DisplayType == bruce_models_1.ZoomControl.EDisplayType.Model3D && entities.length) {
498
+ const { lods } = await bruce_models_1.EntityLod.GetLods({
499
+ api: this.apiGetter.getApi(),
500
+ filter: {
501
+ externalSources: false,
502
+ Items: entities.map(x => {
503
+ var _a, _b;
504
+ return {
505
+ entityId: (_a = x.Bruce) === null || _a === void 0 ? void 0 : _a.ID,
506
+ categoryId: (_b = zoomItem.LODCategoryID) !== null && _b !== void 0 ? _b : "GLB",
507
+ group: "DEFAULT",
508
+ level: Number(zoomItem.LODLevel)
509
+ };
510
+ }),
511
+ strict: false
512
+ }
513
+ });
514
+ if (this.disposed) {
515
+ this.doDispose();
516
+ return;
517
+ }
518
+ const withLods = lods.filter(x => x.entityId && !!x.clientFileId).map(x => x.entityId);
519
+ const individuals = entities.filter((entity) => {
520
+ var _a;
521
+ return withLods.includes((_a = entity.Bruce) === null || _a === void 0 ? void 0 : _a.ID);
522
+ });
523
+ if (individuals.length) {
524
+ this.renderAsIndividuals(individuals, force);
525
+ }
526
+ // Now we proceed with what is left.
527
+ entities = entities.filter((entity) => {
528
+ var _a;
529
+ return !withLods.includes((_a = entity.Bruce) === null || _a === void 0 ? void 0 : _a.ID);
530
+ });
531
+ }
532
+ if (!entities.length) {
533
+ return;
534
+ }
535
+ let style = null;
536
+ if ((zoomItem === null || zoomItem === void 0 ? void 0 : zoomItem.StyleID) && zoomItem.StyleID != -1) {
537
+ try {
538
+ style = (_a = (await bruce_models_1.Style.Get({
539
+ api: this.apiGetter.getApi(),
540
+ styleId: zoomItem === null || zoomItem === void 0 ? void 0 : zoomItem.StyleID
541
+ })).style) === null || _a === void 0 ? void 0 : _a.Settings;
542
+ }
543
+ // Probably deleted.
544
+ catch (e) {
545
+ console.error(e);
546
+ }
547
+ }
548
+ let entityTypeId = (_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"];
549
+ if (!entityTypeId) {
550
+ entityTypeId = (_d = (_c = entities.find(x => { var _a; return !!((_a = x.Bruce) === null || _a === void 0 ? void 0 : _a["EntityType.ID"]); })) === null || _c === void 0 ? void 0 : _c.Bruce) === null || _d === void 0 ? void 0 : _d["EntityType.ID"];
551
+ }
552
+ // Getting type regardless cause it's needed for name calculations.
553
+ let entityType;
554
+ if (entityTypeId) {
555
+ // Try using the Entity Type default if one is specified in the menu item.
556
+ try {
557
+ entityType = (_e = (await bruce_models_1.EntityType.Get({
558
+ entityTypeId: entityTypeId,
559
+ api: this.apiGetter.getApi()
560
+ }))) === null || _e === void 0 ? void 0 : _e.entityType;
561
+ if (!style && entityType) {
562
+ if (entityType["DisplaySetting.ID"] && entityType["DisplaySetting.ID"] > 0) {
563
+ style = (_f = (await bruce_models_1.Style.Get({
564
+ api: this.apiGetter.getApi(),
565
+ styleId: entityType["DisplaySetting.ID"]
566
+ })).style) === null || _f === void 0 ? void 0 : _f.Settings;
567
+ }
568
+ }
569
+ }
570
+ catch (e) {
571
+ console.error(e);
572
+ }
573
+ }
574
+ const pStyle = (_g = style === null || style === void 0 ? void 0 : style.polygonStyle) !== null && _g !== void 0 ? _g : {};
575
+ const lStyle = (_h = style === null || style === void 0 ? void 0 : style.polylineStyle) !== null && _h !== void 0 ? _h : {};
576
+ const polygonsClamped = ((_j = pStyle === null || pStyle === void 0 ? void 0 : pStyle.altitudeOption) === null || _j === void 0 ? void 0 : _j.id) == null ? true : ((_k = pStyle === null || pStyle === void 0 ? void 0 : pStyle.altitudeOption) === null || _k === void 0 ? void 0 : _k.id) == 0;
577
+ const bFillColor = bruce_models_1.Calculator.GetColor(pStyle.fillColor, {}, []);
578
+ const cFillColor = bFillColor ? colorToCColor(bFillColor) : Cesium.Color.fromCssColorString("rgba(139, 195, 74, 0.8)");
579
+ const bLineColor = bruce_models_1.Calculator.GetColor(pStyle.lineColor, {}, []);
580
+ const cLineColor = bLineColor ? colorToCColor(bLineColor) : Cesium.Color.fromCssColorString("rgba(80, 80, 80, 0.8)");
581
+ let lineWidthPx = pStyle.lineWidth ? bruce_models_1.Calculator.GetNumber(pStyle.lineWidth, {}, []) : null;
582
+ if (lineWidthPx == null) {
583
+ lineWidthPx = 1;
584
+ }
585
+ lineWidthPx = (0, js_utils_1.EnsureNumber)(lineWidthPx);
586
+ if (lineWidthPx < 0.01) {
587
+ lineWidthPx = 0;
588
+ }
589
+ lineWidthPx = Math.round(lineWidthPx);
590
+ // If we are flagged to optimize then we'll run through and simplify each entity's geometry.
591
+ if (this.item.optimizeGeometry) {
592
+ for (let i = 0; i < entities.length; i++) {
593
+ let entity = entities[i];
594
+ let geometry = bruce_models_1.Entity.GetValue({
595
+ entity: entity,
596
+ path: ["Bruce", "VectorGeometry"]
597
+ });
598
+ if (geometry) {
599
+ if (this.item.optimizeMinPoints == null) {
600
+ this.item.optimizeMinPoints = 500;
601
+ }
602
+ if (simplify_geometry_1.SimplifyGeometry.CountPoints(geometry, this.item.optimizeMinPoints) >= this.item.optimizeMinPoints) {
603
+ if (this.item.optimizeTolerance == null) {
604
+ this.item.optimizeTolerance = 0.00001;
605
+ }
606
+ const optimized = simplify_geometry_1.SimplifyGeometry.Simplify(entity.Bruce.ID, geometry, this.item.optimizeTolerance);
607
+ if (optimized) {
608
+ // Dereference the Entity object now that we have done a destructive operation.
609
+ entity = Object.assign({}, entity);
610
+ entity.Bruce = Object.assign({}, entity.Bruce);
611
+ entities[i] = entity;
612
+ // Continue on with the rendering using the optimized geometry.
613
+ geometry = optimized;
614
+ }
615
+ }
616
+ }
617
+ // We are using the new path.
618
+ // This ensures we don't have a duplicate.
619
+ entity.geometry = null;
620
+ entity.Bruce.VectorGeometry = geometry;
621
+ }
622
+ }
623
+ const collection = {
624
+ features: [],
625
+ type: "FeatureCollection"
626
+ };
627
+ for (let i = 0; i < entities.length; i++) {
628
+ const entity = entities[i];
629
+ const feature = bruce_models_1.Geometry.ToGeoJsonFeature({
630
+ geometry: entity.Bruce.VectorGeometry,
631
+ noAltitude: polygonsClamped && lineWidthPx <= 0,
632
+ altitude: lineWidthPx > 0 && polygonsClamped ? 1 : null,
633
+ properties: {
634
+ ...entity,
635
+ Bruce: {
636
+ ...entity.Bruce,
637
+ // Exclude as we just converted it to geojson.
638
+ VectorGeometry: null
639
+ }
640
+ }
641
+ });
642
+ if (feature) {
643
+ collection.features.push(feature);
644
+ }
645
+ }
646
+ // Anything that failed to turn into geojson or points we'll render as individuals.
647
+ const individuals = entities.filter((entity) => {
648
+ const feature = collection.features.find(x => { var _a, _b; return ((_b = (_a = x.properties) === null || _a === void 0 ? void 0 : _a.Bruce) === null || _b === void 0 ? void 0 : _b.ID) == entity.Bruce.ID; });
649
+ if (!feature) {
650
+ return true;
651
+ }
652
+ if (feature.geometry.type == "Point") {
653
+ return true;
654
+ }
655
+ return false;
656
+ });
657
+ if (individuals.length) {
658
+ this.renderAsIndividuals(individuals, force);
659
+ }
660
+ // Filter out points (the ones we just rendered as individuals).
661
+ collection.features = collection.features.filter(x => x.geometry.type != "Point");
662
+ // If there is nothing to render now, return.
663
+ if (!collection.features.length) {
664
+ return;
665
+ }
666
+ const source = await Cesium.GeoJsonDataSource.load(collection, {
667
+ stroke: cLineColor,
668
+ fill: cFillColor,
669
+ strokeWidth: lineWidthPx,
670
+ clampToGround: lineWidthPx <= 0 && polygonsClamped
671
+ });
672
+ this.viewer.dataSources.add(source);
673
+ this.sources.push(source);
674
+ if (this.disposed) {
675
+ this.doDispose();
676
+ return;
677
+ }
678
+ const groups = [];
679
+ /**
680
+ * Applies individual styling to a rendered entity.
681
+ * This will exclude tag styling for now since it's harder to load that on the fly.
682
+ * @param thing
683
+ * @param entityId
684
+ * @param data
685
+ * @returns
686
+ */
687
+ const applyStyle = (thing, entityId, data) => {
688
+ if (thing.polygon) {
689
+ const bFillColor = bruce_models_1.Calculator.GetColor(pStyle.fillColor, data, []);
690
+ const cFillColor = bFillColor ? colorToCColor(bFillColor) : Cesium.Color.fromCssColorString("rgba(139, 195, 74, 0.8)");
691
+ const bLineColor = bruce_models_1.Calculator.GetColor(pStyle.lineColor, data, []);
692
+ const cLineColor = bLineColor ? colorToCColor(bLineColor) : Cesium.Color.fromCssColorString("rgba(80, 80, 80, 0.8)");
693
+ let width = pStyle.lineWidth ? bruce_models_1.Calculator.GetNumber(pStyle.lineWidth, data, []) : null;
694
+ if (width == null) {
695
+ width = 1;
696
+ }
697
+ width = (0, js_utils_1.EnsureNumber)(width);
698
+ if (width < 0.01) {
699
+ width = 0;
700
+ }
701
+ let curFillColor = getValue(this.viewer, thing.polygon.material);
702
+ if (curFillColor && curFillColor instanceof Cesium.ColorMaterialProperty) {
703
+ curFillColor = curFillColor.color;
704
+ }
705
+ let curLineColor = getValue(this.viewer, thing.polygon.outlineColor);
706
+ if (curLineColor && curLineColor instanceof Cesium.ColorMaterialProperty) {
707
+ curLineColor = curLineColor.color;
708
+ }
709
+ const curWidth = getValue(this.viewer, thing.polygon.outlineWidth);
710
+ if ((curFillColor instanceof Cesium.Color && curFillColor.equals(cFillColor)) &&
711
+ (curLineColor instanceof Cesium.Color && curLineColor.equals(cLineColor)) &&
712
+ curWidth == width) {
713
+ return;
714
+ }
715
+ thing.polygon.material = new Cesium.ColorMaterialProperty(cFillColor);
716
+ thing.polygon.outlineColor = new Cesium.ConstantProperty(cLineColor);
717
+ thing.polygon.outlineWidth = new Cesium.ConstantProperty(width);
718
+ }
719
+ else if (thing.polyline) {
720
+ const bColor = lStyle.lineColor ? bruce_models_1.Calculator.GetColor(lStyle.lineColor, data, []) : null;
721
+ const cColor = bColor ? colorToCColor(bColor) : Cesium.Color.fromCssColorString("rgba(255, 193, 7, 0.8)");
722
+ let width = lStyle.lineWidth ? bruce_models_1.Calculator.GetNumber(lStyle.lineWidth, data, []) : null;
723
+ if (width == null) {
724
+ width = 2;
725
+ }
726
+ width = (0, js_utils_1.EnsureNumber)(width);
727
+ if (width < 0.01) {
728
+ width = 0;
729
+ }
730
+ let curColor = getValue(this.viewer, thing.polyline.material);
731
+ if (curColor && curColor instanceof Cesium.ColorMaterialProperty) {
732
+ curColor = curColor.color;
733
+ }
734
+ const curWidth = getValue(this.viewer, thing.polyline.width);
735
+ if ((curColor instanceof Cesium.Color && curColor.equals(cColor)) &&
736
+ curWidth == width) {
737
+ return;
738
+ }
739
+ thing.polyline.material = new Cesium.ColorMaterialProperty(cColor);
740
+ thing.polyline.width = new Cesium.ConstantProperty(width);
741
+ }
742
+ };
743
+ let toForceUpdate = [];
744
+ /**
745
+ * Registers a given cesium entity produced from rendering geojson.
746
+ * Since one nextspace entity can have multiple cesium entities, there is special logic to group them together.
747
+ * @param thing
748
+ * @returns
749
+ */
750
+ const register = (thing) => {
751
+ var _a, _b, _c, _d, _e, _f;
752
+ // See if the cesium entity already exists in a group.
753
+ let group = groups.find((x) => { var _a; return ((_a = x.visual) === null || _a === void 0 ? void 0 : _a.id) == thing.id || x.siblings.find(x => (x === null || x === void 0 ? void 0 : x.id) == thing.id); });
754
+ if (group) {
755
+ return;
756
+ }
757
+ const metadata = getValue(this.viewer, thing === null || thing === void 0 ? void 0 : thing.properties);
758
+ const entityId = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.Bruce) === null || _a === void 0 ? void 0 : _a.ID;
759
+ if (!entityId) {
760
+ return;
761
+ }
762
+ // Find group for the nextspace entity ID.
763
+ group = groups.find((x) => x.entityId == entityId);
764
+ // No group yet. We can designate this as the primary entity and create a new group for it.
765
+ if (!group) {
766
+ group = {
767
+ entityId: entityId,
768
+ visual: thing,
769
+ tagIds: (_b = metadata === null || metadata === void 0 ? void 0 : metadata.Bruce) === null || _b === void 0 ? void 0 : _b["Layer.ID"],
770
+ entityTypeId: (_c = metadata === null || metadata === void 0 ? void 0 : metadata.Bruce) === null || _c === void 0 ? void 0 : _c["EntityType.ID"],
771
+ siblings: [],
772
+ data: entities.find(x => { var _a; return ((_a = x.Bruce) === null || _a === void 0 ? void 0 : _a.ID) == entityId; }),
773
+ rego: null
774
+ };
775
+ groups.push(group);
776
+ applyStyle(thing, entityId, group.data);
777
+ const rego = {
778
+ canEdit: true,
779
+ entityId: entityId,
780
+ menuItemId: this.item.id,
781
+ menuItemType: this.item.Type,
782
+ visual: thing,
783
+ priority: this.renderPriority,
784
+ entityTypeId: group.entityTypeId,
785
+ accountId: this.apiGetter.accountId,
786
+ tagIds: group.tagIds ? [].concat(group.tagIds) : [],
787
+ name: entityType ? (_d = bruce_models_1.Entity.CalculateName({
788
+ entity: group.data,
789
+ type: entityType,
790
+ defaultToId: false
791
+ })) !== null && _d !== void 0 ? _d : "Unnamed Entity" : "Unnamed Entity",
792
+ cdn: this.item.cdnEnabled,
793
+ collection: source.entities,
794
+ outline: (_f = (_e = group.data) === null || _e === void 0 ? void 0 : _e.Bruce) === null || _f === void 0 ? void 0 : _f.Outline,
795
+ };
796
+ group.rego = rego;
797
+ this.visualsManager.AddRego({
798
+ rego,
799
+ requestRender: false
800
+ });
801
+ }
802
+ // Found a group. We flag this as a sibling entity of the primary.
803
+ else {
804
+ applyStyle(thing, entityId, group.data);
805
+ group.siblings.push(thing);
806
+ group.visual._siblingGraphics = group.siblings;
807
+ thing._parentEntity = group.visual;
808
+ if (group.rego) {
809
+ this.visualsManager.RefreshMark({
810
+ rego: group.rego
811
+ });
812
+ if (!toForceUpdate.includes(entityId)) {
813
+ toForceUpdate.push(entityId);
814
+ }
815
+ }
816
+ }
817
+ };
818
+ const sEntities = source.entities.values;
819
+ for (let i = 0; i < sEntities.length; i++) {
820
+ const cEntity = sEntities[i];
821
+ register(cEntity);
822
+ }
823
+ if (toForceUpdate.length) {
824
+ this.visualsManager.ForceUpdate({
825
+ entityIds: toForceUpdate,
826
+ refreshColors: true,
827
+ requestRender: false
828
+ });
829
+ }
830
+ this.viewer.scene.requestRender();
831
+ }
832
+ /**
833
+ * Our default path.
834
+ * We render each entity individually.
835
+ * @param entities
836
+ * @param force
837
+ * @returns
838
+ */
839
+ async renderAsIndividuals(entities, force = false) {
840
+ var _a, _b, _c, _d, _e, _f, _g, _h;
841
+ // Entity ID -> historic records array.
842
+ // We load this as extra information when rendering historic records.
843
+ // This way we know what to animate towards as time changes.
844
+ let entitiesHistoric = {};
845
+ if ((((_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a.historic) || ((_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b.historicAttrKey)) && entities.length) {
846
+ // Interpolating.
847
+ // We will allow non-historic Entities as long as they have historic data in the range.
848
+ if (this.item.historicInterpolation) {
849
+ // We'll add/remove 1 second to ensure we cover all records.
850
+ const startTmp = Cesium.JulianDate.toDate(this.viewer.clock.startTime);
851
+ const stopTmp = Cesium.JulianDate.toDate(this.viewer.clock.stopTime);
852
+ const startStr = new Date(startTmp.getTime() - 1000).toISOString();
853
+ const stopStr = new Date(stopTmp.getTime() + 1000).toISOString();
854
+ const historicData = await bruce_models_1.EntityHistoricData.GetList({
855
+ attrKey: this.item.BruceEntity.historicAttrKey,
856
+ dateTimeFrom: startStr,
857
+ dateTimeTo: stopStr,
858
+ entityIds: entities.map(x => x.Bruce.ID),
859
+ api: this.apiGetter.getApi()
860
+ });
861
+ entitiesHistoric = historicData.recordsByIds;
862
+ // Remove ones with no historicAttrKey and no historic data.
863
+ const toRemoveIds = entities.filter(x => { var _a, _b; return !((_b = (_a = x.Bruce) === null || _a === void 0 ? void 0 : _a.Outline) === null || _b === void 0 ? void 0 : _b.length) && !entitiesHistoric[x.Bruce.ID]; }).map(x => x.Bruce.ID);
864
+ for (let i = 0; i < toRemoveIds.length; i++) {
865
+ const removeId = toRemoveIds[i];
866
+ this.visualsManager.RemoveRegos({
867
+ entityId: removeId,
868
+ menuItemId: this.item.id,
869
+ requestRender: false
870
+ });
871
+ (_c = this.clustering) === null || _c === void 0 ? void 0 : _c.RemoveEntity(removeId, false);
872
+ }
873
+ entities = entities.filter(x => !toRemoveIds.includes(x.Bruce.ID));
874
+ }
875
+ // Not interpolating.
876
+ // So we'll see if the Entities have a historic key or not.
877
+ else {
878
+ const toRemoveIds = entities.filter(x => { var _a; return !((_a = x.Bruce) === null || _a === void 0 ? void 0 : _a.Outline); }).map(x => x.Bruce.ID);
879
+ for (let i = 0; i < toRemoveIds.length; i++) {
880
+ const removeId = toRemoveIds[i];
881
+ this.visualsManager.RemoveRegos({
882
+ entityId: removeId,
883
+ menuItemId: this.item.id,
884
+ requestRender: false
885
+ });
886
+ (_d = this.clustering) === null || _d === void 0 ? void 0 : _d.RemoveEntity(removeId, false);
887
+ }
888
+ entities = entities.filter(x => !toRemoveIds.includes(x.Bruce.ID));
889
+ }
890
+ }
891
+ if (this.disposed) {
892
+ this.doDispose();
893
+ return;
894
+ }
895
+ const { updated, entities: cEntities } = await entity_render_engine_1.EntityRenderEngine.Render({
896
+ viewer: this.viewer,
897
+ apiGetter: this.apiGetter,
898
+ entities: entities,
899
+ menuItemId: this.item.id,
900
+ visualRegister: this.visualsManager,
901
+ zoomControl: this.zoomControl,
902
+ entitiesHistoric: entitiesHistoric,
903
+ entityHistoricDrawTrack: this.item.historicDrawTrack,
904
+ force,
905
+ optimizeGeometry: this.item.optimizeGeometry,
906
+ optimizeMinPoints: this.item.optimizeMinPoints,
907
+ optimizeTolerance: this.item.optimizeTolerance,
908
+ });
909
+ if (this.disposed) {
910
+ this.doDispose();
911
+ return;
912
+ }
913
+ for (let i = 0; i < entities.length; i++) {
914
+ const entity = entities[i];
915
+ const id = entity.Bruce.ID;
916
+ const cEntity = cEntities.get(id);
917
+ this.renderedEntities[id] = !!cEntity;
918
+ if (cEntity) {
919
+ const rego = this.visualsManager.GetRego({
920
+ entityId: id,
921
+ menuItemId: this.item.id
922
+ });
923
+ // The baseline data source must be editable.
924
+ const canEdit = !((_e = entity.Bruce.Outline) === null || _e === void 0 ? void 0 : _e.find(x => x.Baseline && !x.Editable));
925
+ const visual = rego === null || rego === void 0 ? void 0 : rego.visual;
926
+ if (!visual || visual != cEntity) {
927
+ const wasClustered = this.clustering ? this.clustering.AddEntity(id, cEntity, false) : false;
928
+ const tagIds = entity.Bruce["Layer.ID"];
929
+ const rego = {
930
+ canEdit: canEdit,
931
+ entityId: id,
932
+ schema: entity.Bruce.Schema,
933
+ menuItemId: this.item.id,
934
+ menuItemType: this.item.Type,
935
+ visual: cEntity,
936
+ priority: this.renderPriority,
937
+ entityTypeId: entity.Bruce["EntityType.ID"],
938
+ accountId: this.apiGetter.accountId,
939
+ tagIds: tagIds ? [].concat(tagIds) : [],
940
+ overrideShow: wasClustered ? false : null,
941
+ name: cEntity.name,
942
+ cdn: this.item.cdnEnabled,
943
+ outline: entity.Bruce.Outline
944
+ };
945
+ this.visualsManager.AddRego({
946
+ rego,
947
+ requestRender: false
948
+ });
949
+ }
950
+ else if (updated.get(id) && rego) {
951
+ rego.name = cEntity.name;
952
+ rego.visual = cEntity;
953
+ rego.entityTypeId = entity.Bruce["EntityType.ID"];
954
+ rego.tagIds = entity.Bruce["Layer.ID"] ? [].concat(entity.Bruce["Layer.ID"]) : [];
955
+ rego.outline = (_f = entity.Bruce) === null || _f === void 0 ? void 0 : _f.Outline;
956
+ rego.cdn = this.item.cdnEnabled;
957
+ rego.schema = (_g = entity.Bruce) === null || _g === void 0 ? void 0 : _g.Schema;
958
+ rego.canEdit = canEdit;
959
+ // Marked as stale meaning some change was performed that requires a refresh.
960
+ // This usually means a new sibling was added that we need to update.
961
+ if (rego.stale) {
962
+ // Ensure graphic + siblings are associated with register.
963
+ this.visualsManager.RefreshMark({
964
+ rego
965
+ });
966
+ // Refresh visuals.
967
+ // This ensures newly created siblings are added to the scene.
968
+ this.visualsManager.ForceUpdate({
969
+ entityIds: [id],
970
+ refreshColors: true,
971
+ requestRender: false
972
+ });
973
+ }
974
+ // We manually trigger an update event since the graphic was updated but not recreated.
975
+ this.visualsManager.OnUpdate.Trigger({
976
+ type: visuals_register_1.VisualsRegister.EVisualUpdateType.Update,
977
+ entityId: id,
978
+ rego: rego
979
+ });
980
+ }
981
+ }
982
+ else {
983
+ this.visualsManager.RemoveRegos({
984
+ entityId: id,
985
+ menuItemId: this.item.id,
986
+ requestRender: false
987
+ });
988
+ (_h = this.clustering) === null || _h === void 0 ? void 0 : _h.RemoveEntity(id, false);
989
+ }
990
+ }
991
+ this.viewer.scene.requestRender();
992
+ if (this.clustering && entities.length) {
993
+ this.clustering.Update();
994
+ }
995
+ }
996
+ }
997
+ EntitiesRenderManager.Manager = Manager;
998
+ })(EntitiesRenderManager = exports.EntitiesRenderManager || (exports.EntitiesRenderManager = {}));
999
+ //# sourceMappingURL=entities-render-manager.js.map