bruce-cesium 1.0.3 → 1.0.5

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 (28) hide show
  1. package/dist/bruce-cesium.es5.js +705 -12
  2. package/dist/bruce-cesium.es5.js.map +1 -1
  3. package/dist/bruce-cesium.umd.js +703 -9
  4. package/dist/bruce-cesium.umd.js.map +1 -1
  5. package/dist/lib/bruce-cesium.js +1 -0
  6. package/dist/lib/bruce-cesium.js.map +1 -1
  7. package/dist/lib/rendering/menu-item-manager.js +9 -0
  8. package/dist/lib/rendering/menu-item-manager.js.map +1 -1
  9. package/dist/lib/rendering/relation-render-engine.js +199 -0
  10. package/dist/lib/rendering/relation-render-engine.js.map +1 -0
  11. package/dist/lib/rendering/render-managers/common/cesium-parabola.js +292 -0
  12. package/dist/lib/rendering/render-managers/common/cesium-parabola.js.map +1 -0
  13. package/dist/lib/rendering/render-managers/other/relations-render-manager.js +203 -0
  14. package/dist/lib/rendering/render-managers/other/relations-render-manager.js.map +1 -0
  15. package/dist/lib/rendering/visuals-register.js +25 -2
  16. package/dist/lib/rendering/visuals-register.js.map +1 -1
  17. package/dist/lib/utils/drawing-utils.js +84 -0
  18. package/dist/lib/utils/drawing-utils.js.map +1 -1
  19. package/dist/lib/utils/entity-utils.js +23 -5
  20. package/dist/lib/utils/entity-utils.js.map +1 -1
  21. package/dist/types/bruce-cesium.d.ts +1 -0
  22. package/dist/types/rendering/relation-render-engine.d.ts +30 -0
  23. package/dist/types/rendering/render-managers/common/cesium-parabola.d.ts +30 -0
  24. package/dist/types/rendering/render-managers/other/relations-render-manager.d.ts +24 -0
  25. package/dist/types/rendering/visuals-register.d.ts +4 -2
  26. package/dist/types/utils/drawing-utils.d.ts +15 -0
  27. package/dist/types/utils/entity-utils.d.ts +2 -2
  28. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
- import { BruceEvent, Cartes, Carto, Geometry, ZoomControl, Style, EntityTag, Calculator, EntityLod, EntityType, ClientFile, DelayQueue, Entity as Entity$1, BatchedDataGetter, ObjectUtils, Tileset, EntityCoords, EntityFilterGetter, EntitySource, MenuItem, ProjectView, ProjectViewBookmark, ProjectViewTile, ProjectViewLegacyTile, ProgramKey, Camera } from 'bruce-models';
2
- import { Cartesian2, Cartographic, Math as Math$1, Entity, Primitive, Cesium3DTileFeature, Color, Cartesian3, HeightReference, HorizontalOrigin, VerticalOrigin, ClassificationType, ArcType, PolygonHierarchy, ShadowMode, PolylineGraphics, HeadingPitchRoll, Transforms, ColorBlendMode, Cesium3DTileColorBlendMode, HeadingPitchRange, OrthographicFrustum, JulianDate, createWorldTerrain, EllipsoidTerrainProvider, CesiumTerrainProvider, BingMapsImageryProvider, BingMapsStyle, MapboxImageryProvider, MapboxStyleImageryProvider, ArcGisMapServerImageryProvider, OpenStreetMapImageryProvider, GridImageryProvider, GeographicTilingScheme, ImageryLayer, UrlTemplateImageryProvider, TileMapServiceImageryProvider, IonImageryProvider, PolygonPipeline, Matrix4, Cesium3DTileStyle, Cesium3DTileset, IonResource, ColorMaterialProperty, Rectangle, Matrix3, EasingFunction, GeometryInstance, EllipsoidGeodesic, createOsmBuildings, KmlDataSource } from 'cesium';
1
+ import { BruceEvent, Cartes, Carto, Geometry, ZoomControl, Style, EntityTag, Calculator, EntityLod, EntityType, ClientFile, DelayQueue, Entity as Entity$1, BatchedDataGetter, EntityRelationType, ObjectUtils, Tileset, EntityCoords, EntityFilterGetter, EntitySource, EntityRelation, MenuItem, ProjectView, ProjectViewBookmark, ProjectViewTile, ProjectViewLegacyTile, ProgramKey, Camera } from 'bruce-models';
2
+ import { Cartesian2, Cartographic, Math as Math$1, Color, HeightReference, Cartesian3, Entity, HorizontalOrigin, VerticalOrigin, ClassificationType, ArcType, PolygonHierarchy, ShadowMode, PolylineGraphics, HeadingPitchRoll, Transforms, ColorBlendMode, Primitive, Cesium3DTileFeature, Cesium3DTileColorBlendMode, HeadingPitchRange, OrthographicFrustum, JulianDate, createWorldTerrain, EllipsoidTerrainProvider, CesiumTerrainProvider, BingMapsImageryProvider, BingMapsStyle, MapboxImageryProvider, MapboxStyleImageryProvider, ArcGisMapServerImageryProvider, OpenStreetMapImageryProvider, GridImageryProvider, GeographicTilingScheme, ImageryLayer, UrlTemplateImageryProvider, TileMapServiceImageryProvider, IonImageryProvider, Matrix4, Cesium3DTileStyle, Cesium3DTileset, IonResource, PolygonPipeline, EllipsoidGeodesic, sampleTerrainMostDetailed, ColorMaterialProperty, Rectangle, Matrix3, EasingFunction, GeometryInstance, CallbackProperty, createOsmBuildings, KmlDataSource } from 'cesium';
3
3
 
