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.
- package/dist/bruce-cesium.es5.js +32308 -0
- package/dist/bruce-cesium.es5.js.map +1 -0
- package/dist/bruce-cesium.umd.js +32232 -0
- package/dist/bruce-cesium.umd.js.map +1 -0
- package/dist/lib/bruce-cesium.js +76 -0
- package/dist/lib/bruce-cesium.js.map +1 -0
- package/dist/lib/internal/cesium-utils.js +109 -0
- package/dist/lib/internal/cesium-utils.js.map +1 -0
- package/dist/lib/internal/js-utils.js +22 -0
- package/dist/lib/internal/js-utils.js.map +1 -0
- package/dist/lib/internal/limited-log.js +17 -0
- package/dist/lib/internal/limited-log.js.map +1 -0
- package/dist/lib/rendering/cesium-animated-in-out.js +166 -0
- package/dist/lib/rendering/cesium-animated-in-out.js.map +1 -0
- package/dist/lib/rendering/cesium-animated-property.js +1111 -0
- package/dist/lib/rendering/cesium-animated-property.js.map +1 -0
- package/dist/lib/rendering/entity-gatherer.js +327 -0
- package/dist/lib/rendering/entity-gatherer.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-model3d.js +689 -0
- package/dist/lib/rendering/entity-render-engine-model3d.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-point.js +984 -0
- package/dist/lib/rendering/entity-render-engine-point.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-polygon.js +669 -0
- package/dist/lib/rendering/entity-render-engine-polygon.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-polyline.js +415 -0
- package/dist/lib/rendering/entity-render-engine-polyline.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine.js +442 -0
- package/dist/lib/rendering/entity-render-engine.js.map +1 -0
- package/dist/lib/rendering/getters/batched-data-getter.js +91 -0
- package/dist/lib/rendering/getters/batched-data-getter.js.map +1 -0
- package/dist/lib/rendering/getters/entity-filter-getter.js +634 -0
- package/dist/lib/rendering/getters/entity-filter-getter.js.map +1 -0
- package/dist/lib/rendering/getters/entity-globe.js +172 -0
- package/dist/lib/rendering/getters/entity-globe.js.map +1 -0
- package/dist/lib/rendering/menu-item-creator.js +354 -0
- package/dist/lib/rendering/menu-item-creator.js.map +1 -0
- package/dist/lib/rendering/menu-item-manager.js +464 -0
- package/dist/lib/rendering/menu-item-manager.js.map +1 -0
- package/dist/lib/rendering/relation-render-engine.js +235 -0
- package/dist/lib/rendering/relation-render-engine.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/cesium-parabola.js +368 -0
- package/dist/lib/rendering/render-managers/common/cesium-parabola.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/entity-label.js +703 -0
- package/dist/lib/rendering/render-managers/common/entity-label.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/point-clustering.js +826 -0
- package/dist/lib/rendering/render-managers/common/point-clustering.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/shared-getters.js +187 -0
- package/dist/lib/rendering/render-managers/common/shared-getters.js.map +1 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js +668 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js +92 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js +143 -0
- package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js +510 -0
- package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js +717 -0
- package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-render-manager.js +999 -0
- package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entity-render-manager.js +186 -0
- package/dist/lib/rendering/render-managers/entities/entity-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/assembly-render-manager.js +226 -0
- package/dist/lib/rendering/render-managers/other/assembly-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/google-search-render-manager.js +430 -0
- package/dist/lib/rendering/render-managers/other/google-search-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js +290 -0
- package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/relations-render-manager.js +401 -0
- package/dist/lib/rendering/render-managers/other/relations-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/render-manager.js +276 -0
- package/dist/lib/rendering/render-managers/render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js +356 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js +861 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js +279 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js +104 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js +81 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js +378 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js +140 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js.map +1 -0
- package/dist/lib/rendering/tile-render-engine.js +1328 -0
- package/dist/lib/rendering/tile-render-engine.js.map +1 -0
- package/dist/lib/rendering/tileset-render-engine.js +588 -0
- package/dist/lib/rendering/tileset-render-engine.js.map +1 -0
- package/dist/lib/rendering/tileset-styler.js +590 -0
- package/dist/lib/rendering/tileset-styler.js.map +1 -0
- package/dist/lib/rendering/view-render-engine.js +1004 -0
- package/dist/lib/rendering/view-render-engine.js.map +1 -0
- package/dist/lib/rendering/visual-register-culler.js +676 -0
- package/dist/lib/rendering/visual-register-culler.js.map +1 -0
- package/dist/lib/rendering/visuals-register.js +1741 -0
- package/dist/lib/rendering/visuals-register.js.map +1 -0
- package/dist/lib/utils/cesium-entity-styler.js +914 -0
- package/dist/lib/utils/cesium-entity-styler.js.map +1 -0
- package/dist/lib/utils/drawing-utils.js +308 -0
- package/dist/lib/utils/drawing-utils.js.map +1 -0
- package/dist/lib/utils/entity-utils.js +1382 -0
- package/dist/lib/utils/entity-utils.js.map +1 -0
- package/dist/lib/utils/measure-utils.js +73 -0
- package/dist/lib/utils/measure-utils.js.map +1 -0
- package/dist/lib/utils/simplify-geometry.js +323 -0
- package/dist/lib/utils/simplify-geometry.js.map +1 -0
- package/dist/lib/utils/view-utils.js +392 -0
- package/dist/lib/utils/view-utils.js.map +1 -0
- package/dist/lib/viewer/cesium-view-monitor.js +393 -0
- package/dist/lib/viewer/cesium-view-monitor.js.map +1 -0
- package/dist/lib/viewer/viewer-event-tracker.js +70 -0
- package/dist/lib/viewer/viewer-event-tracker.js.map +1 -0
- package/dist/lib/viewer/viewer-utils.js +310 -0
- package/dist/lib/viewer/viewer-utils.js.map +1 -0
- package/dist/lib/widgets/common/draw-3d-polygon.js +458 -0
- package/dist/lib/widgets/common/draw-3d-polygon.js.map +1 -0
- package/dist/lib/widgets/common/draw-3d-polyline.js +415 -0
- package/dist/lib/widgets/common/draw-3d-polyline.js.map +1 -0
- package/dist/lib/widgets/common/measure-creator.js +468 -0
- package/dist/lib/widgets/common/measure-creator.js.map +1 -0
- package/dist/lib/widgets/common/walkthrough.js +336 -0
- package/dist/lib/widgets/common/walkthrough.js.map +1 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js +36 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js.map +1 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js +437 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js.map +1 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js +38 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js.map +1 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js +219 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js.map +1 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js +304 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js.map +1 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js +29 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js.map +1 -0
- package/dist/lib/widgets/widget-bookmarks.js +497 -0
- package/dist/lib/widgets/widget-bookmarks.js.map +1 -0
- package/dist/lib/widgets/widget-branding.js +165 -0
- package/dist/lib/widgets/widget-branding.js.map +1 -0
- package/dist/lib/widgets/widget-cursorbar.js +1179 -0
- package/dist/lib/widgets/widget-cursorbar.js.map +1 -0
- package/dist/lib/widgets/widget-embedded-info-view.js +201 -0
- package/dist/lib/widgets/widget-embedded-info-view.js.map +1 -0
- package/dist/lib/widgets/widget-info-view.js +681 -0
- package/dist/lib/widgets/widget-info-view.js.map +1 -0
- package/dist/lib/widgets/widget-left-panel.js +548 -0
- package/dist/lib/widgets/widget-left-panel.js.map +1 -0
- package/dist/lib/widgets/widget-nav-compass.js +469 -0
- package/dist/lib/widgets/widget-nav-compass.js.map +1 -0
- package/dist/lib/widgets/widget-view-bar.js +284 -0
- package/dist/lib/widgets/widget-view-bar.js.map +1 -0
- package/dist/lib/widgets/widget.js +66 -0
- package/dist/lib/widgets/widget.js.map +1 -0
- package/dist/types/bruce-cesium.d.ts +58 -0
- package/dist/types/internal/cesium-utils.d.ts +23 -0
- package/dist/types/internal/js-utils.d.ts +8 -0
- package/dist/types/internal/limited-log.d.ts +6 -0
- package/dist/types/rendering/cesium-animated-in-out.d.ts +12 -0
- package/dist/types/rendering/cesium-animated-property.d.ts +245 -0
- package/dist/types/rendering/entity-gatherer.d.ts +36 -0
- package/dist/types/rendering/entity-render-engine-model3d.d.ts +56 -0
- package/dist/types/rendering/entity-render-engine-point.d.ts +73 -0
- package/dist/types/rendering/entity-render-engine-polygon.d.ts +26 -0
- package/dist/types/rendering/entity-render-engine-polyline.d.ts +47 -0
- package/dist/types/rendering/entity-render-engine.d.ts +108 -0
- package/dist/types/rendering/getters/batched-data-getter.d.ts +28 -0
- package/dist/types/rendering/getters/entity-filter-getter.d.ts +104 -0
- package/dist/types/rendering/getters/entity-globe.d.ts +21 -0
- package/dist/types/rendering/menu-item-creator.d.ts +53 -0
- package/dist/types/rendering/menu-item-manager.d.ts +85 -0
- package/dist/types/rendering/relation-render-engine.d.ts +32 -0
- package/dist/types/rendering/render-managers/common/cesium-parabola.d.ts +39 -0
- package/dist/types/rendering/render-managers/common/entity-label.d.ts +82 -0
- package/dist/types/rendering/render-managers/common/point-clustering.d.ts +91 -0
- package/dist/types/rendering/render-managers/common/shared-getters.d.ts +41 -0
- package/dist/types/rendering/render-managers/data-source/data-source-static-csv-manager.d.ts +41 -0
- package/dist/types/rendering/render-managers/data-source/data-source-static-kml-manager.d.ts +25 -0
- package/dist/types/rendering/render-managers/entities/entities-datalab-render-manager.d.ts +31 -0
- package/dist/types/rendering/render-managers/entities/entities-ids-render-manager.d.ts +76 -0
- package/dist/types/rendering/render-managers/entities/entities-loaded-render-manager.d.ts +90 -0
- package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +90 -0
- package/dist/types/rendering/render-managers/entities/entity-render-manager.d.ts +42 -0
- package/dist/types/rendering/render-managers/other/assembly-render-manager.d.ts +38 -0
- package/dist/types/rendering/render-managers/other/google-search-render-manager.d.ts +45 -0
- package/dist/types/rendering/render-managers/other/legacy-relations-render-manager.d.ts +60 -0
- package/dist/types/rendering/render-managers/other/relations-render-manager.d.ts +53 -0
- package/dist/types/rendering/render-managers/render-manager.d.ts +30 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-arb-render-manager.d.ts +37 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-cad-render-manager.d.ts +86 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-entities-render-manager.d.ts +41 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-google-photos-render-manager.d.ts +26 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-i3s-render-manager.d.ts +25 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +48 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.d.ts +27 -0
- package/dist/types/rendering/tile-render-engine.d.ts +80 -0
- package/dist/types/rendering/tileset-render-engine.d.ts +99 -0
- package/dist/types/rendering/tileset-styler.d.ts +86 -0
- package/dist/types/rendering/view-render-engine.d.ts +32 -0
- package/dist/types/rendering/visual-register-culler.d.ts +18 -0
- package/dist/types/rendering/visuals-register.d.ts +361 -0
- package/dist/types/utils/cesium-entity-styler.d.ts +103 -0
- package/dist/types/utils/drawing-utils.d.ts +59 -0
- package/dist/types/utils/entity-utils.d.ts +133 -0
- package/dist/types/utils/measure-utils.d.ts +20 -0
- package/dist/types/utils/simplify-geometry.d.ts +19 -0
- package/dist/types/utils/view-utils.d.ts +101 -0
- package/dist/types/viewer/cesium-view-monitor.d.ts +35 -0
- package/dist/types/viewer/viewer-event-tracker.d.ts +47 -0
- package/dist/types/viewer/viewer-utils.d.ts +88 -0
- package/dist/types/widgets/common/draw-3d-polygon.d.ts +62 -0
- package/dist/types/widgets/common/draw-3d-polyline.d.ts +50 -0
- package/dist/types/widgets/common/measure-creator.d.ts +60 -0
- package/dist/types/widgets/common/walkthrough.d.ts +37 -0
- package/dist/types/widgets/controls-view-bar/widget-control-view-bar-fullscreen.d.ts +10 -0
- package/dist/types/widgets/controls-view-bar/widget-control-view-bar-search.d.ts +18 -0
- package/dist/types/widgets/controls-view-bar/widget-control-view-bar.d.ts +23 -0
- package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.d.ts +11 -0
- package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-user.d.ts +24 -0
- package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab.d.ts +17 -0
- package/dist/types/widgets/widget-bookmarks.d.ts +40 -0
- package/dist/types/widgets/widget-branding.d.ts +15 -0
- package/dist/types/widgets/widget-cursorbar.d.ts +48 -0
- package/dist/types/widgets/widget-embedded-info-view.d.ts +13 -0
- package/dist/types/widgets/widget-info-view.d.ts +21 -0
- package/dist/types/widgets/widget-left-panel.d.ts +73 -0
- package/dist/types/widgets/widget-nav-compass.d.ts +27 -0
- package/dist/types/widgets/widget-view-bar.d.ts +37 -0
- package/dist/types/widgets/widget.d.ts +29 -0
- package/package.json +1 -1
|
@@ -0,0 +1,1741 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VisualsRegister = void 0;
|
|
4
|
+
const bruce_models_1 = require("bruce-models");
|
|
5
|
+
const Cesium = require("cesium");
|
|
6
|
+
const js_utils_1 = require("../internal/js-utils");
|
|
7
|
+
const entity_utils_1 = require("../utils/entity-utils");
|
|
8
|
+
const relation_render_engine_1 = require("./relation-render-engine");
|
|
9
|
+
const entity_label_1 = require("../rendering/render-managers/common/entity-label");
|
|
10
|
+
const visual_register_culler_1 = require("./visual-register-culler");
|
|
11
|
+
const cesium_entity_styler_1 = require("../utils/cesium-entity-styler");
|
|
12
|
+
const cesium_animated_in_out_1 = require("./cesium-animated-in-out");
|
|
13
|
+
/**
|
|
14
|
+
* Returns if a given visual is alive and in the scene.
|
|
15
|
+
* @param viewer
|
|
16
|
+
* @param visual
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
function isAlive(viewer, visual) {
|
|
20
|
+
if (!(viewer === null || viewer === void 0 ? void 0 : viewer.scene) || viewer.isDestroyed()) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (visual instanceof Cesium.Entity) {
|
|
24
|
+
return viewer.entities.contains(visual);
|
|
25
|
+
}
|
|
26
|
+
else if (visual instanceof Cesium.Primitive) {
|
|
27
|
+
return viewer.scene.primitives.contains(visual);
|
|
28
|
+
}
|
|
29
|
+
else if (visual instanceof Cesium.Cesium3DTileFeature) {
|
|
30
|
+
const cTileset = visual === null || visual === void 0 ? void 0 : visual.tileset;
|
|
31
|
+
if (!cTileset) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (cTileset.isDestroyed() || !viewer.scene.primitives.contains(cTileset)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
function removeEntity(viewer, visual) {
|
|
42
|
+
unmarkEntity(visual, false);
|
|
43
|
+
cesium_animated_in_out_1.CesiumAnimatedInOut.AnimateOut({
|
|
44
|
+
entity: visual,
|
|
45
|
+
viewer
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const MAX_SHOW_DEPTH = 10;
|
|
49
|
+
function updateCEntityShow(viewer, visual, rego, show, ignoreParent, depth = 0) {
|
|
50
|
+
if (depth > MAX_SHOW_DEPTH) {
|
|
51
|
+
console.warn("updateCEntityShow(): Max show depth reached. EntityId = " + rego.entityId);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// A sub-object can be culled while the siblings are not.
|
|
55
|
+
// We only cull things that give us some benefit. For example clamped to ground graphics are expensive to keep rendered.
|
|
56
|
+
show = show ? !visual_register_culler_1.VisualRegisterCuller.IsCulled(viewer, rego, visual) : false;
|
|
57
|
+
if (visual._parentEntity && !ignoreParent) {
|
|
58
|
+
updateCEntityShow(viewer, visual._parentEntity, rego, show, false, depth + 1);
|
|
59
|
+
}
|
|
60
|
+
if (visual._siblingGraphics) {
|
|
61
|
+
for (let i = 0; i < visual._siblingGraphics.length; i++) {
|
|
62
|
+
const sibling = visual._siblingGraphics[i];
|
|
63
|
+
updateCEntityShow(viewer, sibling, rego, show, true, depth + 1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Do NOT use ".show" as it causes crashes in Cesium polylines that are clamped to ground.
|
|
68
|
+
* We could target them specifically here but we may be getting overall performance gain by just removing stuff from the scene.
|
|
69
|
+
*/
|
|
70
|
+
if (rego.collection) {
|
|
71
|
+
if (!show && rego.collection.contains(visual)) {
|
|
72
|
+
rego.collection.remove(visual);
|
|
73
|
+
}
|
|
74
|
+
else if (show && !rego.collection.contains(visual)) {
|
|
75
|
+
rego.collection.add(visual);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (!show && viewer.entities.contains(visual)) {
|
|
80
|
+
viewer.entities.remove(visual);
|
|
81
|
+
}
|
|
82
|
+
else if (show && !viewer.entities.contains(visual)) {
|
|
83
|
+
viewer.entities.add(visual);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function updateEntityShow(viewer, rego, show) {
|
|
88
|
+
const visual = rego.visual;
|
|
89
|
+
if (visual instanceof Cesium.Entity) {
|
|
90
|
+
if (!(viewer === null || viewer === void 0 ? void 0 : viewer.scene) || viewer.isDestroyed()) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
updateCEntityShow(viewer, rego.visual, rego, show, false, 0);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (!isAlive(viewer, visual)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (visual instanceof Cesium.Primitive) {
|
|
100
|
+
if (viewer.scene.primitives.contains(visual)) {
|
|
101
|
+
visual.show = show;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (visual instanceof Cesium.Cesium3DTileFeature) {
|
|
105
|
+
// No way to tell if changing show will crash it!
|
|
106
|
+
// ^ We need to improve removing visuals from the register when tiles unload to avoid this :)
|
|
107
|
+
try {
|
|
108
|
+
visual.show = show;
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
console.error(e);
|
|
112
|
+
}
|
|
113
|
+
const ent = visual;
|
|
114
|
+
if (ent._siblingGraphics) {
|
|
115
|
+
for (let i = 0; i < ent._siblingGraphics.length; i++) {
|
|
116
|
+
try {
|
|
117
|
+
const sibling = ent._siblingGraphics[i];
|
|
118
|
+
sibling.show = show;
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
console.error(e);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function updateEntity(viewer, entityId, register, refresh, cache = {}) {
|
|
128
|
+
var _a;
|
|
129
|
+
// Unavailable for unoptimized single-Entity updates.
|
|
130
|
+
if (!cache) {
|
|
131
|
+
cache = {};
|
|
132
|
+
}
|
|
133
|
+
let regos = register.GetRegos({
|
|
134
|
+
entityId
|
|
135
|
+
});
|
|
136
|
+
regos.sort((a, b) => {
|
|
137
|
+
return b.priority - a.priority;
|
|
138
|
+
});
|
|
139
|
+
let highestPriority = (_a = regos[0]) === null || _a === void 0 ? void 0 : _a.priority;
|
|
140
|
+
if (!highestPriority) {
|
|
141
|
+
highestPriority = 0;
|
|
142
|
+
}
|
|
143
|
+
function getShowState(rego, state) {
|
|
144
|
+
if (state.hidden) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
else if (!state.isolated) {
|
|
148
|
+
if (cache.isIsolatedAny == null) {
|
|
149
|
+
cache.isIsolatedAny = register.GetIsIsolatedAny();
|
|
150
|
+
}
|
|
151
|
+
if (cache.isIsolatedAny) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// We show all regos in the same highest priority level.
|
|
156
|
+
// So if a new visual is added that's higher priority, all lower ones get hidden.
|
|
157
|
+
// By default, everything has 0 priority unless explicitly set.
|
|
158
|
+
const priority = rego.priority ? rego.priority : 0;
|
|
159
|
+
return priority >= highestPriority;
|
|
160
|
+
}
|
|
161
|
+
for (let i = 0; i < regos.length; i++) {
|
|
162
|
+
const rego = regos[i];
|
|
163
|
+
const state = register.GetState({
|
|
164
|
+
entityId: entityId,
|
|
165
|
+
menuItemId: rego.menuItemId
|
|
166
|
+
});
|
|
167
|
+
let visible = rego.overrideShow;
|
|
168
|
+
if (visible == null || visible === undefined) {
|
|
169
|
+
visible = getShowState(rego, state);
|
|
170
|
+
}
|
|
171
|
+
updateEntityShow(viewer, rego, visible);
|
|
172
|
+
if (visible) {
|
|
173
|
+
if (refresh === true || (refresh !== false && (refresh === null || refresh === void 0 ? void 0 : refresh.highlighted))) {
|
|
174
|
+
if (state.highlighted) {
|
|
175
|
+
cesium_entity_styler_1.CesiumEntityStyler.Highlight({
|
|
176
|
+
entity: rego.visual,
|
|
177
|
+
viewer,
|
|
178
|
+
requestRender: false
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
cesium_entity_styler_1.CesiumEntityStyler.Unhighlight({
|
|
183
|
+
entity: rego.visual,
|
|
184
|
+
viewer,
|
|
185
|
+
requestRender: false
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (refresh === true || (refresh !== false && (refresh === null || refresh === void 0 ? void 0 : refresh.selected))) {
|
|
190
|
+
if (state.selected) {
|
|
191
|
+
cesium_entity_styler_1.CesiumEntityStyler.Select({
|
|
192
|
+
entity: rego.visual,
|
|
193
|
+
viewer,
|
|
194
|
+
requestRender: false
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
cesium_entity_styler_1.CesiumEntityStyler.Deselect({
|
|
199
|
+
entity: rego.visual,
|
|
200
|
+
viewer,
|
|
201
|
+
requestRender: false
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (refresh === true || (refresh !== false && (refresh === null || refresh === void 0 ? void 0 : refresh.opacity))) {
|
|
206
|
+
if (state.opacity != null && state.opacity != 1) {
|
|
207
|
+
entity_utils_1.EntityUtils.SetOpacity({
|
|
208
|
+
entity: rego.visual,
|
|
209
|
+
opacity: state.opacity,
|
|
210
|
+
viewer: viewer,
|
|
211
|
+
requestRender: false
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
entity_utils_1.EntityUtils.RevertOpacity({
|
|
216
|
+
entity: rego.visual,
|
|
217
|
+
viewer: viewer,
|
|
218
|
+
requestRender: false
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (state.labelled && visible) {
|
|
224
|
+
entity_label_1.EntityLabel.Attach({
|
|
225
|
+
rego,
|
|
226
|
+
viewer,
|
|
227
|
+
api: register.ApiGetters.GetBruceApi(),
|
|
228
|
+
visualRegister: register
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
entity_label_1.EntityLabel.Detatch({
|
|
233
|
+
rego
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function markEntity(register, rego, visual, ignoreParent) {
|
|
239
|
+
const vis = visual;
|
|
240
|
+
vis._register = register;
|
|
241
|
+
vis._rego = rego;
|
|
242
|
+
if (visual instanceof Cesium.Entity) {
|
|
243
|
+
const visEnt = visual;
|
|
244
|
+
if (visEnt._parentEntity && !ignoreParent) {
|
|
245
|
+
markEntity(register, rego, visEnt._parentEntity, false);
|
|
246
|
+
}
|
|
247
|
+
if (visEnt._siblingGraphics) {
|
|
248
|
+
for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
|
|
249
|
+
markEntity(register, rego, visEnt._siblingGraphics[i], true);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (visual instanceof Cesium.Cesium3DTileFeature) {
|
|
254
|
+
const visEnt = visual;
|
|
255
|
+
if (visEnt._siblingGraphics) {
|
|
256
|
+
for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
|
|
257
|
+
markEntity(register, rego, visEnt._siblingGraphics[i], true);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function unmarkEntity(visual, ignoreParent) {
|
|
263
|
+
const vis = visual;
|
|
264
|
+
vis._register = null;
|
|
265
|
+
if (visual instanceof Cesium.Entity) {
|
|
266
|
+
const visEnt = visual;
|
|
267
|
+
if (visEnt._parentEntity && !ignoreParent) {
|
|
268
|
+
unmarkEntity(visEnt._parentEntity, false);
|
|
269
|
+
}
|
|
270
|
+
if (visEnt._siblingGraphics) {
|
|
271
|
+
for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
|
|
272
|
+
unmarkEntity(visEnt._siblingGraphics[i], true);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else if (visual instanceof Cesium.Cesium3DTileFeature) {
|
|
277
|
+
const visEnt = visual;
|
|
278
|
+
if (visEnt._siblingGraphics) {
|
|
279
|
+
for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
|
|
280
|
+
unmarkEntity(visEnt._siblingGraphics[i], true);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const NO_MENU_ITEM_KEY = "";
|
|
286
|
+
function getBlankState(entityId, menuItemId) {
|
|
287
|
+
const state = {
|
|
288
|
+
entityId: entityId
|
|
289
|
+
};
|
|
290
|
+
if (menuItemId) {
|
|
291
|
+
state.menuItemId = menuItemId;
|
|
292
|
+
}
|
|
293
|
+
return state;
|
|
294
|
+
}
|
|
295
|
+
function isBlankState(state) {
|
|
296
|
+
const idKeys = !state.menuItemId ? 1 : 2;
|
|
297
|
+
return Object.keys(state).length === idKeys;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Manages a registry of all Bruce visuals being rendered by menu items.
|
|
301
|
+
*/
|
|
302
|
+
var VisualsRegister;
|
|
303
|
+
(function (VisualsRegister) {
|
|
304
|
+
let EVisualUpdateType;
|
|
305
|
+
(function (EVisualUpdateType) {
|
|
306
|
+
EVisualUpdateType["Add"] = "ADD";
|
|
307
|
+
EVisualUpdateType["Remove"] = "REMOVE";
|
|
308
|
+
EVisualUpdateType["Update"] = "UPDATE";
|
|
309
|
+
EVisualUpdateType["DeselectAll"] = "DESELECT_ALL";
|
|
310
|
+
})(EVisualUpdateType = VisualsRegister.EVisualUpdateType || (VisualsRegister.EVisualUpdateType = {}));
|
|
311
|
+
class Register {
|
|
312
|
+
get Id() {
|
|
313
|
+
return this.id;
|
|
314
|
+
}
|
|
315
|
+
get Disposed() {
|
|
316
|
+
return this.disposed;
|
|
317
|
+
}
|
|
318
|
+
get Viewer() {
|
|
319
|
+
return this.viewer;
|
|
320
|
+
}
|
|
321
|
+
get ApiGetters() {
|
|
322
|
+
return this.apiGetters;
|
|
323
|
+
}
|
|
324
|
+
get OnUpdate() {
|
|
325
|
+
if (!this.onUpdate) {
|
|
326
|
+
this.onUpdate = new bruce_models_1.BruceEvent();
|
|
327
|
+
}
|
|
328
|
+
return this.onUpdate;
|
|
329
|
+
}
|
|
330
|
+
constructor(params) {
|
|
331
|
+
this.id = bruce_models_1.ObjectUtils.UId();
|
|
332
|
+
this.disposed = false;
|
|
333
|
+
this.rego = {};
|
|
334
|
+
this.onUpdate = null;
|
|
335
|
+
// Entity ID -> Menu Item ID -> State.
|
|
336
|
+
// When no Menu Item ID is set, then the second key is a blank string.
|
|
337
|
+
// If an Entity ID state is set without a Menu Item ID, then it acts as a default for all Menu Items.
|
|
338
|
+
this.states = {};
|
|
339
|
+
// Queue of Entity updates to process in batches to avoid overloading the render loop.
|
|
340
|
+
this.updateQueue = [];
|
|
341
|
+
// Settings related to those Entities in the queue.
|
|
342
|
+
// This lets us modify the update without re-adding the item to the queue if it's already in it.
|
|
343
|
+
this.updateQueueSettings = {};
|
|
344
|
+
this.updateQueueInterval = null;
|
|
345
|
+
this.viewer = params.viewer;
|
|
346
|
+
this.apiGetters = params.apiGetters;
|
|
347
|
+
this.cameraCullerDispose = visual_register_culler_1.VisualRegisterCuller.Monitor({
|
|
348
|
+
register: this
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
queueUpdate(update) {
|
|
352
|
+
if (this.Disposed) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
// Merge settings from existing queued item.
|
|
356
|
+
let settings = this.updateQueueSettings[update.entityId];
|
|
357
|
+
if (settings !== true) {
|
|
358
|
+
if (update.refresh === true) {
|
|
359
|
+
settings = true;
|
|
360
|
+
}
|
|
361
|
+
else if (update.refresh === false) {
|
|
362
|
+
if (!settings) {
|
|
363
|
+
settings = false;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
if (!settings) {
|
|
368
|
+
settings = {};
|
|
369
|
+
}
|
|
370
|
+
if (update.refresh.highlighted) {
|
|
371
|
+
settings.highlighted = true;
|
|
372
|
+
}
|
|
373
|
+
if (update.refresh.selected) {
|
|
374
|
+
settings.selected = true;
|
|
375
|
+
}
|
|
376
|
+
if (update.refresh.opacity) {
|
|
377
|
+
settings.opacity = true;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
this.updateQueueSettings[update.entityId] = settings;
|
|
382
|
+
// Queue ID if it's not already in the queue.
|
|
383
|
+
if (!this.updateQueue.includes(update.entityId)) {
|
|
384
|
+
this.updateQueue.push(update.entityId);
|
|
385
|
+
this.pingUpdateQueue();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
pingUpdateQueue() {
|
|
389
|
+
if (this.updateQueueInterval) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
const BATCH_SIZE = 300;
|
|
393
|
+
if (this.updateQueue.length) {
|
|
394
|
+
this.updateQueueInterval = setInterval(() => {
|
|
395
|
+
if (this.Disposed || (!this.viewer || !this.viewer.scene || this.viewer.isDestroyed())) {
|
|
396
|
+
clearInterval(this.updateQueueInterval);
|
|
397
|
+
this.updateQueueInterval = null;
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const batch = this.updateQueue.splice(0, BATCH_SIZE);
|
|
401
|
+
const cache = {};
|
|
402
|
+
for (let i = 0; i < batch.length; i++) {
|
|
403
|
+
const entityId = batch[i];
|
|
404
|
+
// Check if still registered.
|
|
405
|
+
if (!this.rego[entityId] || !this.rego[entityId].length) {
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
updateEntity(this.viewer, entityId, this, this.updateQueueSettings[entityId] == null ? false : this.updateQueueSettings[entityId], cache);
|
|
409
|
+
this.updateQueueSettings[entityId] = null;
|
|
410
|
+
delete this.updateQueueSettings[entityId];
|
|
411
|
+
}
|
|
412
|
+
this.viewer.scene.requestRender();
|
|
413
|
+
if (!this.updateQueue.length) {
|
|
414
|
+
clearInterval(this.updateQueueInterval);
|
|
415
|
+
this.updateQueueInterval = null;
|
|
416
|
+
}
|
|
417
|
+
}, 10);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Returns the applied visual state for a given Entity ID.
|
|
422
|
+
* This is a combination of a Menu Item specific state and a general state.
|
|
423
|
+
* @param params
|
|
424
|
+
*/
|
|
425
|
+
GetState(params) {
|
|
426
|
+
var _a, _b;
|
|
427
|
+
const { entityId, menuItemId } = params;
|
|
428
|
+
let eState = (_a = this.states[entityId]) === null || _a === void 0 ? void 0 : _a[NO_MENU_ITEM_KEY];
|
|
429
|
+
if (eState && isBlankState(eState)) {
|
|
430
|
+
eState = null;
|
|
431
|
+
delete this.states[entityId][NO_MENU_ITEM_KEY];
|
|
432
|
+
}
|
|
433
|
+
let mState;
|
|
434
|
+
if (menuItemId) {
|
|
435
|
+
mState = (_b = this.states[entityId]) === null || _b === void 0 ? void 0 : _b[menuItemId];
|
|
436
|
+
if (mState && isBlankState(mState)) {
|
|
437
|
+
mState = null;
|
|
438
|
+
delete this.states[entityId][menuItemId];
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (!mState && eState) {
|
|
442
|
+
return eState;
|
|
443
|
+
}
|
|
444
|
+
let state = getBlankState(entityId, menuItemId);
|
|
445
|
+
if (eState) {
|
|
446
|
+
state = Object.assign(state, eState);
|
|
447
|
+
}
|
|
448
|
+
if (mState) {
|
|
449
|
+
state = Object.assign(state, mState);
|
|
450
|
+
}
|
|
451
|
+
if (menuItemId) {
|
|
452
|
+
state.menuItemId = menuItemId;
|
|
453
|
+
}
|
|
454
|
+
state.entityId = entityId;
|
|
455
|
+
return state;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Sets the state for a given Entity.
|
|
459
|
+
* This can be used to perform multiple visual updates in one go.
|
|
460
|
+
* @param state
|
|
461
|
+
* @param update
|
|
462
|
+
*/
|
|
463
|
+
SetState(state, update = true, source) {
|
|
464
|
+
if (!state || isBlankState(state)) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
const refresh = {
|
|
468
|
+
highlighted: state.hasOwnProperty("highlighted"),
|
|
469
|
+
selected: state.hasOwnProperty("selected"),
|
|
470
|
+
opacity: state.hasOwnProperty("opacity")
|
|
471
|
+
};
|
|
472
|
+
const updateAll = state.hasOwnProperty("isolated");
|
|
473
|
+
let changed = this.setStateValues(state);
|
|
474
|
+
// Update the related Entity.
|
|
475
|
+
if (changed && update) {
|
|
476
|
+
if (updateAll) {
|
|
477
|
+
this.updateAllEntities({
|
|
478
|
+
refresh: refresh
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
this.queueUpdate({
|
|
483
|
+
entityId: state.entityId,
|
|
484
|
+
refresh: refresh
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
// Trigger update event.
|
|
488
|
+
if (this.onUpdate) {
|
|
489
|
+
const update = {
|
|
490
|
+
type: EVisualUpdateType.Update,
|
|
491
|
+
entityId: state.entityId
|
|
492
|
+
};
|
|
493
|
+
if (state.hasOwnProperty("selected")) {
|
|
494
|
+
update.selected = state.selected;
|
|
495
|
+
}
|
|
496
|
+
if (state.hasOwnProperty("opacity")) {
|
|
497
|
+
update.opacity = state.opacity;
|
|
498
|
+
}
|
|
499
|
+
if (state.hasOwnProperty("isolated")) {
|
|
500
|
+
update.isolated = state.isolated;
|
|
501
|
+
}
|
|
502
|
+
if (state.hasOwnProperty("hidden")) {
|
|
503
|
+
update.hidden = state.hidden;
|
|
504
|
+
}
|
|
505
|
+
if (source) {
|
|
506
|
+
update.source = source;
|
|
507
|
+
}
|
|
508
|
+
this.onUpdate.Trigger(update);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return changed;
|
|
512
|
+
}
|
|
513
|
+
SetStates(states, source) {
|
|
514
|
+
// Array of changed Entity IDs so we know what to refresh/notify at the end.
|
|
515
|
+
const entityIds = [];
|
|
516
|
+
// If we need to update all Entities.
|
|
517
|
+
// This is usually for isolation changes.
|
|
518
|
+
let updateAll = false;
|
|
519
|
+
// Map of individual Entity refresh settings.
|
|
520
|
+
let refresh = {};
|
|
521
|
+
// Settings to apply if a refresh-all is needed.
|
|
522
|
+
let refreshAccumulated = {};
|
|
523
|
+
// Indicator that at least one Entity state was updated.
|
|
524
|
+
let changed = false;
|
|
525
|
+
const updateRefreshMarkers = (state) => {
|
|
526
|
+
if (state.hasOwnProperty("isolated")) {
|
|
527
|
+
updateAll = true;
|
|
528
|
+
}
|
|
529
|
+
let values = refresh[state.entityId];
|
|
530
|
+
if (!values) {
|
|
531
|
+
values = refresh[state.entityId] = {};
|
|
532
|
+
}
|
|
533
|
+
if (state.hasOwnProperty("highlighted")) {
|
|
534
|
+
values.highlighted = true;
|
|
535
|
+
refreshAccumulated.highlighted = true;
|
|
536
|
+
}
|
|
537
|
+
if (state.hasOwnProperty("selected")) {
|
|
538
|
+
values.selected = true;
|
|
539
|
+
refreshAccumulated.selected = true;
|
|
540
|
+
}
|
|
541
|
+
if (state.hasOwnProperty("opacity")) {
|
|
542
|
+
values.opacity = true;
|
|
543
|
+
refreshAccumulated.opacity = true;
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
const doUpdate = (state) => {
|
|
547
|
+
const eChanged = this.SetState(state, false, source);
|
|
548
|
+
if (eChanged && !entityIds.includes(state.entityId)) {
|
|
549
|
+
updateRefreshMarkers(state);
|
|
550
|
+
entityIds.push(state.entityId);
|
|
551
|
+
changed = true;
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
if (Array.isArray(states)) {
|
|
555
|
+
for (let i = 0; i < states.length; i++) {
|
|
556
|
+
doUpdate(states[i]);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
Object.values(states).forEach(state => {
|
|
561
|
+
doUpdate(state);
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
if (changed) {
|
|
565
|
+
if (updateAll) {
|
|
566
|
+
this.updateAllEntities({
|
|
567
|
+
refresh: refreshAccumulated
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
572
|
+
this.queueUpdate({
|
|
573
|
+
entityId: entityIds[i],
|
|
574
|
+
refresh: refresh[entityIds[i]]
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
// Trigger update event.
|
|
579
|
+
if (this.onUpdate) {
|
|
580
|
+
const keys = Object.keys(states);
|
|
581
|
+
for (let i = 0; i < keys.length; i++) {
|
|
582
|
+
const key = keys[i];
|
|
583
|
+
const state = states[key];
|
|
584
|
+
if (entityIds.includes(state.entityId)) {
|
|
585
|
+
const update = {
|
|
586
|
+
type: EVisualUpdateType.Update,
|
|
587
|
+
entityId: state.entityId
|
|
588
|
+
};
|
|
589
|
+
if (state.hasOwnProperty("selected")) {
|
|
590
|
+
update.selected = state.selected;
|
|
591
|
+
}
|
|
592
|
+
if (state.hasOwnProperty("opacity")) {
|
|
593
|
+
update.opacity = state.opacity;
|
|
594
|
+
}
|
|
595
|
+
if (state.hasOwnProperty("isolated")) {
|
|
596
|
+
update.isolated = state.isolated;
|
|
597
|
+
}
|
|
598
|
+
if (state.hasOwnProperty("hidden")) {
|
|
599
|
+
update.hidden = state.hidden;
|
|
600
|
+
}
|
|
601
|
+
if (source) {
|
|
602
|
+
update.source = source;
|
|
603
|
+
}
|
|
604
|
+
this.onUpdate.Trigger(update);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Sets the provided settings for a given Entity's state.
|
|
612
|
+
* @param params
|
|
613
|
+
*/
|
|
614
|
+
setStateValues(values) {
|
|
615
|
+
const { entityId, menuItemId } = values;
|
|
616
|
+
const keys = Object.keys(values).filter(k => k !== "entityId" && k !== "menuItemId");
|
|
617
|
+
if (!keys.length) {
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
let changed = false;
|
|
621
|
+
const eStates = this.states[entityId] || {};
|
|
622
|
+
this.states[entityId] = eStates;
|
|
623
|
+
const targetMenuItemId = menuItemId || NO_MENU_ITEM_KEY;
|
|
624
|
+
let state = eStates[targetMenuItemId] || getBlankState(entityId, menuItemId);
|
|
625
|
+
eStates[targetMenuItemId] = state;
|
|
626
|
+
// Update state and detect changes.
|
|
627
|
+
for (const key of keys) {
|
|
628
|
+
if (state[key] !== values[key]) {
|
|
629
|
+
state[key] = values[key];
|
|
630
|
+
changed = true;
|
|
631
|
+
}
|
|
632
|
+
if (state[key] == null) {
|
|
633
|
+
delete state[key];
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
if (isBlankState(state)) {
|
|
637
|
+
delete eStates[targetMenuItemId];
|
|
638
|
+
if (Object.keys(eStates).length === 0) {
|
|
639
|
+
delete this.states[entityId];
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// If no menuItemId, strip matching keys from other menu item states.
|
|
643
|
+
if (!menuItemId) {
|
|
644
|
+
for (const key in eStates) {
|
|
645
|
+
if (key !== NO_MENU_ITEM_KEY) {
|
|
646
|
+
const otherState = eStates[key];
|
|
647
|
+
for (const stateKey of keys) {
|
|
648
|
+
if (otherState.hasOwnProperty(stateKey)) {
|
|
649
|
+
changed = true;
|
|
650
|
+
delete otherState[stateKey];
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
if (isBlankState(otherState)) {
|
|
654
|
+
delete eStates[key];
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
if (Object.keys(eStates).length === 0) {
|
|
659
|
+
delete this.states[entityId];
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
return changed;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Returns all visual state settings.
|
|
666
|
+
* This is typically used for saving.
|
|
667
|
+
*/
|
|
668
|
+
GetStates(params) {
|
|
669
|
+
const states = [];
|
|
670
|
+
// We flatten the dictionary into an array.
|
|
671
|
+
const keys = Object.keys(this.states);
|
|
672
|
+
for (let i = 0; i < keys.length; i++) {
|
|
673
|
+
const entityId = keys[i];
|
|
674
|
+
const eStates = this.states[entityId];
|
|
675
|
+
if (!eStates) {
|
|
676
|
+
continue;
|
|
677
|
+
}
|
|
678
|
+
const mKeys = Object.keys(eStates);
|
|
679
|
+
for (let j = 0; j < mKeys.length; j++) {
|
|
680
|
+
const menuItemId = mKeys[j];
|
|
681
|
+
const state = eStates[menuItemId];
|
|
682
|
+
if (!state) {
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
685
|
+
states.push(state);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
if (!(params === null || params === void 0 ? void 0 : params.optimized)) {
|
|
689
|
+
return states;
|
|
690
|
+
}
|
|
691
|
+
const newStates = [];
|
|
692
|
+
for (let i = 0; i < states.length; i++) {
|
|
693
|
+
let state = states[i];
|
|
694
|
+
// Dereference.
|
|
695
|
+
state = {
|
|
696
|
+
...state
|
|
697
|
+
};
|
|
698
|
+
if (state.opacity === 1) {
|
|
699
|
+
delete state.opacity;
|
|
700
|
+
}
|
|
701
|
+
if (state.hidden === false) {
|
|
702
|
+
delete state.hidden;
|
|
703
|
+
}
|
|
704
|
+
if (state.highlighted === false) {
|
|
705
|
+
delete state.highlighted;
|
|
706
|
+
}
|
|
707
|
+
if (state.selected === false) {
|
|
708
|
+
delete state.selected;
|
|
709
|
+
}
|
|
710
|
+
if (state.labelled === false) {
|
|
711
|
+
delete state.labelled;
|
|
712
|
+
}
|
|
713
|
+
if (state.isolated === false) {
|
|
714
|
+
delete state.isolated;
|
|
715
|
+
}
|
|
716
|
+
if (isBlankState(state)) {
|
|
717
|
+
continue;
|
|
718
|
+
}
|
|
719
|
+
newStates.push(state);
|
|
720
|
+
}
|
|
721
|
+
return newStates;
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Applies a set of new states to override the existing ones.
|
|
725
|
+
* This can be a costly operation as it will update all visuals.
|
|
726
|
+
* @param states
|
|
727
|
+
*/
|
|
728
|
+
OverrideStates(states) {
|
|
729
|
+
// Clear current states.
|
|
730
|
+
this.ClearOpacity();
|
|
731
|
+
this.ClearLabelled();
|
|
732
|
+
this.ClearSelected();
|
|
733
|
+
this.ClearHighlighted();
|
|
734
|
+
this.ClearIsolated();
|
|
735
|
+
this.ClearHidden();
|
|
736
|
+
this.states = {};
|
|
737
|
+
let newStates = {};
|
|
738
|
+
for (let i = 0; i < states.length; i++) {
|
|
739
|
+
const state = states[i];
|
|
740
|
+
if (!state.menuItemId && state.hasOwnProperty("menuItemId")) {
|
|
741
|
+
delete state.menuItemId;
|
|
742
|
+
}
|
|
743
|
+
if (!state.entityId) {
|
|
744
|
+
continue;
|
|
745
|
+
}
|
|
746
|
+
if (isBlankState(state)) {
|
|
747
|
+
continue;
|
|
748
|
+
}
|
|
749
|
+
if (!newStates[state.entityId]) {
|
|
750
|
+
newStates[state.entityId] = {};
|
|
751
|
+
}
|
|
752
|
+
newStates[state.entityId][state.menuItemId ? state.menuItemId : NO_MENU_ITEM_KEY] = {
|
|
753
|
+
...state
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
this.states = newStates;
|
|
757
|
+
// Reflect the rest of the changes.
|
|
758
|
+
this.updateAllEntities();
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Returns all states with the first detected Menu Item ID settings included.
|
|
762
|
+
* This is a utility function for returning settings for apps that don't support the newer state settings.
|
|
763
|
+
* @deprecated Use GetStates() or GetState().
|
|
764
|
+
* @returns
|
|
765
|
+
*/
|
|
766
|
+
GetStatesLegacy() {
|
|
767
|
+
const states = {};
|
|
768
|
+
let entityIds = [];
|
|
769
|
+
let entityIdsMenuItem = {};
|
|
770
|
+
for (const entityId in this.states) {
|
|
771
|
+
const eStates = this.states[entityId];
|
|
772
|
+
if (!eStates) {
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
775
|
+
if (!entityIds.includes(entityId)) {
|
|
776
|
+
entityIds.push(entityId);
|
|
777
|
+
}
|
|
778
|
+
const mKeys = Object.keys(eStates);
|
|
779
|
+
for (let i = 0; i < mKeys.length; i++) {
|
|
780
|
+
const menuItemId = mKeys[i];
|
|
781
|
+
if (menuItemId) {
|
|
782
|
+
entityIdsMenuItem[entityId] = menuItemId;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
787
|
+
const entityId = entityIds[i];
|
|
788
|
+
const state = this.GetState({
|
|
789
|
+
entityId: entityId,
|
|
790
|
+
// First known Menu Item.
|
|
791
|
+
menuItemId: entityIdsMenuItem[entityId]
|
|
792
|
+
});
|
|
793
|
+
states[entityId] = state;
|
|
794
|
+
}
|
|
795
|
+
// Remove empty states.
|
|
796
|
+
const keys = Object.keys(states);
|
|
797
|
+
for (let i = 0; i < keys.length; i++) {
|
|
798
|
+
const key = keys[i];
|
|
799
|
+
const state = states[key];
|
|
800
|
+
const idKeys = !state.menuItemId ? 1 : 2;
|
|
801
|
+
if (Object.keys(state).length === idKeys) {
|
|
802
|
+
delete states[key];
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
return states;
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Utility to iterate over all states.
|
|
809
|
+
* @param callback
|
|
810
|
+
*/
|
|
811
|
+
ForEachState(callback) {
|
|
812
|
+
// Flatten and iterate.
|
|
813
|
+
const keys = Object.keys(this.states);
|
|
814
|
+
for (let i = 0; i < keys.length; i++) {
|
|
815
|
+
const entityId = keys[i];
|
|
816
|
+
const eStates = this.states[entityId];
|
|
817
|
+
if (!eStates) {
|
|
818
|
+
continue;
|
|
819
|
+
}
|
|
820
|
+
const mKeys = Object.keys(eStates);
|
|
821
|
+
for (let j = 0; j < mKeys.length; j++) {
|
|
822
|
+
const menuItemId = mKeys[j];
|
|
823
|
+
const state = eStates[menuItemId];
|
|
824
|
+
if (!state) {
|
|
825
|
+
continue;
|
|
826
|
+
}
|
|
827
|
+
callback(state);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
RefreshMark(params) {
|
|
832
|
+
const { rego } = params;
|
|
833
|
+
markEntity(this, rego, rego.visual, false);
|
|
834
|
+
}
|
|
835
|
+
Dispose() {
|
|
836
|
+
var _a;
|
|
837
|
+
(_a = this.cameraCullerDispose) === null || _a === void 0 ? void 0 : _a.call(this, {
|
|
838
|
+
uncull: false
|
|
839
|
+
});
|
|
840
|
+
this.cameraCullerDispose = null;
|
|
841
|
+
clearInterval(this.updateQueueInterval);
|
|
842
|
+
this.updateQueueInterval = null;
|
|
843
|
+
this.disposed = true;
|
|
844
|
+
}
|
|
845
|
+
ForceUpdate(params) {
|
|
846
|
+
var _a;
|
|
847
|
+
let { entityIds, requestRender, refreshColors, source } = params;
|
|
848
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
849
|
+
const entityId = entityIds[i];
|
|
850
|
+
this.queueUpdate({
|
|
851
|
+
entityId: entityId,
|
|
852
|
+
refresh: true
|
|
853
|
+
});
|
|
854
|
+
const update = {
|
|
855
|
+
type: EVisualUpdateType.Update,
|
|
856
|
+
entityId
|
|
857
|
+
};
|
|
858
|
+
if (source) {
|
|
859
|
+
update.source = source;
|
|
860
|
+
}
|
|
861
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Marks given entityIds as either labelled or not labelled.
|
|
866
|
+
* When an entity is labelled a label will be drawn on the "best" visual for it.
|
|
867
|
+
* @param params
|
|
868
|
+
*/
|
|
869
|
+
SetLabelled(params) {
|
|
870
|
+
const { labelled, entityIds, requestRender, menuItemId } = params;
|
|
871
|
+
const cache = {};
|
|
872
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
873
|
+
const id = entityIds[i];
|
|
874
|
+
const state = this.GetState({
|
|
875
|
+
entityId: id,
|
|
876
|
+
menuItemId
|
|
877
|
+
});
|
|
878
|
+
const doLabel = Boolean(state.labelled) != labelled;
|
|
879
|
+
this.setStateValues({
|
|
880
|
+
entityId: id,
|
|
881
|
+
menuItemId: menuItemId,
|
|
882
|
+
// Null means it will be deleted from the object.
|
|
883
|
+
labelled: labelled ? true : null
|
|
884
|
+
});
|
|
885
|
+
if (doLabel) {
|
|
886
|
+
this.queueUpdate({
|
|
887
|
+
entityId: id,
|
|
888
|
+
refresh: false
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* Returns if given entity id is labelled.
|
|
895
|
+
* @param params
|
|
896
|
+
*/
|
|
897
|
+
GetIsLabelled(params) {
|
|
898
|
+
const { entityId: id, menuItemId } = params;
|
|
899
|
+
const state = this.GetState({
|
|
900
|
+
entityId: id,
|
|
901
|
+
menuItemId
|
|
902
|
+
});
|
|
903
|
+
return state.labelled === true;
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* Clears all labelled entities.
|
|
907
|
+
* @param params
|
|
908
|
+
*/
|
|
909
|
+
ClearLabelled(params) {
|
|
910
|
+
const cache = {};
|
|
911
|
+
const toUpdateIds = [];
|
|
912
|
+
this.ForEachState((state) => {
|
|
913
|
+
if (state.labelled == null || state.labelled === undefined) {
|
|
914
|
+
return;
|
|
915
|
+
}
|
|
916
|
+
delete state.labelled;
|
|
917
|
+
if (!toUpdateIds.includes(state.entityId)) {
|
|
918
|
+
toUpdateIds.push(state.entityId);
|
|
919
|
+
}
|
|
920
|
+
});
|
|
921
|
+
for (let i = 0; i < toUpdateIds.length; i++) {
|
|
922
|
+
const id = toUpdateIds[i];
|
|
923
|
+
this.queueUpdate({
|
|
924
|
+
entityId: id,
|
|
925
|
+
refresh: false
|
|
926
|
+
});
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
/**
|
|
930
|
+
* Returns all labelled entity ids.
|
|
931
|
+
* @deprecated Use GetStates() or GetState().
|
|
932
|
+
*/
|
|
933
|
+
GetLabelled() {
|
|
934
|
+
const labelledIds = [];
|
|
935
|
+
const states = this.GetStatesLegacy();
|
|
936
|
+
for (const entityId in states) {
|
|
937
|
+
if (states[entityId].labelled) {
|
|
938
|
+
labelledIds.push(entityId);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
return labelledIds;
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* Updates the selection color.
|
|
945
|
+
* This will not update the selection color for already selected entities.
|
|
946
|
+
* @param color
|
|
947
|
+
*/
|
|
948
|
+
SetSelectionColor(color) {
|
|
949
|
+
if (color) {
|
|
950
|
+
cesium_entity_styler_1.CesiumEntityStyler.UpdateColorSetting("select", color);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
/**
|
|
954
|
+
* Updates the highlight color.
|
|
955
|
+
* This will not update the highlight color for already highlighted entities.
|
|
956
|
+
* @param color
|
|
957
|
+
*/
|
|
958
|
+
SetHighlightColor(color) {
|
|
959
|
+
if (color) {
|
|
960
|
+
cesium_entity_styler_1.CesiumEntityStyler.UpdateColorSetting("highlight", color);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
SetSelected(params) {
|
|
964
|
+
var _a;
|
|
965
|
+
let { entityIds, selected, refreshIfSelected, requestRender, menuItemId, source } = params;
|
|
966
|
+
if (refreshIfSelected == null || refreshIfSelected === undefined) {
|
|
967
|
+
refreshIfSelected = true;
|
|
968
|
+
}
|
|
969
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
970
|
+
const id = entityIds[i];
|
|
971
|
+
const state = this.GetState({
|
|
972
|
+
entityId: id,
|
|
973
|
+
menuItemId
|
|
974
|
+
});
|
|
975
|
+
// Checking if we need to refresh the selection.
|
|
976
|
+
const doSelect = refreshIfSelected || (Boolean(state.selected) != selected);
|
|
977
|
+
this.setStateValues({
|
|
978
|
+
entityId: id,
|
|
979
|
+
menuItemId: menuItemId,
|
|
980
|
+
// Null means it will be deleted from the object.
|
|
981
|
+
selected: selected ? true : null
|
|
982
|
+
});
|
|
983
|
+
if (selected) {
|
|
984
|
+
if (doSelect) {
|
|
985
|
+
const regos = this.rego[id];
|
|
986
|
+
if (regos) {
|
|
987
|
+
for (let i = 0; i < regos.length; i++) {
|
|
988
|
+
const rego = regos[i];
|
|
989
|
+
if (menuItemId && rego.menuItemId !== menuItemId) {
|
|
990
|
+
continue;
|
|
991
|
+
}
|
|
992
|
+
cesium_entity_styler_1.CesiumEntityStyler.Select({
|
|
993
|
+
entity: rego.visual,
|
|
994
|
+
viewer: this.viewer,
|
|
995
|
+
requestRender: false
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
else {
|
|
1002
|
+
if (doSelect) {
|
|
1003
|
+
const regos = this.rego[id];
|
|
1004
|
+
if (regos) {
|
|
1005
|
+
for (let i = 0; i < regos.length; i++) {
|
|
1006
|
+
const rego = regos[i];
|
|
1007
|
+
if (menuItemId && rego.menuItemId !== menuItemId) {
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
1010
|
+
cesium_entity_styler_1.CesiumEntityStyler.Deselect({
|
|
1011
|
+
entity: rego.visual,
|
|
1012
|
+
viewer: this.viewer,
|
|
1013
|
+
requestRender: false
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
const update = {
|
|
1020
|
+
entityId: id,
|
|
1021
|
+
type: EVisualUpdateType.Update,
|
|
1022
|
+
selected: selected
|
|
1023
|
+
};
|
|
1024
|
+
if (source) {
|
|
1025
|
+
update.source = source;
|
|
1026
|
+
}
|
|
1027
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
1028
|
+
}
|
|
1029
|
+
if (requestRender != false) {
|
|
1030
|
+
this.viewer.scene.requestRender();
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
GetIsSelected(params) {
|
|
1034
|
+
const { entityId: id, menuItemId } = params;
|
|
1035
|
+
const state = this.GetState({
|
|
1036
|
+
entityId: id,
|
|
1037
|
+
menuItemId
|
|
1038
|
+
});
|
|
1039
|
+
return state.selected === true;
|
|
1040
|
+
}
|
|
1041
|
+
ClearSelected(params) {
|
|
1042
|
+
var _a;
|
|
1043
|
+
const cleared = [];
|
|
1044
|
+
this.ForEachState((state) => {
|
|
1045
|
+
if (state.selected == null || state.selected === undefined) {
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
delete state.selected;
|
|
1049
|
+
const regos = this.GetRegos({
|
|
1050
|
+
entityId: state.entityId,
|
|
1051
|
+
menuItemId: state.menuItemId
|
|
1052
|
+
});
|
|
1053
|
+
for (let i = 0; i < regos.length; i++) {
|
|
1054
|
+
const rego = regos[i];
|
|
1055
|
+
if ((rego === null || rego === void 0 ? void 0 : rego.visual) && !cleared.includes(rego)) {
|
|
1056
|
+
cesium_entity_styler_1.CesiumEntityStyler.Deselect({
|
|
1057
|
+
entity: rego.visual,
|
|
1058
|
+
viewer: this.viewer,
|
|
1059
|
+
requestRender: false
|
|
1060
|
+
});
|
|
1061
|
+
cleared.push(rego);
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
});
|
|
1065
|
+
const update = {
|
|
1066
|
+
type: EVisualUpdateType.DeselectAll
|
|
1067
|
+
};
|
|
1068
|
+
if (params === null || params === void 0 ? void 0 : params.source) {
|
|
1069
|
+
update.source = params.source;
|
|
1070
|
+
}
|
|
1071
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
1072
|
+
if ((params === null || params === void 0 ? void 0 : params.requestRender) != false) {
|
|
1073
|
+
this.viewer.scene.requestRender();
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* @deprecated Use GetStates() or GetState().
|
|
1078
|
+
* @returns
|
|
1079
|
+
*/
|
|
1080
|
+
GetSelected() {
|
|
1081
|
+
const selectedIds = [];
|
|
1082
|
+
const states = this.GetStatesLegacy();
|
|
1083
|
+
for (const entityId in states) {
|
|
1084
|
+
if (states[entityId].selected) {
|
|
1085
|
+
selectedIds.push(entityId);
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
return selectedIds;
|
|
1089
|
+
}
|
|
1090
|
+
SetHighlighted(params) {
|
|
1091
|
+
let { entityIds, highlighted, refreshIfHighlighted, requestRender, menuItemId } = params;
|
|
1092
|
+
if (refreshIfHighlighted || refreshIfHighlighted === undefined) {
|
|
1093
|
+
refreshIfHighlighted = true;
|
|
1094
|
+
}
|
|
1095
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
1096
|
+
const id = entityIds[i];
|
|
1097
|
+
const state = this.GetState({
|
|
1098
|
+
entityId: id,
|
|
1099
|
+
menuItemId
|
|
1100
|
+
});
|
|
1101
|
+
// Checking if we need to refresh the highlight.
|
|
1102
|
+
const doHighlight = refreshIfHighlighted || (Boolean(state.highlighted) != highlighted);
|
|
1103
|
+
const changed = this.setStateValues({
|
|
1104
|
+
entityId: id,
|
|
1105
|
+
menuItemId: menuItemId,
|
|
1106
|
+
// Null means it will be deleted from the object.
|
|
1107
|
+
highlighted: highlighted ? true : null
|
|
1108
|
+
});
|
|
1109
|
+
if (highlighted) {
|
|
1110
|
+
if (doHighlight) {
|
|
1111
|
+
const regos = this.rego[id];
|
|
1112
|
+
if (regos) {
|
|
1113
|
+
for (let i = 0; i < regos.length; i++) {
|
|
1114
|
+
const rego = regos[i];
|
|
1115
|
+
if (menuItemId && rego.menuItemId !== menuItemId) {
|
|
1116
|
+
continue;
|
|
1117
|
+
}
|
|
1118
|
+
cesium_entity_styler_1.CesiumEntityStyler.Highlight({
|
|
1119
|
+
entity: rego.visual,
|
|
1120
|
+
viewer: this.viewer,
|
|
1121
|
+
requestRender: false
|
|
1122
|
+
});
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
else {
|
|
1128
|
+
const regos = this.rego[id];
|
|
1129
|
+
if (regos) {
|
|
1130
|
+
for (let i = 0; i < regos.length; i++) {
|
|
1131
|
+
const rego = regos[i];
|
|
1132
|
+
if (menuItemId && rego.menuItemId !== menuItemId) {
|
|
1133
|
+
continue;
|
|
1134
|
+
}
|
|
1135
|
+
cesium_entity_styler_1.CesiumEntityStyler.Unhighlight({
|
|
1136
|
+
entity: rego.visual,
|
|
1137
|
+
viewer: this.viewer,
|
|
1138
|
+
requestRender: false
|
|
1139
|
+
});
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
if (requestRender != false) {
|
|
1145
|
+
this.viewer.scene.requestRender();
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
GetIsHighlighted(params) {
|
|
1149
|
+
const { entityId: id, menuItemId } = params;
|
|
1150
|
+
const state = this.GetState({
|
|
1151
|
+
entityId: id,
|
|
1152
|
+
menuItemId
|
|
1153
|
+
});
|
|
1154
|
+
return state.highlighted === true;
|
|
1155
|
+
}
|
|
1156
|
+
ClearHighlighted(params) {
|
|
1157
|
+
// Null all states.
|
|
1158
|
+
let entityIds = [];
|
|
1159
|
+
this.ForEachState((state) => {
|
|
1160
|
+
if (state.highlighted) {
|
|
1161
|
+
delete state.highlighted;
|
|
1162
|
+
if (!entityIds.includes(state.entityId)) {
|
|
1163
|
+
entityIds.push(state.entityId);
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
});
|
|
1167
|
+
// Revert needed visual changes.
|
|
1168
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
1169
|
+
const id = entityIds[i];
|
|
1170
|
+
const regos = this.rego[id];
|
|
1171
|
+
if (regos) {
|
|
1172
|
+
for (let i = 0; i < regos.length; i++) {
|
|
1173
|
+
const rego = regos[i];
|
|
1174
|
+
cesium_entity_styler_1.CesiumEntityStyler.Unhighlight({
|
|
1175
|
+
entity: rego.visual,
|
|
1176
|
+
viewer: this.viewer,
|
|
1177
|
+
requestRender: false
|
|
1178
|
+
});
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
if ((params === null || params === void 0 ? void 0 : params.requestRender) != false) {
|
|
1183
|
+
this.viewer.scene.requestRender();
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
/**
|
|
1187
|
+
* @deprecated Use GetStates() or GetState().
|
|
1188
|
+
* @returns
|
|
1189
|
+
*/
|
|
1190
|
+
GetHighlighted() {
|
|
1191
|
+
const highlightedIds = [];
|
|
1192
|
+
const states = this.GetStatesLegacy();
|
|
1193
|
+
for (const entityId in states) {
|
|
1194
|
+
if (states[entityId].highlighted) {
|
|
1195
|
+
highlightedIds.push(entityId);
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
return highlightedIds;
|
|
1199
|
+
}
|
|
1200
|
+
SetIsolated(params) {
|
|
1201
|
+
var _a;
|
|
1202
|
+
const { entityIds, isolated: isolate, requestRender, menuItemId, source } = params;
|
|
1203
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
1204
|
+
const entityId = entityIds[i];
|
|
1205
|
+
this.setStateValues({
|
|
1206
|
+
entityId: entityId,
|
|
1207
|
+
menuItemId: menuItemId,
|
|
1208
|
+
// Null means it will be deleted from the object.
|
|
1209
|
+
isolated: isolate ? true : null
|
|
1210
|
+
});
|
|
1211
|
+
const update = {
|
|
1212
|
+
entityId: entityId,
|
|
1213
|
+
type: EVisualUpdateType.Update,
|
|
1214
|
+
isolated: isolate
|
|
1215
|
+
};
|
|
1216
|
+
if (source) {
|
|
1217
|
+
update.source = source;
|
|
1218
|
+
}
|
|
1219
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
1220
|
+
}
|
|
1221
|
+
this.updateAllEntities({
|
|
1222
|
+
requestRender: false,
|
|
1223
|
+
refresh: isolate
|
|
1224
|
+
});
|
|
1225
|
+
if (requestRender != false) {
|
|
1226
|
+
this.viewer.scene.requestRender();
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
GetIsIsolated(params) {
|
|
1230
|
+
const { entityId: id, menuItemId } = params;
|
|
1231
|
+
const state = this.GetState({
|
|
1232
|
+
entityId: id,
|
|
1233
|
+
menuItemId: menuItemId
|
|
1234
|
+
});
|
|
1235
|
+
return state.isolated === true;
|
|
1236
|
+
}
|
|
1237
|
+
GetIsIsolatedAny() {
|
|
1238
|
+
return Object.values(this.states).some(state => state && Object.values(state).some(item => item.isolated));
|
|
1239
|
+
}
|
|
1240
|
+
/**
|
|
1241
|
+
* @deprecated Use GetStates() or GetState().
|
|
1242
|
+
* @returns
|
|
1243
|
+
*/
|
|
1244
|
+
GetIsolated() {
|
|
1245
|
+
const isolatedIds = [];
|
|
1246
|
+
const states = this.GetStatesLegacy();
|
|
1247
|
+
for (const entityId in states) {
|
|
1248
|
+
if (states[entityId].isolated) {
|
|
1249
|
+
isolatedIds.push(entityId);
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
return isolatedIds;
|
|
1253
|
+
}
|
|
1254
|
+
ClearIsolated(params) {
|
|
1255
|
+
let changed = false;
|
|
1256
|
+
this.ForEachState((state) => {
|
|
1257
|
+
if (state.isolated) {
|
|
1258
|
+
changed = true;
|
|
1259
|
+
}
|
|
1260
|
+
delete state.isolated;
|
|
1261
|
+
});
|
|
1262
|
+
if (changed) {
|
|
1263
|
+
this.updateAllEntities({
|
|
1264
|
+
requestRender: params === null || params === void 0 ? void 0 : params.requestRender,
|
|
1265
|
+
refresh: true
|
|
1266
|
+
});
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
SetHidden(params) {
|
|
1270
|
+
const { entityIds, hidden, requestRender, menuItemId, source } = params;
|
|
1271
|
+
const stateChanges = [];
|
|
1272
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
1273
|
+
const entityId = entityIds[i];
|
|
1274
|
+
const state = {
|
|
1275
|
+
entityId: entityId,
|
|
1276
|
+
hidden: hidden
|
|
1277
|
+
};
|
|
1278
|
+
if (menuItemId) {
|
|
1279
|
+
state.menuItemId = menuItemId;
|
|
1280
|
+
}
|
|
1281
|
+
stateChanges.push(state);
|
|
1282
|
+
}
|
|
1283
|
+
this.SetStates(stateChanges, source);
|
|
1284
|
+
}
|
|
1285
|
+
GetIsHidden(params) {
|
|
1286
|
+
const { entityId: id, menuItemId } = params;
|
|
1287
|
+
const state = this.GetState({
|
|
1288
|
+
entityId: id,
|
|
1289
|
+
menuItemId: menuItemId
|
|
1290
|
+
});
|
|
1291
|
+
return state.hidden === true;
|
|
1292
|
+
}
|
|
1293
|
+
/**
|
|
1294
|
+
* @deprecated Use GetStates() or GetState().
|
|
1295
|
+
* @returns
|
|
1296
|
+
*/
|
|
1297
|
+
GetHidden() {
|
|
1298
|
+
const hiddenIds = [];
|
|
1299
|
+
const states = this.GetStatesLegacy();
|
|
1300
|
+
for (const entityId in states) {
|
|
1301
|
+
if (states[entityId].hidden) {
|
|
1302
|
+
hiddenIds.push(entityId);
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
return hiddenIds;
|
|
1306
|
+
}
|
|
1307
|
+
ClearHidden(params) {
|
|
1308
|
+
var _a;
|
|
1309
|
+
let changed = false;
|
|
1310
|
+
this.ForEachState((state) => {
|
|
1311
|
+
if (state.hidden) {
|
|
1312
|
+
changed = true;
|
|
1313
|
+
}
|
|
1314
|
+
delete state.hidden;
|
|
1315
|
+
});
|
|
1316
|
+
if (changed) {
|
|
1317
|
+
this.updateAllEntities({
|
|
1318
|
+
requestRender: params === null || params === void 0 ? void 0 : params.requestRender,
|
|
1319
|
+
refresh: true
|
|
1320
|
+
});
|
|
1321
|
+
}
|
|
1322
|
+
const update = {
|
|
1323
|
+
type: EVisualUpdateType.Update,
|
|
1324
|
+
hidden: false
|
|
1325
|
+
};
|
|
1326
|
+
if (params === null || params === void 0 ? void 0 : params.source) {
|
|
1327
|
+
update.source = params.source;
|
|
1328
|
+
}
|
|
1329
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
1330
|
+
}
|
|
1331
|
+
AddRego(params) {
|
|
1332
|
+
var _a, _b;
|
|
1333
|
+
const { rego, requestRender, source } = params;
|
|
1334
|
+
// ND-2078
|
|
1335
|
+
// Tilesets will often add -> remove -> add because of how tiles load in and out of the scene.
|
|
1336
|
+
// To avoid flickering, we'll just replace rather than remove -> add.
|
|
1337
|
+
if (!rego.tilesetId && params.removePrior != false) {
|
|
1338
|
+
this.RemoveRegos({
|
|
1339
|
+
entityId: rego.entityId,
|
|
1340
|
+
menuItemId: rego.menuItemId,
|
|
1341
|
+
doUpdate: false,
|
|
1342
|
+
requestRender: false
|
|
1343
|
+
});
|
|
1344
|
+
}
|
|
1345
|
+
const entityId = rego.entityId;
|
|
1346
|
+
// Add the new visual to the register.
|
|
1347
|
+
const entityRegos = (_a = this.rego[entityId]) !== null && _a !== void 0 ? _a : [];
|
|
1348
|
+
entityRegos.push(rego);
|
|
1349
|
+
this.rego[entityId] = entityRegos;
|
|
1350
|
+
// Mark the visual as part of this register so selection works.
|
|
1351
|
+
markEntity(this, rego, rego.visual, false);
|
|
1352
|
+
// Run any updates on the visual based on the calculated state.
|
|
1353
|
+
// Eg: visibility, opacity, selection, etc.
|
|
1354
|
+
this.queueUpdate({
|
|
1355
|
+
entityId: entityId,
|
|
1356
|
+
refresh: true
|
|
1357
|
+
});
|
|
1358
|
+
const update = {
|
|
1359
|
+
rego: rego,
|
|
1360
|
+
type: EVisualUpdateType.Add,
|
|
1361
|
+
entityId: rego.entityId
|
|
1362
|
+
};
|
|
1363
|
+
if (source) {
|
|
1364
|
+
update.source = source;
|
|
1365
|
+
}
|
|
1366
|
+
(_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(update);
|
|
1367
|
+
if (requestRender != false) {
|
|
1368
|
+
this.viewer.scene.requestRender();
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
/**
|
|
1372
|
+
* Locates a visual corresponding to a given entity id.
|
|
1373
|
+
* If no menu item id is provided, then it will pick the "best" one.
|
|
1374
|
+
* @param params
|
|
1375
|
+
* @returns
|
|
1376
|
+
*/
|
|
1377
|
+
GetRego(params) {
|
|
1378
|
+
const { entityId, menuItemId, relation } = params;
|
|
1379
|
+
if (relation) {
|
|
1380
|
+
const relationKey = relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(relation);
|
|
1381
|
+
for (const entityId in this.rego) {
|
|
1382
|
+
const entityRegos = this.rego[entityId];
|
|
1383
|
+
if (entityRegos) {
|
|
1384
|
+
const rego = entityRegos.find(r => r.relation && relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(r.relation) == relationKey);
|
|
1385
|
+
if (rego) {
|
|
1386
|
+
return rego;
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
else {
|
|
1392
|
+
const entityRegos = this.rego[entityId];
|
|
1393
|
+
if (!entityRegos) {
|
|
1394
|
+
return null;
|
|
1395
|
+
}
|
|
1396
|
+
if (menuItemId) {
|
|
1397
|
+
return entityRegos.find(r => r.menuItemId === menuItemId);
|
|
1398
|
+
}
|
|
1399
|
+
return entityRegos.sort((a, b) => {
|
|
1400
|
+
return b.priority - a.priority;
|
|
1401
|
+
})[0];
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
/**
|
|
1405
|
+
* Returns regos matching given criteria.
|
|
1406
|
+
* Either entityId or menuItemId must be provided.
|
|
1407
|
+
* @param params
|
|
1408
|
+
* @returns
|
|
1409
|
+
*/
|
|
1410
|
+
GetRegos(params) {
|
|
1411
|
+
// TODO: refactor.
|
|
1412
|
+
// Currently this was made by merging two functions.
|
|
1413
|
+
const { entityId, menuItemId } = params;
|
|
1414
|
+
if (entityId) {
|
|
1415
|
+
const entityId = params.entityId;
|
|
1416
|
+
const entityRegos = this.rego[entityId];
|
|
1417
|
+
if (!entityRegos) {
|
|
1418
|
+
return [];
|
|
1419
|
+
}
|
|
1420
|
+
return menuItemId ? entityRegos.filter(x => x.menuItemId == menuItemId) : entityRegos;
|
|
1421
|
+
}
|
|
1422
|
+
else if (menuItemId) {
|
|
1423
|
+
const menuItemId = params.menuItemId;
|
|
1424
|
+
const visuals = [];
|
|
1425
|
+
for (const entityId in this.rego) {
|
|
1426
|
+
const entityRegos = this.rego[entityId];
|
|
1427
|
+
if (entityRegos) {
|
|
1428
|
+
const rego = entityRegos.find(r => r.menuItemId === menuItemId);
|
|
1429
|
+
if (rego) {
|
|
1430
|
+
visuals.push(rego);
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
return visuals;
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
/**
|
|
1438
|
+
* Removes regos matching given criteria.
|
|
1439
|
+
* Either entityId or menuItemId must be provided.
|
|
1440
|
+
* @param params
|
|
1441
|
+
* @returns
|
|
1442
|
+
*/
|
|
1443
|
+
RemoveRegos(params) {
|
|
1444
|
+
var _a, _b, _c;
|
|
1445
|
+
let { entityId, menuItemId, doUpdate, relation, retainTagIds, requestRender, doRemove, source } = params;
|
|
1446
|
+
if (doUpdate == null || doUpdate === undefined) {
|
|
1447
|
+
doUpdate = true;
|
|
1448
|
+
}
|
|
1449
|
+
if (retainTagIds == null || retainTagIds === undefined) {
|
|
1450
|
+
retainTagIds = [];
|
|
1451
|
+
}
|
|
1452
|
+
// TODO: refactor.
|
|
1453
|
+
// Currently this was made by merging two functions.
|
|
1454
|
+
if (menuItemId && !entityId) {
|
|
1455
|
+
for (const entityId in this.rego) {
|
|
1456
|
+
const entityRegos = this.rego[entityId];
|
|
1457
|
+
if (entityRegos) {
|
|
1458
|
+
const rego = entityRegos.find(r => r.menuItemId === menuItemId);
|
|
1459
|
+
if (!rego) {
|
|
1460
|
+
continue;
|
|
1461
|
+
}
|
|
1462
|
+
const regoTagIds = rego.tagIds ? rego.tagIds : [];
|
|
1463
|
+
const shouldRetain = regoTagIds.some(tagId => retainTagIds.includes(tagId));
|
|
1464
|
+
if (shouldRetain) {
|
|
1465
|
+
continue;
|
|
1466
|
+
}
|
|
1467
|
+
entity_label_1.EntityLabel.Detatch({
|
|
1468
|
+
rego
|
|
1469
|
+
});
|
|
1470
|
+
if (doRemove != false) {
|
|
1471
|
+
removeEntity(this.viewer, rego.visual);
|
|
1472
|
+
}
|
|
1473
|
+
rego.visual = null;
|
|
1474
|
+
const doesInclude = this.rego[entityId].find(r => r.menuItemId === menuItemId);
|
|
1475
|
+
if (doesInclude) {
|
|
1476
|
+
this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
|
|
1477
|
+
}
|
|
1478
|
+
const update = {
|
|
1479
|
+
type: EVisualUpdateType.Remove,
|
|
1480
|
+
entityId: rego.entityId,
|
|
1481
|
+
rego: rego
|
|
1482
|
+
};
|
|
1483
|
+
if (source) {
|
|
1484
|
+
update.source = source;
|
|
1485
|
+
}
|
|
1486
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
1487
|
+
if (doesInclude) {
|
|
1488
|
+
this.queueUpdate({
|
|
1489
|
+
entityId: entityId,
|
|
1490
|
+
refresh: false
|
|
1491
|
+
});
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
else if (entityId) {
|
|
1497
|
+
const entityRegos = this.rego[entityId];
|
|
1498
|
+
if (!entityRegos) {
|
|
1499
|
+
return;
|
|
1500
|
+
}
|
|
1501
|
+
const menuItems = menuItemId ? [menuItemId] : entityRegos.map(x => x.menuItemId);
|
|
1502
|
+
for (let i = 0; i < menuItems.length; i++) {
|
|
1503
|
+
const menuItemId = menuItems[i];
|
|
1504
|
+
const rego = entityRegos.find(r => r.menuItemId === menuItemId);
|
|
1505
|
+
if (!rego) {
|
|
1506
|
+
return;
|
|
1507
|
+
}
|
|
1508
|
+
entity_label_1.EntityLabel.Detatch({
|
|
1509
|
+
rego
|
|
1510
|
+
});
|
|
1511
|
+
if (doRemove != false) {
|
|
1512
|
+
removeEntity(this.viewer, rego.visual);
|
|
1513
|
+
}
|
|
1514
|
+
rego.visual = null;
|
|
1515
|
+
const update = {
|
|
1516
|
+
type: EVisualUpdateType.Remove,
|
|
1517
|
+
entityId: rego.entityId,
|
|
1518
|
+
rego: rego
|
|
1519
|
+
};
|
|
1520
|
+
if (source) {
|
|
1521
|
+
update.source = source;
|
|
1522
|
+
}
|
|
1523
|
+
(_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(update);
|
|
1524
|
+
this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
|
|
1525
|
+
if (doUpdate && menuItemId) {
|
|
1526
|
+
this.queueUpdate({
|
|
1527
|
+
entityId: entityId,
|
|
1528
|
+
refresh: false
|
|
1529
|
+
});
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
else if (relation) {
|
|
1534
|
+
const relationKey = relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(relation);
|
|
1535
|
+
for (const entityId in this.rego) {
|
|
1536
|
+
const entityRegos = this.rego[entityId];
|
|
1537
|
+
if (entityRegos) {
|
|
1538
|
+
const rego = entityRegos.find(r => r.relation && relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(r.relation) == relationKey);
|
|
1539
|
+
if (!rego) {
|
|
1540
|
+
continue;
|
|
1541
|
+
}
|
|
1542
|
+
entity_label_1.EntityLabel.Detatch({
|
|
1543
|
+
rego
|
|
1544
|
+
});
|
|
1545
|
+
removeEntity(this.viewer, rego.visual);
|
|
1546
|
+
rego.visual = null;
|
|
1547
|
+
this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
|
|
1548
|
+
const update = {
|
|
1549
|
+
type: EVisualUpdateType.Remove,
|
|
1550
|
+
entityId: rego.entityId,
|
|
1551
|
+
rego: rego
|
|
1552
|
+
};
|
|
1553
|
+
if (source) {
|
|
1554
|
+
update.source = source;
|
|
1555
|
+
}
|
|
1556
|
+
(_c = this.onUpdate) === null || _c === void 0 ? void 0 : _c.Trigger(update);
|
|
1557
|
+
if (doUpdate && menuItemId) {
|
|
1558
|
+
this.queueUpdate({
|
|
1559
|
+
entityId: entityId,
|
|
1560
|
+
refresh: false
|
|
1561
|
+
});
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
/**
|
|
1568
|
+
* Returns an array of drilled visuals associated with this register.
|
|
1569
|
+
* The top array item is the first found.
|
|
1570
|
+
* @param params
|
|
1571
|
+
* @returns
|
|
1572
|
+
*/
|
|
1573
|
+
GetRegosFromCursor(params) {
|
|
1574
|
+
var _a, _b;
|
|
1575
|
+
const { cursor } = params;
|
|
1576
|
+
const found = [];
|
|
1577
|
+
const width = Math.ceil((0, js_utils_1.EnsureNumber)(params.width, 5));
|
|
1578
|
+
const height = Math.ceil((0, js_utils_1.EnsureNumber)(params.height, 5));
|
|
1579
|
+
const pickLimit = Math.ceil((0, js_utils_1.EnsureNumber)(params.pickLimit, 5));
|
|
1580
|
+
const picked = this.viewer.scene.drillPick(new Cesium.Cartesian2(cursor.x, cursor.y), pickLimit, width, height);
|
|
1581
|
+
for (let i = 0; i < picked.length; i++) {
|
|
1582
|
+
const object = picked[i];
|
|
1583
|
+
const entity = (object && object.id && object.id instanceof Cesium.Entity ? object.id : object);
|
|
1584
|
+
const visual = entity;
|
|
1585
|
+
if (((_a = visual === null || visual === void 0 ? void 0 : visual._register) === null || _a === void 0 ? void 0 : _a.Id) == this.id) {
|
|
1586
|
+
const foundEntityId = (_b = visual._rego) === null || _b === void 0 ? void 0 : _b.entityId;
|
|
1587
|
+
if (foundEntityId && found.findIndex(x => x.entityId == foundEntityId) <= -1) {
|
|
1588
|
+
found.push(visual._rego);
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
return {
|
|
1593
|
+
regos: found
|
|
1594
|
+
};
|
|
1595
|
+
}
|
|
1596
|
+
/**
|
|
1597
|
+
* Returns all registered entity ids.
|
|
1598
|
+
*/
|
|
1599
|
+
GetEntityIds() {
|
|
1600
|
+
const ids = [];
|
|
1601
|
+
for (const entityId in this.rego) {
|
|
1602
|
+
const regos = this.rego[entityId];
|
|
1603
|
+
if (regos && regos.length) {
|
|
1604
|
+
ids.push(entityId);
|
|
1605
|
+
}
|
|
1606
|
+
}
|
|
1607
|
+
return ids;
|
|
1608
|
+
}
|
|
1609
|
+
/**
|
|
1610
|
+
* Marks regos corresponding to given entity ids as stale.
|
|
1611
|
+
* This will cause them to be updated on the next update cycle.
|
|
1612
|
+
* Optionally include menu item ids to restrict the filter.
|
|
1613
|
+
* @param params
|
|
1614
|
+
*/
|
|
1615
|
+
MarkStale(params) {
|
|
1616
|
+
const { entityIds, menuItemIds } = params;
|
|
1617
|
+
for (const entityId of entityIds) {
|
|
1618
|
+
const regos = this.rego[entityId];
|
|
1619
|
+
if (regos && regos.length) {
|
|
1620
|
+
for (const rego of regos) {
|
|
1621
|
+
if (!menuItemIds || menuItemIds.includes(rego.menuItemId)) {
|
|
1622
|
+
rego.stale = true;
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
updateAllEntities(params) {
|
|
1629
|
+
for (const entityId in this.rego) {
|
|
1630
|
+
const regos = this.rego[entityId];
|
|
1631
|
+
if (regos && regos.length) {
|
|
1632
|
+
this.queueUpdate({
|
|
1633
|
+
entityId: entityId,
|
|
1634
|
+
refresh: (params === null || params === void 0 ? void 0 : params.refresh) == null ? true : params.refresh
|
|
1635
|
+
});
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
/**
|
|
1640
|
+
* Sets opacity for given set of entities.
|
|
1641
|
+
* 100% opacity is treated as "use original".
|
|
1642
|
+
* @param params
|
|
1643
|
+
*/
|
|
1644
|
+
SetOpacity(params) {
|
|
1645
|
+
var _a;
|
|
1646
|
+
let { opacity, entityIds, menuItemId, requestRender, source } = params;
|
|
1647
|
+
for (const entityId of entityIds) {
|
|
1648
|
+
this.setStateValues({
|
|
1649
|
+
entityId: entityId,
|
|
1650
|
+
menuItemId: menuItemId,
|
|
1651
|
+
opacity: opacity
|
|
1652
|
+
});
|
|
1653
|
+
const update = {
|
|
1654
|
+
type: EVisualUpdateType.Update,
|
|
1655
|
+
entityId: entityId,
|
|
1656
|
+
opacity: opacity
|
|
1657
|
+
};
|
|
1658
|
+
if (source) {
|
|
1659
|
+
update.source = source;
|
|
1660
|
+
}
|
|
1661
|
+
(_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
|
|
1662
|
+
this.queueUpdate({
|
|
1663
|
+
entityId: entityId,
|
|
1664
|
+
refresh: {
|
|
1665
|
+
opacity: true
|
|
1666
|
+
}
|
|
1667
|
+
});
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
/**
|
|
1671
|
+
* Returns opacity for given entity/s.
|
|
1672
|
+
* If multiple entities are supplied, then the average is returned.
|
|
1673
|
+
* Unknown opacity is treated as 100% opacity.
|
|
1674
|
+
* @param params
|
|
1675
|
+
* @returns
|
|
1676
|
+
*/
|
|
1677
|
+
GetOpacity(params) {
|
|
1678
|
+
let { entityIds, entityId, menuItemId, menuItemIds } = params;
|
|
1679
|
+
if (!entityIds) {
|
|
1680
|
+
entityIds = entityId ? [entityId] : [];
|
|
1681
|
+
}
|
|
1682
|
+
if (!menuItemIds && menuItemId) {
|
|
1683
|
+
menuItemIds = menuItemId;
|
|
1684
|
+
}
|
|
1685
|
+
let totalOpacity = null;
|
|
1686
|
+
let totalTicks = 0;
|
|
1687
|
+
for (const entityId of entityIds) {
|
|
1688
|
+
const rego = this.GetRego({
|
|
1689
|
+
entityId: entityId,
|
|
1690
|
+
menuItemId: menuItemId
|
|
1691
|
+
});
|
|
1692
|
+
if (rego) {
|
|
1693
|
+
const state = this.GetState({
|
|
1694
|
+
entityId: entityId,
|
|
1695
|
+
menuItemId: rego.menuItemId
|
|
1696
|
+
});
|
|
1697
|
+
let opacity = state === null || state === void 0 ? void 0 : state.opacity;
|
|
1698
|
+
if (opacity != null) {
|
|
1699
|
+
totalOpacity += opacity;
|
|
1700
|
+
totalTicks += 1;
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
return (totalOpacity && totalTicks) ? (totalOpacity / totalTicks) : totalOpacity != null && typeof totalOpacity == "number" ? totalOpacity : 1;
|
|
1705
|
+
}
|
|
1706
|
+
ClearOpacity(params) {
|
|
1707
|
+
const clearedIds = [];
|
|
1708
|
+
this.ForEachState((state) => {
|
|
1709
|
+
if (!clearedIds.includes(state.entityId) && state.opacity != null) {
|
|
1710
|
+
this.queueUpdate({
|
|
1711
|
+
entityId: state.entityId,
|
|
1712
|
+
refresh: {
|
|
1713
|
+
opacity: true
|
|
1714
|
+
}
|
|
1715
|
+
});
|
|
1716
|
+
clearedIds.push(state.entityId);
|
|
1717
|
+
}
|
|
1718
|
+
delete state.opacity;
|
|
1719
|
+
});
|
|
1720
|
+
}
|
|
1721
|
+
/**
|
|
1722
|
+
* Returns a dictionary containing entityId -> opacity values.
|
|
1723
|
+
* Opacity 1 = 100%.
|
|
1724
|
+
* @returns
|
|
1725
|
+
* @deprecated Use GetStates() or GetState().
|
|
1726
|
+
*/
|
|
1727
|
+
GetOpacityMap() {
|
|
1728
|
+
const map = {};
|
|
1729
|
+
const states = this.GetStatesLegacy();
|
|
1730
|
+
for (const entityId in states) {
|
|
1731
|
+
const opacity = states[entityId].opacity;
|
|
1732
|
+
if (opacity != null && opacity != 1) {
|
|
1733
|
+
map[entityId] = opacity;
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
return map;
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
VisualsRegister.Register = Register;
|
|
1740
|
+
})(VisualsRegister = exports.VisualsRegister || (exports.VisualsRegister = {}));
|
|
1741
|
+
//# sourceMappingURL=visuals-register.js.map
|