4
4
  var TIME_LAG = 300;
5
5
  var POSITION_CHECK_TIMER = 950;
@@ -401,6 +401,54 @@ var DrawingUtils;
401
401
  };
402
402
  }
403
403
  DrawingUtils.PointAcrossPolyline = PointAcrossPolyline;
404
+ /**
405
+ * Returns terrain height from current viewer's provider.
406
+ * On error or flat terrain, it will return 0.
407
+ * If an error occurred it will be attached to the result.
408
+ * @param pos3d
409
+ * @param viewer
410
+ * @returns
411
+ */
412
+ function GetTerrainHeight(params) {
413
+ return __awaiter(this, void 0, void 0, function () {
414
+ var pos3d, viewer, sample, height, e_1;
415
+ return __generator(this, function (_a) {
416
+ switch (_a.label) {
417
+ case 0:
418
+ pos3d = params.pos3d, viewer = params.viewer;
419
+ _a.label = 1;
420
+ case 1:
421
+ _a.trys.push([1, 3, , 4]);
422
+ if (viewer.scene.terrainProvider instanceof EllipsoidTerrainProvider) {
423
+ return [2 /*return*/, {
424
+ height: 0
425
+ }];
426
+ }
427
+ return [4 /*yield*/, sampleTerrainMostDetailed(viewer.scene.terrainProvider, [Cartographic.fromCartesian(pos3d)])];
428
+ case 2:
429
+ sample = _a.sent();
430
+ height = (sample === null || sample === void 0 ? void 0 : sample.length) ? sample[0].height : null;
431
+ if (isNaN(height)) {
432
+ return [2 /*return*/, {
433
+ height: 0,
434
+ error: "NaN"
435
+ }];
436
+ }
437
+ return [2 /*return*/, {
438
+ height: height
439
+ }];
440
+ case 3:
441
+ e_1 = _a.sent();
442
+ return [2 /*return*/, {
443
+ height: 0,
444
+ error: e_1
445
+ }];
446
+ case 4: return [2 /*return*/];
447
+ }
448
+ });
449
+ });
450
+ }
451
+ DrawingUtils.GetTerrainHeight = GetTerrainHeight;
404
452
  })(DrawingUtils || (DrawingUtils = {}));
405
453
 
406
454
  var MeasureUtils;
@@ -613,13 +661,27 @@ var EntityUtils;
613
661
  /**
614
662
  * Returns an entity's position.
615
663
  * This will attempt to calculate it from multiple sources of data.
616
- * @param viewer
617
- * @param entity
664
+ * @param params
618
665
  * @returns
619
666
  */
620
667
  function GetPos(params) {
621
- var viewer = params.viewer, entity = params.entity;
622
- function evaluate() {
668
+ var viewer = params.viewer, entity = params.entity, visualRegister = params.visualRegister;
669
+ function evaluateRendered() {
670
+ var rego = visualRegister ? visualRegister.GetRego({
671
+ entityId: entity.Bruce.ID,
672
+ }) : null;
673
+ if ((rego === null || rego === void 0 ? void 0 : rego.visual) instanceof Entity) {
674
+ var visual = rego.visual;
675
+ if (visual.position) {
676
+ if (visual.position.getValue) {
677
+ return visual.position.getValue(viewer.scene.lastRenderTime);
678
+ }
679
+ return visual.position;
680
+ }
681
+ }
682
+ return null;
683
+ }
684
+ function evaluateRecord() {
623
685
  if (entity.location && Carto.ValidateCarto(entity.location)) {
624
686
  var location_1 = entity.location;
625
687
  return Cartesian3.fromDegrees(EnsureNumber(location_1.longitude), EnsureNumber(location_1.latitude), EnsureNumber(location_1.altitude));
@@ -679,7 +741,11 @@ var EntityUtils;
679
741
  }
680
742
  }
681
743
  }
682
- var pos3d = evaluate();
744
+ var pos3d = evaluateRendered();
745
+ if (Cartes.ValidateCartes3(pos3d)) {
746
+ return pos3d;
747
+ }
748
+ pos3d = evaluateRecord();
683
749
  return Cartes.ValidateCartes3(pos3d) ? pos3d : null;
684
750
  }
685
751
  EntityUtils.GetPos = GetPos;
@@ -2203,6 +2269,446 @@ var EntitiesLoadedRenderManager;
2203
2269
  EntitiesLoadedRenderManager.Manager = Manager;
2204
2270
  })(EntitiesLoadedRenderManager || (EntitiesLoadedRenderManager = {}));
2205
2271
 
2272
+ /**
2273
+ * Utility for rendering parabolas between two points on the map.
2274
+ */
2275
+ var CesiumParabola = /** @class */ (function () {
2276
+ function CesiumParabola(params) {
2277
+ this.color = "white";
2278
+ this.width = 2;
2279
+ this.duration = 10;
2280
+ this.heightDistanceRatio = 0.25;
2281
+ this.viewer = params.viewer;
2282
+ this.pos1 = params.pos1;
2283
+ this.pos2 = params.pos2;
2284
+ if (params.color) {
2285
+ this.color = params.color;
2286
+ }
2287
+ if (!isNaN(params.width)) {
2288
+ this.width = params.width;
2289
+ }
2290
+ if (!isNaN(params.duration)) {
2291
+ this.duration = params.duration;
2292
+ }
2293
+ if (!isNaN(params.heightDistanceRatio)) {
2294
+ this.heightDistanceRatio = params.heightDistanceRatio;
2295
+ }
2296
+ }
2297
+ Object.defineProperty(CesiumParabola.prototype, "curPos1", {
2298
+ get: function () {
2299
+ return this.pos1 instanceof Function ? this.pos1() : this.pos1;
2300
+ },
2301
+ enumerable: false,
2302
+ configurable: true
2303
+ });
2304
+ Object.defineProperty(CesiumParabola.prototype, "curPos2", {
2305
+ get: function () {
2306
+ return this.pos2 instanceof Function ? this.pos2() : this.pos2;
2307
+ },
2308
+ enumerable: false,
2309
+ configurable: true
2310
+ });
2311
+ CesiumParabola.prototype.Animate = function () {
2312
+ var _this = this;
2313
+ this.Dispose();
2314
+ var p1 = this.curPos1;
2315
+ var p2 = this.curPos2;
2316
+ var retry = false;
2317
+ if (!p1 || !p2 || !Cartes.ValidateCartes3(p1) || !Cartes.ValidateCartes3(p2)) {
2318
+ retry = true;
2319
+ }
2320
+ var TOTAL_LENGTH = retry ? 0 : Cartesian3.distance(p1, p2);
2321
+ if (TOTAL_LENGTH <= 0) {
2322
+ retry = true;
2323
+ }
2324
+ if (retry) {
2325
+ var retryTimeout_1 = setTimeout(function () {
2326
+ _this.Animate();
2327
+ }, 2000);
2328
+ this.dispose = function () {
2329
+ clearTimeout(retryTimeout_1);
2330
+ };
2331
+ return;
2332
+ }
2333
+ var TOTAL_POINTS = Math.max(50, Math.min(1000, TOTAL_LENGTH * 0.1));
2334
+ var POINT_LENGTH = TOTAL_LENGTH / TOTAL_POINTS;
2335
+ var RATE_PER_SECOND = 1000 / 40;
2336
+ var SEC_DURATION = this.duration;
2337
+ var HEIGHT_DISTANCE_RATIO = this.heightDistanceRatio;
2338
+ var TICK_LENGTH_INC = SEC_DURATION == 0 ? TOTAL_LENGTH : TOTAL_POINTS / (RATE_PER_SECOND * SEC_DURATION);
2339
+ var curPoints = [];
2340
+ var curPoint = 0;
2341
+ var parabola = new Entity({
2342
+ polyline: {
2343
+ positions: new CallbackProperty(function () {
2344
+ return curPoints;
2345
+ }, false),
2346
+ width: this.width,
2347
+ material: Color.fromCssColorString(this.color)
2348
+ }
2349
+ });
2350
+ this.viewer.entities.add(parabola);
2351
+ var p1Entity = new Entity({
2352
+ position: new CallbackProperty(function () {
2353
+ return curPoints.length ? curPoints[0] : new Cartesian3();
2354
+ }, false),
2355
+ point: {
2356
+ heightReference: HeightReference.NONE,
2357
+ pixelSize: this.width * 1.3,
2358
+ color: Color.fromCssColorString(this.color),
2359
+ outlineColor: Color.WHITE,
2360
+ outlineWidth: 2
2361
+ }
2362
+ });
2363
+ var p2Entity = new Entity({
2364
+ position: new CallbackProperty(function () {
2365
+ return curPoints.length ? curPoints[curPoints.length - 1] : new Cartesian3();
2366
+ }, false),
2367
+ point: {
2368
+ heightReference: HeightReference.NONE,
2369
+ pixelSize: this.width * 1.3,
2370
+ color: Color.fromCssColorString(this.color),
2371
+ outlineColor: Color.WHITE,
2372
+ outlineWidth: 2
2373
+ }
2374
+ });
2375
+ this.viewer.entities.add(p1Entity);
2376
+ this.viewer.entities.add(p2Entity);
2377
+ p1Entity.parent = parabola;
2378
+ p2Entity.parent = parabola;
2379
+ var quadraticKey = null;
2380
+ var quadratic = null;
2381
+ var prepareQuadratic = function () {
2382
+ var p1 = _this.curPos1;
2383
+ var p2 = _this.curPos2;
2384
+ if (!p1 || !p2 || !Cartes.ValidateCartes3(p1) || !Cartes.ValidateCartes3(p2)) {
2385
+ return;
2386
+ }
2387
+ var height1 = Cartographic.fromCartesian(p1).height;
2388
+ var height2 = Cartographic.fromCartesian(p2).height;
2389
+ if (isNaN(height1) || isNaN(height2)) {
2390
+ return;
2391
+ }
2392
+ var totalHeight = height2 + height1;
2393
+ var curQuadraticKey = height1 + "-" + height2;
2394
+ if (quadraticKey == curQuadraticKey) {
2395
+ return;
2396
+ }
2397
+ var points2d = [
2398
+ new Cartesian2(0, height1),
2399
+ new Cartesian2(TOTAL_LENGTH, height2)
2400
+ ];
2401
+ var vertexHeight = 0;
2402
+ // Flat line.
2403
+ if (HEIGHT_DISTANCE_RATIO == 0) {
2404
+ vertexHeight = totalHeight * 0.5;
2405
+ }
2406
+ else {
2407
+ var largestHeight = Math.max(height1, height2);
2408
+ vertexHeight = largestHeight + (TOTAL_LENGTH * HEIGHT_DISTANCE_RATIO);
2409
+ }
2410
+ points2d.push(new Cartesian2(TOTAL_LENGTH * 0.5, vertexHeight));
2411
+ var calcQuadratic = function (points) {
2412
+ // Swaps position of two rows in matrix.
2413
+ function swapRows(matrix, rowAIndex, rowBIndex) {
2414
+ var rowAVal = matrix[rowAIndex];
2415
+ matrix[rowAIndex] = matrix[rowBIndex];
2416
+ matrix[rowBIndex] = rowAVal;
2417
+ return matrix;
2418
+ }
2419
+ // Zeros rowA at colIndex by subtracting a multiplied rowB from it.
2420
+ function reduceMatrixRowByRow(matrix, zeroingIndex, parentIndex, colIndex) {
2421
+ var zeroRow = matrix[zeroingIndex];
2422
+ var parentRow = matrix[parentIndex];
2423
+ if (zeroRow[colIndex] == 0) {
2424
+ return matrix;
2425
+ }
2426
+ else if (parentRow[colIndex] == 0) {
2427
+ matrix = swapRows(matrix, parentIndex, zeroingIndex);
2428
+ return divideMatrixRow(matrix, parentIndex, colIndex);
2429
+ }
2430
+ // rowAIndex colIndex / rowBIndex colIndex = factor;
2431
+ var factor = zeroRow[colIndex] / parentRow[colIndex];
2432
+ for (var i = 0; i < zeroRow.length; i++) {
2433
+ if (i >= colIndex) {
2434
+ zeroRow[i] -= parentRow[i] * factor;
2435
+ }
2436
+ }
2437
+ return matrix;
2438
+ }
2439
+ // Makes a given row column equal 1 by diving while row by that column.
2440
+ function divideMatrixRow(matrix, rowIndex, colIndex) {
2441
+ var row = matrix[rowIndex];
2442
+ var colValue = row[colIndex];
2443
+ for (var i = 0; i < row.length; i++) {
2444
+ if (i >= colIndex) {
2445
+ row[i] /= colValue;
2446
+ }
2447
+ }
2448
+ return matrix;
2449
+ }
2450
+ // Returns initial matrix for calculating a, b and c for quadratic formula from given points.
2451
+ function matrixFromPoints(points) {
2452
+ var rows = [];
2453
+ var constructRow = function (point) {
2454
+ rows.push([
2455
+ -Math.pow(point.x, 2),
2456
+ point.x,
2457
+ 1,
2458
+ point.y
2459
+ ]);
2460
+ };
2461
+ for (var i = 0; i < points.length; i++) {
2462
+ constructRow(points[i]);
2463
+ }
2464
+ return rows;
2465
+ }
2466
+ var initialMatrix = matrixFromPoints(points);
2467
+ var step1Matrix = reduceMatrixRowByRow(initialMatrix, 1, 0, 0);
2468
+ var step2Matrix = reduceMatrixRowByRow(step1Matrix, 2, 0, 0);
2469
+ var step3Matrix = reduceMatrixRowByRow(step2Matrix, 2, 1, 1);
2470
+ var step4Matrix = reduceMatrixRowByRow(step3Matrix, 0, 1, 1);
2471
+ var step5Matrix = reduceMatrixRowByRow(step4Matrix, 0, 2, 2);
2472
+ var step6Matrix = reduceMatrixRowByRow(step5Matrix, 1, 2, 2);
2473
+ var a = step6Matrix[0][3];
2474
+ var b = step6Matrix[1][3];
2475
+ var c = step6Matrix[2][3];
2476
+ return { a: a, b: b, c: c };
2477
+ };
2478
+ quadratic = calcQuadratic(points2d);
2479
+ };
2480
+ var getPosition = function (increment) {
2481
+ if (!quadratic) {
2482
+ return null;
2483
+ }
2484
+ var lengthAcross = POINT_LENGTH * increment;
2485
+ if (lengthAcross > TOTAL_LENGTH) {
2486
+ lengthAcross = TOTAL_LENGTH;
2487
+ }
2488
+ var getParabolaYFromX = function (x, quadLetters) {
2489
+ var a = quadLetters.a;
2490
+ var b = quadLetters.b;
2491
+ var c = quadLetters.c;
2492
+ return (-a * Math.pow(x, 2)) + (b * x) + c;
2493
+ };
2494
+ var pos3d = DrawingUtils.PointAcrossPolyline({
2495
+ viewer: _this.viewer,
2496
+ distance: lengthAcross,
2497
+ posses: [p1, p2]
2498
+ }).point;
2499
+ var point = Cartographic.fromCartesian(pos3d);
2500
+ var posHeight = getParabolaYFromX(lengthAcross, quadratic);
2501
+ return Cartesian3.fromRadians(point.longitude, point.latitude, posHeight);
2502
+ };
2503
+ var updatePoints = function () {
2504
+ var increment = Math.floor(curPoint);
2505
+ var chips = curPoint - Math.floor(curPoint);
2506
+ var posses = [];
2507
+ posses.push(getPosition(0));
2508
+ var addLast = increment >= TOTAL_POINTS;
2509
+ var totalCycles = addLast ? increment + 1 : increment;
2510
+ for (var i = 0; i < totalCycles; i++) {
2511
+ posses.push(getPosition(i));
2512
+ }
2513
+ posses.push(getPosition(increment + chips));
2514
+ if (posses.find(function (x) { return !x || !Cartes.ValidateCartes3(x); })) {
2515
+ return;
2516
+ }
2517
+ curPoints = posses;
2518
+ };
2519
+ var doTick = function () {
2520
+ if (curPoint >= TOTAL_POINTS) {
2521
+ clearInterval(animateInterval);
2522
+ return;
2523
+ }
2524
+ curPoint += TICK_LENGTH_INC;
2525
+ prepareQuadratic();
2526
+ updatePoints();
2527
+ };
2528
+ var animateInterval = setInterval(doTick, RATE_PER_SECOND);
2529
+ this.dispose = function () {
2530
+ clearInterval(animateInterval);
2531
+ if (parabola && _this.viewer.entities.contains(parabola)) {
2532
+ _this.viewer.entities.remove(parabola);
2533
+ }
2534
+ if (p1Entity && _this.viewer.entities.contains(p1Entity)) {
2535
+ _this.viewer.entities.remove(p1Entity);
2536
+ }
2537
+ if (p2Entity && _this.viewer.entities.contains(p2Entity)) {
2538
+ _this.viewer.entities.remove(p2Entity);
2539
+ }
2540
+ };
2541
+ return {
2542
+ parabola: parabola,
2543
+ siblings: [
2544
+ p1Entity,
2545
+ p2Entity
2546
+ ]
2547
+ };
2548
+ };
2549
+ CesiumParabola.prototype.Dispose = function () {
2550
+ var _a;
2551
+ (_a = this.dispose) === null || _a === void 0 ? void 0 : _a.call(this);
2552
+ this.dispose = null;
2553
+ };
2554
+ return CesiumParabola;
2555
+ }());
2556
+
2557
+ function colorToCColor$1(color) {
2558
+ return new Color(color.red ? color.red / 255 : 0, color.green ? color.green / 255 : 0, color.blue ? color.blue / 255 : 0, color.alpha);
2559
+ }
2560
+ var RelationRenderEngine;
2561
+ (function (RelationRenderEngine) {
2562
+ function GetRenderGroupId(relation) {
2563
+ return relation["Related.Entity.ID"] + "-" + relation["Principal.Entity.ID"] + "-" + relation["Relation.Type.ID"];
2564
+ }
2565
+ RelationRenderEngine.GetRenderGroupId = GetRenderGroupId;
2566
+ function Render(params) {
2567
+ return __awaiter(this, void 0, void 0, function () {
2568
+ var apiGetter, viewer, visualRegister, menuItemId, relations, api, rendered, i, relation, fromEntity, toEntity, dataEntity, _a, relationType, style, _b, cEntity;
2569
+ return __generator(this, function (_c) {
2570
+ switch (_c.label) {
2571
+ case 0:
2572
+ apiGetter = params.apiGetter, viewer = params.viewer, visualRegister = params.visualRegister, menuItemId = params.menuItemId, relations = params.relations;
2573
+ api = apiGetter.getApi(apiGetter.accountId);
2574
+ rendered = {};
2575
+ i = 0;
2576
+ _c.label = 1;
2577
+ case 1:
2578
+ if (!(i < relations.length)) return [3 /*break*/, 12];
2579
+ relation = relations[i];
2580
+ return [4 /*yield*/, Entity$1.Get({
2581
+ api: api,
2582
+ entityId: relation["Principal.Entity.ID"],
2583
+ })];
2584
+ case 2:
2585
+ fromEntity = (_c.sent()).entity;
2586
+ return [4 /*yield*/, Entity$1.Get({
2587
+ api: api,
2588
+ entityId: relation["Related.Entity.ID"],
2589
+ })];
2590
+ case 3:
2591
+ toEntity = (_c.sent()).entity;
2592
+ if (!relation["Data.Entity.ID"]) return [3 /*break*/, 5];
2593
+ return [4 /*yield*/, Entity$1.Get({
2594
+ api: api,
2595
+ entityId: relation["Data.Entity.ID"]
2596
+ })];
2597
+ case 4:
2598
+ _a = (_c.sent()).entity;
2599
+ return [3 /*break*/, 6];
2600
+ case 5:
2601
+ _a = null;
2602
+ _c.label = 6;
2603
+ case 6:
2604
+ dataEntity = _a;
2605
+ return [4 /*yield*/, EntityRelationType.Get({
2606
+ api: api,
2607
+ relationTypeId: relation["Relation.Type.ID"]
2608
+ })];
2609
+ case 7:
2610
+ relationType = (_c.sent()).relationType;
2611
+ if (!relationType.EntityDisplaySettingID) return [3 /*break*/, 9];
2612
+ return [4 /*yield*/, Style.Get({
2613
+ api: api,
2614
+ styleId: Number(relationType.EntityDisplaySettingID)
2615
+ })];
2616
+ case 8:
2617
+ _b = (_c.sent()).style;
2618
+ return [3 /*break*/, 10];
2619
+ case 9:
2620
+ _b = null;
2621
+ _c.label = 10;
2622
+ case 10:
2623
+ style = _b;
2624
+ cEntity = Parabola.Render({
2625
+ dataEntity: dataEntity,
2626
+ fromEntity: fromEntity,
2627
+ relation: relation,
2628
+ style: style,
2629
+ toEntity: toEntity,
2630
+ viewer: viewer,
2631
+ visualRegister: visualRegister
2632
+ });
2633
+ cEntity._renderGroup = GetRenderGroupId(relation);
2634
+ rendered[GetRenderGroupId(relation)] = cEntity;
2635
+ _c.label = 11;
2636
+ case 11:
2637
+ i++;
2638
+ return [3 /*break*/, 1];
2639
+ case 12: return [2 /*return*/, rendered];
2640
+ }
2641
+ });
2642
+ });
2643
+ }
2644
+ RelationRenderEngine.Render = Render;
2645
+ var Parabola;
2646
+ (function (Parabola) {
2647
+ function Render(params) {
2648
+ var _a;
2649
+ var style = (_a = params.style) === null || _a === void 0 ? void 0 : _a.Settings;
2650
+ var entity = params.dataEntity;
2651
+ var bColor = (style === null || style === void 0 ? void 0 : style.lineColor) ? Calculator.GetColor(style === null || style === void 0 ? void 0 : style.lineColor, entity, []) : null;
2652
+ var cColor = bColor ? colorToCColor$1(bColor) : Color.WHITE;
2653
+ var width = EnsureNumber((style === null || style === void 0 ? void 0 : style.lineWidth) ? Calculator.GetValue(style === null || style === void 0 ? void 0 : style.lineWidth, entity, []) : 4, 4);
2654
+ if (width < 1) {
2655
+ width = 1;
2656
+ }
2657
+ var duration = EnsureNumber((style === null || style === void 0 ? void 0 : style.duration) ? Calculator.GetValue(style === null || style === void 0 ? void 0 : style.duration, entity, []) : 2, 2);
2658
+ var hDistanceRatio = EnsureNumber((style === null || style === void 0 ? void 0 : style.heightDistanceRatio) ? Calculator.GetValue(style === null || style === void 0 ? void 0 : style.heightDistanceRatio, entity, []) : 0.25, 0.25);
2659
+ var fromPos = null;
2660
+ var toPos = null;
2661
+ var updatePosses = function () {
2662
+ try {
2663
+ fromPos = EntityUtils.GetPos({
2664
+ entity: params.fromEntity,
2665
+ viewer: params.viewer,
2666
+ visualRegister: params.visualRegister
2667
+ });
2668
+ toPos = EntityUtils.GetPos({
2669
+ entity: params.toEntity,
2670
+ viewer: params.viewer,
2671
+ visualRegister: params.visualRegister
2672
+ });
2673
+ }
2674
+ catch (e) {
2675
+ console.error(e);
2676
+ }
2677
+ };
2678
+ updatePosses();
2679
+ var parabola = new CesiumParabola({
2680
+ viewer: params.viewer,
2681
+ pos1: function () { return fromPos; },
2682
+ pos2: function () { return toPos; },
2683
+ color: cColor.toString(),
2684
+ width: width,
2685
+ duration: duration,
2686
+ heightDistanceRatio: hDistanceRatio
2687
+ });
2688
+ var cEntities = parabola.Animate();
2689
+ var cEntity = cEntities.parabola;
2690
+ cEntity._siblingGraphics = [];
2691
+ for (var i = 0; i < cEntities.siblings.length; i++) {
2692
+ var sibling = cEntities.siblings[i];
2693
+ cEntity._siblingGraphics.push(sibling);
2694
+ }
2695
+ var updateInterval = setInterval(function () {
2696
+ var _a;
2697
+ if (!((_a = params.viewer) === null || _a === void 0 ? void 0 : _a.scene) ||
2698
+ params.viewer.isDestroyed() ||
2699
+ !params.viewer.entities.contains(cEntity)) {
2700
+ clearInterval(updateInterval);
2701
+ parabola.Dispose();
2702
+ return;
2703
+ }
2704
+ updatePosses();
2705
+ }, 1000);
2706
+ return cEntity;
2707
+ }
2708
+ Parabola.Render = Render;
2709
+ })(Parabola = RelationRenderEngine.Parabola || (RelationRenderEngine.Parabola = {}));
2710
+ })(RelationRenderEngine || (RelationRenderEngine = {}));
2711
+
2206
2712
  function removeEntity(viewer, visual) {
2207
2713
  unmarkEntity(visual);
2208
2714
  if (visual instanceof Entity) {
@@ -2708,8 +3214,8 @@ var VisualsRegister;
2708
3214
  * @returns
2709
3215
  */
2710
3216
  Register.prototype.RemoveRegos = function (params) {
2711
- var _a, _b;
2712
- var entityId = params.entityId, menuItemId = params.menuItemId, doUpdate = params.doUpdate;
3217
+ var _a, _b, _c;
3218
+ var entityId = params.entityId, menuItemId = params.menuItemId, doUpdate = params.doUpdate, relation = params.relation;
2713
3219
  if (doUpdate == null) {
2714
3220
  doUpdate = true;
2715
3221
  }
@@ -2767,6 +3273,28 @@ var VisualsRegister;
2767
3273
  return state_1.value;
2768
3274
  }
2769
3275
  }
3276
+ else if (relation) {
3277
+ var relationKey_1 = RelationRenderEngine.GetRenderGroupId(relation);
3278
+ for (var entityId_4 in this.rego) {
3279
+ var entityRegos = this.rego[entityId_4];
3280
+ if (entityRegos) {
3281
+ var rego = entityRegos.find(function (r) { return r.relation && RelationRenderEngine.GetRenderGroupId(r.relation) == relationKey_1; });
3282
+ if (!rego) {
3283
+ continue;
3284
+ }
3285
+ removeEntity(this.viewer, rego.visual);
3286
+ (_c = this.onUpdate) === null || _c === void 0 ? void 0 : _c.Trigger({
3287
+ type: EVisualUpdateType.Remove,
3288
+ entityId: rego.entityId,
3289
+ rego: rego
3290
+ });
3291
+ this.rego[entityId_4] = entityRegos.filter(function (r) { return r.menuItemId !== menuItemId; });
3292
+ if (doUpdate && menuItemId) {
3293
+ updateEntity(this.viewer, entityId_4, this);
3294
+ }
3295
+ }
3296
+ }
3297
+ }
2770
3298
  };
2771
3299
  /**
2772
3300
  * Returns an array of drilled visuals associated with this register.
@@ -3205,7 +3733,7 @@ var EntityRenderManager;
3205
3733
  EntityRenderManager.Manager = Manager;
3206
3734
  })(EntityRenderManager || (EntityRenderManager = {}));
3207
3735
 
3208
- function colorToCColor$1(color) {
3736
+ function colorToCColor$2(color) {
3209
3737
  return new Color(color.red ? color.red / 255 : 0, color.green ? color.green / 255 : 0, color.blue ? color.blue / 255 : 0, color.alpha);
3210
3738
  }
3211
3739
  /**
@@ -3834,7 +4362,7 @@ var TilesetRenderEngine;
3834
4362
  }
3835
4363
  var bColor = ((_a = style.modelStyle) === null || _a === void 0 ? void 0 : _a.fillColor) ? Calculator.GetColor(style.modelStyle.fillColor, data, []) : null;
3836
4364
  if (bColor != null) {
3837
- var cColor = colorToCColor$1(bColor);
4365
+ var cColor = colorToCColor$2(bColor);
3838
4366
  var visual = entity.visual;
3839
4367
  if (visual && visual instanceof Cesium3DTileFeature) {
3840
4368
  visual.color = cColor;
@@ -5038,6 +5566,163 @@ var TilesetArbRenderManager;
5038
5566
  TilesetArbRenderManager.Manager = Manager;
5039
5567
  })(TilesetArbRenderManager || (TilesetArbRenderManager = {}));
5040
5568
 
5569
+ var RelationsRenderManager;
5570
+ (function (RelationsRenderManager) {
5571
+ var Manager = /** @class */ (function () {
5572
+ function Manager(params) {
5573
+ this.disposed = false;
5574
+ var apiGetter = params.apiGetter, item = params.item, register = params.register, viewer = params.viewer;
5575
+ this.apiGetter = apiGetter;
5576
+ this.item = item;
5577
+ this.register = register;
5578
+ this.viewer = viewer;
5579
+ }
5580
+ Object.defineProperty(Manager.prototype, "Disposed", {
5581
+ get: function () {
5582
+ return this.disposed;
5583
+ },
5584
+ enumerable: false,
5585
+ configurable: true
5586
+ });
5587
+ Manager.prototype.Init = function () {
5588
+ var _a;
5589
+ return __awaiter(this, void 0, void 0, function () {
5590
+ var drawn, api, BATCH_SIZE, drawBatch, i, entityId, relations, _loop_1, this_1, j;
5591
+ return __generator(this, function (_b) {
5592
+ switch (_b.label) {
5593
+ case 0:
5594
+ drawn = [];
5595
+ api = this.apiGetter.getApi(this.apiGetter.accountId);
5596
+ BATCH_SIZE = 5;
5597
+ drawBatch = [];
5598
+ i = 0;
5599
+ _b.label = 1;
5600
+ case 1:
5601
+ if (!(i < this.item.BruceEntity.EntityIds.length)) return [3 /*break*/, 4];
5602
+ entityId = this.item.BruceEntity.EntityIds[i];
5603
+ return [4 /*yield*/, EntityRelation.GetList({
5604
+ api: api,
5605
+ entityId: entityId,
5606
+ filter: {
5607
+ oneWayOnly: false,
5608
+ loadEntityData: false
5609
+ }
5610
+ })];
5611
+ case 2:
5612
+ relations = (_b.sent()).relations;
5613
+ _loop_1 = function (j) {
5614
+ var relation = relations[j];
5615
+ if (((_a = this_1.item.relationTypeIds) === null || _a === void 0 ? void 0 : _a.length) && !this_1.item.relationTypeIds.includes(relation["Relation.Type.ID"])) {
5616
+ return "continue";
5617
+ }
5618
+ var key = RelationRenderEngine.GetRenderGroupId(relation);
5619
+ if (!drawn.find(function (x) { return x == key; })) {
5620
+ drawn.push(key);
5621
+ drawBatch.push(relation);
5622
+ if (drawBatch.length >= BATCH_SIZE) {
5623
+ this_1.onGetterUpdate(drawBatch);
5624
+ drawBatch = [];
5625
+ }
5626
+ }
5627
+ };
5628
+ this_1 = this;
5629
+ for (j = 0; j < relations.length; j++) {
5630
+ _loop_1(j);
5631
+ }
5632
+ _b.label = 3;
5633
+ case 3:
5634
+ i++;
5635
+ return [3 /*break*/, 1];
5636
+ case 4:
5637
+ if (drawBatch === null || drawBatch === void 0 ? void 0 : drawBatch.length) {
5638
+ this.onGetterUpdate(drawBatch);
5639
+ }
5640
+ return [2 /*return*/];
5641
+ }
5642
+ });
5643
+ });
5644
+ };
5645
+ Manager.prototype.Dispose = function () {
5646
+ if (this.disposed) {
5647
+ return;
5648
+ }
5649
+ this.disposed = true;
5650
+ this.register.RemoveRegos({
5651
+ menuItemId: this.item.id
5652
+ });
5653
+ };
5654
+ Manager.prototype.ReRender = function (entityIds) {
5655
+ return __awaiter(this, void 0, void 0, function () {
5656
+ return __generator(this, function (_a) {
5657
+ return [2 /*return*/];
5658
+ });
5659
+ });
5660
+ };
5661
+ Manager.prototype.onGetterUpdate = function (relations) {
5662
+ var _a, _b;
5663
+ return __awaiter(this, void 0, void 0, function () {
5664
+ var cEntities, i, relation, key, cEntity, visual, e_1;
5665
+ return __generator(this, function (_c) {
5666
+ switch (_c.label) {
5667
+ case 0:
5668
+ _c.trys.push([0, 2, , 3]);
5669
+ if (this.disposed || this.viewer.isDestroyed()) {
5670
+ return [2 /*return*/];
5671
+ }
5672
+ return [4 /*yield*/, RelationRenderEngine.Render({
5673
+ apiGetter: this.apiGetter,
5674
+ menuItemId: this.item.id,
5675
+ relations: relations,
5676
+ viewer: this.viewer,
5677
+ visualRegister: this.register
5678
+ })];
5679
+ case 1:
5680
+ cEntities = _c.sent();
5681
+ for (i = 0; i < relations.length; i++) {
5682
+ relation = relations[i];
5683
+ key = RelationRenderEngine.GetRenderGroupId(relation);
5684
+ cEntity = cEntities[key];
5685
+ if (cEntity) {
5686
+ visual = (_a = this.register.GetRego({
5687
+ entityId: key,
5688
+ menuItemId: this.item.id
5689
+ })) === null || _a === void 0 ? void 0 : _a.visual;
5690
+ if (!visual || visual != cEntity) {
5691
+ this.register.AddRego({
5692
+ rego: {
5693
+ entityId: (_b = relation["Data.Entity.ID"]) !== null && _b !== void 0 ? _b : ObjectUtils.UId(),
5694
+ menuItemId: this.item.id,
5695
+ relation: relation,
5696
+ visual: cEntity,
5697
+ priority: 0,
5698
+ accountId: this.apiGetter.accountId
5699
+ }
5700
+ });
5701
+ }
5702
+ }
5703
+ else {
5704
+ this.register.RemoveRegos({
5705
+ entityId: relation["Data.Entity.ID"],
5706
+ relation: relation,
5707
+ menuItemId: this.item.id
5708
+ });
5709
+ }
5710
+ }
5711
+ return [3 /*break*/, 3];
5712
+ case 2:
5713
+ e_1 = _c.sent();
5714
+ console.error(e_1);
5715
+ return [3 /*break*/, 3];
5716
+ case 3: return [2 /*return*/];
5717
+ }
5718
+ });
5719
+ });
5720
+ };
5721
+ return Manager;
5722
+ }());
5723
+ RelationsRenderManager.Manager = Manager;
5724
+ })(RelationsRenderManager || (RelationsRenderManager = {}));
5725
+
5041
5726
  /**
5042
5727
  * Utility to keep track of enabled menu items within a Cesium viewer.
5043
5728
  */
@@ -5195,6 +5880,14 @@ var MenuItemManager;
5195
5880
  register: this.visualsRegister
5196
5881
  });
5197
5882
  break;
5883
+ case MenuItem.EType.Relations:
5884
+ rItem.renderManager = new RelationsRenderManager.Manager({
5885
+ apiGetter: params.apiGetter,
5886
+ item: params.item,
5887
+ register: this.visualsRegister,
5888
+ viewer: this.viewer
5889
+ });
5890
+ break;
5198
5891
  // Any "none" type can be ignored. These are just containers for other items.
5199
5892
  case MenuItem.EType.None:
5200
5893
  break;
@@ -7094,5 +7787,5 @@ var ViewUtils;
7094
7787
  ViewUtils.GatherTerrainTile = GatherTerrainTile;
7095
7788
  })(ViewUtils || (ViewUtils = {}));
7096
7789
 
7097
- export { CesiumViewMonitor, ViewerUtils, MenuItemManager, EntityRenderEngine, MenuItemCreator, VisualsRegister, RenderManager, EntitiesIdsRenderManager, EntitiesLoadedRenderManager, EntitiesRenderManager, EntityRenderManager, TilesetCadRenderManager, ViewRenderEngine, TileRenderEngine, TilesetRenderEngine, SharedGetters, ViewUtils, DrawingUtils, MeasureUtils, EntityUtils };
7790
+ export { CesiumViewMonitor, ViewerUtils, MenuItemManager, EntityRenderEngine, MenuItemCreator, VisualsRegister, RenderManager, EntitiesIdsRenderManager, EntitiesLoadedRenderManager, EntitiesRenderManager, EntityRenderManager, TilesetCadRenderManager, ViewRenderEngine, TileRenderEngine, TilesetRenderEngine, SharedGetters, ViewUtils, DrawingUtils, MeasureUtils, EntityUtils, CesiumParabola };
7098
7791
  //# sourceMappingURL=bruce-cesium.es5.js.map