@mapless/core 0.1.0 → 1.0.7

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/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { area as turf_area, center as turf_center, centroid, circle, distance as turf_distance, ellipse, length as turf_length, pointsWithinPolygon, polygon as turf_polygon } from "@turf/turf";
2
2
  import mapbox_gl, { LngLat, MapMouseEvent, Marker, MercatorCoordinate, Popup } from "mapbox-gl";
3
- import { AmbientLight, AnimationMixer, BoxGeometry, BufferGeometry, CatmullRomCurve3, Clock, Color, ConeGeometry, CurvePath, CylinderGeometry, DirectionalLight, DoubleSide, Group, Line, LineBasicMaterial, LineCurve3, LoopRepeat, Matrix4, Mesh, MeshBasicMaterial, PerspectiveCamera, PointLight, Scene, SphereGeometry, SpotLight, TorusGeometry, TubeGeometry, Vector3, WebGLRenderer } from "three";
3
+ import { AmbientLight, AnimationMixer, BoxGeometry, BoxHelper, BufferGeometry, CatmullRomCurve3, Clock, Color, ConeGeometry, CurvePath, CylinderGeometry, DirectionalLight, DoubleSide, Group, Line, LineBasicMaterial, LineCurve3, LoopRepeat, Matrix4, Mesh, MeshBasicMaterial, PerspectiveCamera, PointLight, Scene, SphereGeometry, SpotLight, TorusGeometry, TubeGeometry, Vector3, WebGLRenderer } from "three";
4
4
  import gcoord from "gcoord";
5
5
  import mapbox_gl_draw from "@mapbox/mapbox-gl-draw";
6
6
  import "@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css";
@@ -832,6 +832,7 @@ const mona_loading_default_namespaceObject = "data:image/gif;base64,R0lGODlhgAGA
832
832
  const center_namespaceObject = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjIxMTZBRkZCNkJFRDExRUY4RTc4ODI1OTI5RDg2NEIzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjIxMTZBRkZDNkJFRDExRUY4RTc4ODI1OTI5RDg2NEIzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MjExNkFGRjk2QkVEMTFFRjhFNzg4MjU5MjlEODY0QjMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MjExNkFGRkE2QkVEMTFFRjhFNzg4MjU5MjlEODY0QjMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7kzyMtAAAGuElEQVR42uxd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";
833
833
  const fly_namespaceObject = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFGODkyQTNFNkJFRDExRUZCQzQzOTRDMjJCMTlEMDU3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjFGODkyQTNGNkJFRDExRUZCQzQzOTRDMjJCMTlEMDU3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MUY4OTJBM0M2QkVEMTFFRkJDNDM5NEMyMkIxOUQwNTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MUY4OTJBM0Q2QkVEMTFFRkJDNDM5NEMyMkIxOUQwNTciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6Kn+fFAAAJmElEQVR42uxd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";
834
834
  const car_namespaceObject = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFFQjNCNEQ4NkJFRDExRUY5RDFCQzVGRTFERTM5QURDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjFFQjNCNEQ5NkJFRDExRUY5RDFCQzVGRTFERTM5QURDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MUVCM0I0RDY2QkVEMTFFRjlEMUJDNUZFMURFMzlBREMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MUVCM0I0RDc2QkVEMTFFRjlEMUJDNUZFMURFMzlBREMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4N8EJcAAAKr0lEQVR42uxd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";
835
+ const controller_namespaceObject = "data:image/png;base64,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";
835
836
  const flight_namespaceObject = "data:image/png;base64,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";
836
837
  const ship_namespaceObject = "data:image/png;base64,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";
837
838
  const circle_namespaceObject = "data:image/png;base64,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";
@@ -879,7 +880,8 @@ const icons = {
879
880
  mobileRect: mobile_rect_namespaceObject,
880
881
  otherCircle: other_circle_namespaceObject,
881
882
  movableRect: movable_rect_namespaceObject,
882
- portableRect: portable_rect_namespaceObject
883
+ portableRect: portable_rect_namespaceObject,
884
+ controllerRect: controller_namespaceObject
883
885
  };
884
886
  const borderIcon = {
885
887
  circle: {
@@ -13925,8 +13927,8 @@ class MovableManager extends EmitManager {
13925
13927
  ],
13926
13928
  true
13927
13929
  ],
13928
- 6,
13929
- 5
13930
+ 10,
13931
+ 8
13930
13932
  ],
13931
13933
  'circle-color': stateColorRule,
13932
13934
  'circle-stroke-width': [
@@ -14511,6 +14513,7 @@ class NewStationManager extends EmitManager {
14511
14513
  'portable',
14512
14514
  'movable'
14513
14515
  ].includes(station.category?.toLowerCase())) return station.category?.toLowerCase() || '';
14516
+ if (station.category && 'controller' === station.category.toLowerCase()) return 'controller';
14514
14517
  return 'other';
14515
14518
  };
14516
14519
  getFeatures = (stations)=>stations.filter((station)=>{
@@ -16425,36 +16428,26 @@ const getTrack = (mapless, name)=>mapless?.get(TrackManager, name);
16425
16428
  const detachTrack = (mapless, name)=>mapless?.unuse(TrackManager, name);
16426
16429
  class AirspaceManager extends manager_Manager {
16427
16430
  zones = {};
16428
- config;
16431
+ config = {
16432
+ opacity: 0.3,
16433
+ defaultColor: '#4a90e2',
16434
+ defaultEdgeColor: '#ff00ff',
16435
+ defaultEdgeOpacity: 0.8,
16436
+ defaultEdgeWidth: 2,
16437
+ defaultMinAltitude: 0,
16438
+ defaultMaxAltitude: 1000,
16439
+ defaultFillColor: 'rgba(74, 144, 226, 0.3)',
16440
+ defaultFillOpacity: 0.3
16441
+ };
16429
16442
  originalProperties = {};
16430
16443
  constructor(mapless, options){
16431
16444
  super(mapless, options, 'airspace');
16432
- this.config = {
16433
- minAltitude: 0,
16434
- maxAltitude: 1000,
16435
- color: 0x4a90e2,
16436
- opacity: 0.3,
16437
- edgeColor: 0xff00ff,
16438
- edgeOpacity: 0.8,
16439
- edgeWidth: 2
16440
- };
16441
16445
  this.onInitialized();
16442
16446
  }
16443
- setConfig(config) {
16444
- this.config = {
16445
- minAltitude: config.minAltitude ?? this.config.minAltitude,
16446
- maxAltitude: config.maxAltitude ?? this.config.maxAltitude,
16447
- color: config.color ?? this.config.color,
16448
- opacity: config.opacity ?? this.config.opacity,
16449
- edgeColor: config.edgeColor ?? this.config.edgeColor,
16450
- edgeOpacity: config.edgeOpacity ?? this.config.edgeOpacity,
16451
- edgeWidth: config.edgeWidth ?? this.config.edgeWidth
16452
- };
16453
- if (this.map && this.idHub?.lineLayerId) {
16454
- this.map.setPaintProperty(this.idHub.lineLayerId, 'line-color', this.numberToColor(this.config.edgeColor));
16455
- this.map.setPaintProperty(this.idHub.lineLayerId, 'line-opacity', this.config.edgeOpacity);
16456
- this.map.setPaintProperty(this.idHub.lineLayerId, 'line-width', this.config.edgeWidth);
16457
- this.map.setPaintProperty(this.idHub.fillLayerId, 'fill-extrusion-opacity', this.config.opacity);
16447
+ setConfig(options) {
16448
+ if (void 0 !== options.opacity) {
16449
+ this.config.opacity = options.opacity;
16450
+ if (this.map && this.idHub?.fillLayerId) this.map.setPaintProperty(this.idHub.fillLayerId, 'fill-extrusion-opacity', this.config.opacity);
16458
16451
  }
16459
16452
  }
16460
16453
  handleCoordSystemChange(_system) {
@@ -16467,6 +16460,7 @@ class AirspaceManager extends manager_Manager {
16467
16460
  const newHub = new core_IdHub({
16468
16461
  layers: {
16469
16462
  fillLayerId: 'dzmap-airspace-fill-layer',
16463
+ fill2DLayerId: 'dzmap-airspace-fill-2d-layer',
16470
16464
  lineLayerId: 'dzmap-airspace-line-layer'
16471
16465
  },
16472
16466
  sources: {
@@ -16479,14 +16473,38 @@ class AirspaceManager extends manager_Manager {
16479
16473
  if (!this.mapless) return;
16480
16474
  const sid = this.idHub?.sourceId;
16481
16475
  this.mapless.addEmptySource(sid);
16476
+ this.mapless.addLayer({
16477
+ id: this.idHub?.fill2DLayerId,
16478
+ type: 'fill',
16479
+ source: sid,
16480
+ paint: {
16481
+ 'fill-color': [
16482
+ 'get',
16483
+ 'fillColor'
16484
+ ],
16485
+ 'fill-opacity': [
16486
+ 'get',
16487
+ 'fillOpacity'
16488
+ ]
16489
+ }
16490
+ });
16482
16491
  this.mapless.addLayer({
16483
16492
  id: this.idHub?.lineLayerId,
16484
16493
  type: 'line',
16485
16494
  source: sid,
16486
16495
  paint: {
16487
- 'line-color': this.numberToColor(this.config.edgeColor),
16488
- 'line-opacity': this.config.edgeOpacity,
16489
- 'line-width': this.config.edgeWidth
16496
+ 'line-color': [
16497
+ 'get',
16498
+ 'edgeColor'
16499
+ ],
16500
+ 'line-opacity': [
16501
+ 'get',
16502
+ 'edgeOpacity'
16503
+ ],
16504
+ 'line-width': [
16505
+ 'get',
16506
+ 'edgeWidth'
16507
+ ]
16490
16508
  }
16491
16509
  });
16492
16510
  this.mapless.addLayer({
@@ -16498,7 +16516,7 @@ class AirspaceManager extends manager_Manager {
16498
16516
  'get',
16499
16517
  'color'
16500
16518
  ],
16501
- 'fill-extrusion-opacity': this.config.opacity || 0,
16519
+ 'fill-extrusion-opacity': this.config.opacity,
16502
16520
  'fill-extrusion-height': [
16503
16521
  'get',
16504
16522
  'maxAltitude'
@@ -16510,15 +16528,11 @@ class AirspaceManager extends manager_Manager {
16510
16528
  }
16511
16529
  });
16512
16530
  }
16513
- numberToColor(num) {
16514
- return `#${num.toString(16).padStart(6, '0')}`;
16515
- }
16516
16531
  generateId() {
16517
16532
  return `airspace-${Object.keys(this.zones).length}`;
16518
16533
  }
16519
16534
  drawZone(id, options) {
16520
- const { name = '', geometry, minAltitude = this.config.minAltitude, maxAltitude = this.config.maxAltitude, color = this.config.color, opacity = this.config.opacity } = options;
16521
- const zoneColor = this.numberToColor(color);
16535
+ const { name = '', geometry, minAltitude = this.config.defaultMinAltitude, maxAltitude = this.config.defaultMaxAltitude, color = this.config.defaultColor, edgeColor = this.config.defaultEdgeColor, edgeOpacity = this.config.defaultEdgeOpacity, edgeWidth = this.config.defaultEdgeWidth, fillColor = this.config.defaultFillColor, fillOpacity = this.config.defaultFillOpacity } = options;
16522
16536
  const feature = {
16523
16537
  type: 'Feature',
16524
16538
  geometry: {
@@ -16530,8 +16544,12 @@ class AirspaceManager extends manager_Manager {
16530
16544
  name,
16531
16545
  minAltitude,
16532
16546
  maxAltitude,
16533
- color: zoneColor,
16534
- opacity
16547
+ color,
16548
+ edgeColor,
16549
+ edgeOpacity,
16550
+ edgeWidth,
16551
+ fillColor,
16552
+ fillOpacity
16535
16553
  }
16536
16554
  };
16537
16555
  this.zones[id] = {
@@ -16541,20 +16559,38 @@ class AirspaceManager extends manager_Manager {
16541
16559
  minAltitude,
16542
16560
  maxAltitude,
16543
16561
  color,
16544
- opacity,
16562
+ edgeColor,
16563
+ edgeOpacity,
16564
+ edgeWidth,
16565
+ fillColor,
16566
+ fillOpacity,
16545
16567
  feature
16546
16568
  };
16547
16569
  this.originalProperties[id] = {
16548
- color,
16549
- opacity
16570
+ color
16550
16571
  };
16551
16572
  this.updateSource();
16552
16573
  }
16553
16574
  updateSource() {
16554
- this.mapless?.setData(this.idHub?.sourceId, {
16575
+ const featureCollection = {
16555
16576
  type: 'FeatureCollection',
16556
16577
  features: Object.values(this.zones).map((z)=>z.feature)
16557
- });
16578
+ };
16579
+ this.mapless?.setData(this.idHub?.sourceId, featureCollection);
16580
+ if (this.map && this.idHub?.lineLayerId && Object.keys(this.zones).length > 0) {
16581
+ this.map.setPaintProperty(this.idHub.lineLayerId, 'line-color', [
16582
+ 'get',
16583
+ 'edgeColor'
16584
+ ]);
16585
+ this.map.setPaintProperty(this.idHub.lineLayerId, 'line-opacity', [
16586
+ 'get',
16587
+ 'edgeOpacity'
16588
+ ]);
16589
+ this.map.setPaintProperty(this.idHub.lineLayerId, 'line-width', [
16590
+ 'get',
16591
+ 'edgeWidth'
16592
+ ]);
16593
+ }
16558
16594
  }
16559
16595
  addZone(options) {
16560
16596
  const id = options.id || this.generateId();
@@ -16575,44 +16611,36 @@ class AirspaceManager extends manager_Manager {
16575
16611
  this.originalProperties = {};
16576
16612
  this.mapless?.setEmptyData(this.idHub?.sourceId);
16577
16613
  }
16578
- updateZoneColor(id, color) {
16614
+ updateZone(id, options) {
16579
16615
  const zone = this.zones[id];
16580
16616
  if (!zone) return;
16581
- zone.color = color;
16582
- const newColor = this.numberToColor(color);
16583
- if (zone.feature.properties) zone.feature.properties.color = newColor;
16617
+ Object.assign(zone, options);
16618
+ if (zone.feature.properties) Object.assign(zone.feature.properties, options);
16619
+ if (options.color && !this.originalProperties[id]) this.originalProperties[id] = {
16620
+ color: zone.color
16621
+ };
16584
16622
  this.updateSource();
16585
16623
  }
16586
- updateZoneOpacity(id, opacity) {
16587
- const zone = this.zones[id];
16588
- if (!zone) return;
16589
- zone.opacity = opacity;
16590
- if (zone.feature.properties) zone.feature.properties.opacity = opacity;
16591
- this.updateSource();
16624
+ updateZoneColor(id, color) {
16625
+ this.updateZone(id, {
16626
+ color
16627
+ });
16592
16628
  }
16593
16629
  updateZoneAltitude(id, minAltitude, maxAltitude) {
16594
- const zone = this.zones[id];
16595
- if (!zone) return;
16596
- zone.minAltitude = minAltitude;
16597
- zone.maxAltitude = maxAltitude;
16598
- if (zone.feature.properties) {
16599
- zone.feature.properties.minAltitude = minAltitude;
16600
- zone.feature.properties.maxAltitude = maxAltitude;
16601
- }
16602
- this.updateSource();
16630
+ this.updateZone(id, {
16631
+ minAltitude,
16632
+ maxAltitude
16633
+ });
16603
16634
  }
16604
16635
  highlightZone(id, highlighted = true) {
16605
- const zone = this.zones[id];
16606
- if (!zone) return;
16607
- if (highlighted) {
16608
- this.updateZoneColor(id, 0xff0000);
16609
- this.updateZoneOpacity(id, 0.6);
16610
- } else {
16636
+ if (highlighted) this.updateZone(id, {
16637
+ color: '#ff0000'
16638
+ });
16639
+ else {
16611
16640
  const original = this.originalProperties[id];
16612
- if (original) {
16613
- this.updateZoneColor(id, original.color);
16614
- this.updateZoneOpacity(id, original.opacity);
16615
- }
16641
+ if (original) this.updateZone(id, {
16642
+ color: original.color
16643
+ });
16616
16644
  }
16617
16645
  }
16618
16646
  getZone(id) {
@@ -16798,10 +16826,18 @@ const elevatedLine = ElevatedLineManager;
16798
16826
  const attachElevatedLine = (mapless, name, options)=>mapless?.use(ElevatedLineManager, name, options);
16799
16827
  const getElevatedLine = (mapless, name)=>mapless?.get(ElevatedLineManager, name);
16800
16828
  const detachElevatedLine = (mapless, name)=>mapless?.unuse(ElevatedLineManager, name);
16801
- class MapModelManager extends manager_Manager {
16829
+ class MapModelManager extends EmitManager {
16802
16830
  models = new Map();
16803
16831
  modelCounter = 0;
16804
16832
  _idHub;
16833
+ globalClickHandler;
16834
+ selectedModelId = null;
16835
+ defaultSelectedColor = [
16836
+ 1,
16837
+ 0,
16838
+ 0
16839
+ ];
16840
+ themeColorModels = new Set();
16805
16841
  constructor(mapless, options){
16806
16842
  super(mapless, options, 'mapModel');
16807
16843
  this.map = mapless.map;
@@ -16809,11 +16845,76 @@ class MapModelManager extends manager_Manager {
16809
16845
  sources: {},
16810
16846
  layers: {}
16811
16847
  });
16812
- this.init();
16848
+ this.onInitialized();
16849
+ this.setupGlobalClickHandler();
16813
16850
  }
16814
- init() {
16815
- if (!this.map) console.warn('MapModelManager: Map not initialized');
16851
+ setupGlobalClickHandler() {
16852
+ if (!this.map) return;
16853
+ this.globalClickHandler = (e)=>{
16854
+ if (!this.map) return;
16855
+ const modelLayerIds = Array.from(this.models.values()).map((m)=>m.layerId);
16856
+ if (0 === modelLayerIds.length) return;
16857
+ const features = this.map.queryRenderedFeatures(e.point, {
16858
+ layers: modelLayerIds
16859
+ });
16860
+ if (!features || 0 === features.length) return;
16861
+ const feature = features[0];
16862
+ const layerId = feature.layer?.id;
16863
+ const modelData = Array.from(this.models.values()).find((m)=>m.layerId === layerId);
16864
+ if (modelData) {
16865
+ const clickEvent = {
16866
+ id: modelData.id,
16867
+ url: modelData.url,
16868
+ lngLat: modelData.config.position || modelData.config.lngLat || [
16869
+ 0,
16870
+ 0
16871
+ ],
16872
+ altitude: modelData.config.altitude || 0,
16873
+ rotation: modelData.config.orientation,
16874
+ scale: modelData.config.scale,
16875
+ originalEvent: e
16876
+ };
16877
+ this.emit('modelClick', clickEvent);
16878
+ }
16879
+ };
16880
+ this.map.on('click', this.globalClickHandler);
16881
+ }
16882
+ getDefaultThemeColor() {
16883
+ const isDark = this.mapless?.isDark();
16884
+ if (isDark) return [
16885
+ 68 / 255,
16886
+ 233 / 255,
16887
+ 234 / 255
16888
+ ];
16889
+ return null;
16890
+ }
16891
+ removeModelColor(id) {
16892
+ const modelData = this.models.get(id);
16893
+ if (!modelData) return;
16894
+ if (!this.map) return;
16895
+ if (this.map.getLayer(modelData.layerId)) {
16896
+ this.map.setPaintProperty(modelData.layerId, 'model-color', void 0);
16897
+ this.map.setPaintProperty(modelData.layerId, 'model-color-mix-intensity', void 0);
16898
+ }
16899
+ }
16900
+ updateAllModelsThemeColor() {
16901
+ const themeColor = this.getDefaultThemeColor();
16902
+ this.themeColorModels.forEach((modelId)=>{
16903
+ const modelData = this.models.get(modelId);
16904
+ if (!modelData) return void this.themeColorModels.delete(modelId);
16905
+ if (modelId !== this.selectedModelId) if (themeColor) this.updateModelColor(modelId, themeColor, 0.8);
16906
+ else this.removeModelColor(modelId);
16907
+ });
16816
16908
  }
16909
+ onStyleChanged = (_tag)=>{
16910
+ if (!this.map) return;
16911
+ this.updateAllModelsThemeColor();
16912
+ this.map.once('style.load', ()=>{
16913
+ setTimeout(()=>{
16914
+ this.updateAllModelsThemeColor();
16915
+ }, 100);
16916
+ });
16917
+ };
16817
16918
  generateSourceId() {
16818
16919
  const id = `dzmap-model-source-${this.modelCounter}`;
16819
16920
  this._idHub.addSource(`model-${this.modelCounter}`, id);
@@ -16841,7 +16942,6 @@ class MapModelManager extends manager_Manager {
16841
16942
  };
16842
16943
  if (materialOverrides && Object.keys(materialOverrides).length > 0) sourceConfig.models[modelId].materialOverrideNames = Object.keys(materialOverrides);
16843
16944
  if (nodeOverrides && Object.keys(nodeOverrides).length > 0) sourceConfig.models[modelId].nodeOverrideNames = Object.keys(nodeOverrides);
16844
- console.log('Adding model source:', sourceConfig);
16845
16945
  this.map.addSource(sourceId, sourceConfig);
16846
16946
  const layerConfig = {
16847
16947
  id: layerId,
@@ -16949,7 +17049,6 @@ class MapModelManager extends manager_Manager {
16949
17049
  rotationMatch.push(defaultRotation);
16950
17050
  layerConfig.paint['model-rotation'] = rotationMatch;
16951
17051
  }
16952
- console.log('Adding model layer:', layerConfig);
16953
17052
  this.map.addLayer(layerConfig);
16954
17053
  return {
16955
17054
  sourceId,
@@ -16964,34 +17063,27 @@ class MapModelManager extends manager_Manager {
16964
17063
  0
16965
17064
  ], scale = 1, materialOverrides, nodeOverrides } = options;
16966
17065
  this.removeModel(id);
16967
- try {
16968
- const mainConfig = {
16969
- uri: url,
16970
- position: lngLat,
16971
- altitude,
16972
- orientation: rotation,
16973
- scale
16974
- };
16975
- const { sourceId, layerId } = this.addSingleModel(id, mainConfig, materialOverrides, nodeOverrides);
16976
- this.models.set(id, {
16977
- id,
16978
- sourceId,
16979
- layerId,
16980
- url,
16981
- config: mainConfig,
16982
- materialOverrides,
16983
- nodeOverrides
16984
- });
16985
- console.log(`MapModel added: ${id}`, {
16986
- url,
16987
- lngLat,
16988
- altitude,
16989
- rotation,
16990
- scale
16991
- });
16992
- } catch (error) {
16993
- console.error(`Failed to add model ${id}:`, error);
16994
- throw error;
17066
+ const mainConfig = {
17067
+ uri: url,
17068
+ position: lngLat,
17069
+ altitude,
17070
+ orientation: rotation,
17071
+ scale
17072
+ };
17073
+ const { sourceId, layerId } = this.addSingleModel(id, mainConfig, materialOverrides, nodeOverrides);
17074
+ this.models.set(id, {
17075
+ id,
17076
+ sourceId,
17077
+ layerId,
17078
+ url,
17079
+ config: mainConfig,
17080
+ materialOverrides,
17081
+ nodeOverrides
17082
+ });
17083
+ if (!materialOverrides || 0 === Object.keys(materialOverrides).length) {
17084
+ this.themeColorModels.add(id);
17085
+ const themeColor = this.getDefaultThemeColor();
17086
+ if (themeColor) this.updateModelColor(id, themeColor, 0.8);
16995
17087
  }
16996
17088
  }
16997
17089
  addModels(models) {
@@ -17001,7 +17093,7 @@ class MapModelManager extends manager_Manager {
17001
17093
  }
17002
17094
  updateModelPosition(id, lngLat, altitude = 0) {
17003
17095
  const modelData = this.models.get(id);
17004
- if (!modelData) return void console.warn(`Model with id "${id}" not found`);
17096
+ if (!modelData) return;
17005
17097
  if (!this.map) return;
17006
17098
  const source = this.map.getSource(modelData.sourceId);
17007
17099
  if (source?.models?.[id]) {
@@ -17013,25 +17105,18 @@ class MapModelManager extends manager_Manager {
17013
17105
  0,
17014
17106
  altitude
17015
17107
  ]);
17016
- console.log(`MapModel position updated: ${id}`, {
17017
- lngLat,
17018
- altitude
17019
- });
17020
17108
  }
17021
17109
  updateModelRotation(id, rotation) {
17022
17110
  const modelData = this.models.get(id);
17023
- if (!modelData) return void console.warn(`Model with id "${id}" not found`);
17111
+ if (!modelData) return;
17024
17112
  if (!this.map) return;
17025
17113
  const source = this.map.getSource(modelData.sourceId);
17026
17114
  if (source?.models?.[id]) source.models[id].orientation = rotation;
17027
17115
  if (this.map.getLayer(modelData.layerId)) this.map.setPaintProperty(modelData.layerId, 'model-rotation', rotation);
17028
- console.log(`MapModel rotation updated: ${id}`, {
17029
- rotation
17030
- });
17031
17116
  }
17032
17117
  updateModelScale(id, scale) {
17033
17118
  const modelData = this.models.get(id);
17034
- if (!modelData) return void console.warn(`Model with id "${id}" not found`);
17119
+ if (!modelData) return;
17035
17120
  if (!this.map) return;
17036
17121
  const source = this.map.getSource(modelData.sourceId);
17037
17122
  if (source?.models?.[id]) source.models[id].scale = scale;
@@ -17040,9 +17125,6 @@ class MapModelManager extends manager_Manager {
17040
17125
  scale,
17041
17126
  scale
17042
17127
  ]);
17043
- console.log(`MapModel scale updated: ${id}`, {
17044
- scale
17045
- });
17046
17128
  }
17047
17129
  removeModel(id) {
17048
17130
  const modelData = this.models.get(id);
@@ -17051,7 +17133,8 @@ class MapModelManager extends manager_Manager {
17051
17133
  if (this.map.getLayer(modelData.layerId)) this.map.removeLayer(modelData.layerId);
17052
17134
  if (this.map.getSource(modelData.sourceId)) this.map.removeSource(modelData.sourceId);
17053
17135
  this.models.delete(id);
17054
- console.log(`MapModel removed: ${id}`);
17136
+ this.themeColorModels.delete(id);
17137
+ if (this.selectedModelId === id) this.selectedModelId = null;
17055
17138
  }
17056
17139
  clearModels() {
17057
17140
  const modelIds = Array.from(this.models.keys());
@@ -17059,7 +17142,6 @@ class MapModelManager extends manager_Manager {
17059
17142
  this.removeModel(id);
17060
17143
  });
17061
17144
  this.models.clear();
17062
- console.log('All MapModels cleared');
17063
17145
  }
17064
17146
  getModelCount() {
17065
17147
  return this.models.size;
@@ -17070,7 +17152,40 @@ class MapModelManager extends manager_Manager {
17070
17152
  getModelIds() {
17071
17153
  return Array.from(this.models.keys());
17072
17154
  }
17155
+ updateModelColor(id, color, intensity = 1) {
17156
+ const modelData = this.models.get(id);
17157
+ if (!modelData) return;
17158
+ if (!this.map) return;
17159
+ if (this.map.getLayer(modelData.layerId)) {
17160
+ this.map.setPaintProperty(modelData.layerId, 'model-color', `rgb(${255 * color[0]}, ${255 * color[1]}, ${255 * color[2]})`);
17161
+ this.map.setPaintProperty(modelData.layerId, 'model-color-mix-intensity', intensity);
17162
+ }
17163
+ }
17164
+ setDefaultSelectedColor(color) {
17165
+ this.defaultSelectedColor = color;
17166
+ }
17167
+ getSelectedModelId() {
17168
+ return this.selectedModelId;
17169
+ }
17170
+ selectModel(id, color) {
17171
+ const previousId = this.selectedModelId;
17172
+ const selectColor = color || this.defaultSelectedColor;
17173
+ if (previousId && previousId !== id) if (this.themeColorModels.has(previousId)) {
17174
+ const themeColor = this.getDefaultThemeColor();
17175
+ if (themeColor) this.updateModelColor(previousId, themeColor, 0.8);
17176
+ else this.removeModelColor(previousId);
17177
+ } else this.removeModelColor(previousId);
17178
+ this.selectedModelId = id;
17179
+ if (id) this.updateModelColor(id, selectColor, 1);
17180
+ this.emit('modelSelect', {
17181
+ id,
17182
+ previousId
17183
+ });
17184
+ }
17073
17185
  destroy() {
17186
+ if (this.map && this.globalClickHandler) this.map.off('click', this.globalClickHandler);
17187
+ this.selectedModelId = null;
17188
+ this.themeColorModels.clear();
17074
17189
  this.clearModels();
17075
17190
  }
17076
17191
  }
@@ -17632,11 +17747,6 @@ class Line2Manager extends manager_Manager {
17632
17747
  points: config.points,
17633
17748
  transform
17634
17749
  });
17635
- console.log(`Line2 added: ${id}`, {
17636
- pointsCount: config.points.length,
17637
- linewidth: lineConfig.linewidth,
17638
- color: lineConfig.color
17639
- });
17640
17750
  }
17641
17751
  addLines(lines) {
17642
17752
  lines.forEach((line)=>{
@@ -18168,6 +18278,18 @@ class ThreeManager extends manager_Manager {
18168
18278
  scale: 1
18169
18279
  };
18170
18280
  userScale = 1;
18281
+ baseRotation = [
18282
+ 0,
18283
+ 0,
18284
+ 0
18285
+ ];
18286
+ currentOrientation = {
18287
+ heading: 0,
18288
+ pitch: 0,
18289
+ roll: 0
18290
+ };
18291
+ boxHelper = null;
18292
+ isSelected = false;
18171
18293
  constructor(mapless){
18172
18294
  super(mapless);
18173
18295
  this.map = mapless.map;
@@ -18210,17 +18332,23 @@ class ThreeManager extends manager_Manager {
18210
18332
  }
18211
18333
  });
18212
18334
  this.userScale = scale;
18335
+ this.baseRotation = [
18336
+ ...rotation
18337
+ ];
18213
18338
  const modelAsMercator = mapbox_gl.MercatorCoordinate.fromLngLat(lngLat, altitude);
18214
18339
  this.modelTransform = {
18215
18340
  translateX: modelAsMercator.x,
18216
18341
  translateY: modelAsMercator.y,
18217
18342
  translateZ: modelAsMercator.z,
18218
- rotateX: rotation[0],
18219
- rotateY: rotation[1],
18220
- rotateZ: rotation[2],
18221
18343
  scale: modelAsMercator.meterInMercatorCoordinateUnits() * scale
18222
18344
  };
18345
+ this.currentOrientation = {
18346
+ heading: 0,
18347
+ pitch: 0,
18348
+ roll: 0
18349
+ };
18223
18350
  mapThree.addRenderableObject(this.modelId, this.model, this.modelTransform);
18351
+ this._applyBaseRotation();
18224
18352
  this.animations = gltf.animations || [];
18225
18353
  if (this.animations.length > 0) {
18226
18354
  this.mixer = new AnimationMixer(gltf.scene);
@@ -18253,6 +18381,21 @@ class ThreeManager extends manager_Manager {
18253
18381
  this.currentAction = action;
18254
18382
  console.log(`Playing animation: ${animationName}`);
18255
18383
  }
18384
+ stopAnimation() {
18385
+ if (!this.mixer || !this.currentAction) return void console.warn('No animation to stop');
18386
+ this.currentAction.stop();
18387
+ console.log('Animation stopped');
18388
+ }
18389
+ pauseAnimation() {
18390
+ if (!this.currentAction) return void console.warn('No animation to pause');
18391
+ this.currentAction.paused = true;
18392
+ console.log('Animation paused');
18393
+ }
18394
+ resumeAnimation() {
18395
+ if (!this.currentAction) return void console.warn('No animation to resume');
18396
+ this.currentAction.paused = false;
18397
+ console.log('Animation resumed');
18398
+ }
18256
18399
  updatePosition(lngLat, altitude = 0) {
18257
18400
  const mapThree = this.getMapThree();
18258
18401
  if (!mapThree || !this.model) return;
@@ -18261,8 +18404,98 @@ class ThreeManager extends manager_Manager {
18261
18404
  this.modelTransform.translateY = modelAsMercator.y;
18262
18405
  this.modelTransform.translateZ = modelAsMercator.z;
18263
18406
  this.modelTransform.scale = modelAsMercator.meterInMercatorCoordinateUnits() * this.userScale;
18407
+ this._buildFullTransformMatrix(this.currentOrientation.heading, this.currentOrientation.pitch, this.currentOrientation.roll);
18408
+ }
18409
+ _applyBaseRotation() {
18410
+ const mapThree = this.getMapThree();
18411
+ if (!mapThree || !this.model) return;
18412
+ const fullTransform = new Matrix4();
18413
+ fullTransform.makeTranslation(this.modelTransform.translateX, this.modelTransform.translateY, this.modelTransform.translateZ);
18414
+ const scaleVec = new Vector3(this.modelTransform.scale, -this.modelTransform.scale, this.modelTransform.scale);
18415
+ fullTransform.scale(scaleVec);
18416
+ const baseRotationMatrix = new Matrix4();
18417
+ if (0 !== this.baseRotation[0]) baseRotationMatrix.multiply(new Matrix4().makeRotationX(this.baseRotation[0]));
18418
+ if (0 !== this.baseRotation[1]) baseRotationMatrix.multiply(new Matrix4().makeRotationY(this.baseRotation[1]));
18419
+ if (0 !== this.baseRotation[2]) baseRotationMatrix.multiply(new Matrix4().makeRotationZ(this.baseRotation[2]));
18420
+ const headingRad = -this.currentOrientation.heading * Math.PI / 180;
18421
+ const pitchRad = this.currentOrientation.pitch * Math.PI / 180;
18422
+ const rollRad = this.currentOrientation.roll * Math.PI / 180;
18423
+ const headingMatrix = new Matrix4().makeRotationZ(headingRad);
18424
+ const pitchMatrix = new Matrix4().makeRotationX(pitchRad);
18425
+ const rollMatrix = new Matrix4().makeRotationY(rollRad);
18426
+ const orientationMatrix = new Matrix4();
18427
+ orientationMatrix.multiply(rollMatrix).multiply(pitchMatrix).multiply(headingMatrix);
18428
+ const fullRotation = new Matrix4();
18429
+ fullRotation.multiply(orientationMatrix).multiply(baseRotationMatrix);
18430
+ fullTransform.multiply(fullRotation);
18431
+ this.modelTransform.matrix = fullTransform;
18432
+ this.modelTransform.rotateX = void 0;
18433
+ this.modelTransform.rotateY = void 0;
18434
+ this.modelTransform.rotateZ = void 0;
18435
+ mapThree.updateRenderableObjectTransform(this.modelId, this.modelTransform);
18436
+ }
18437
+ _buildFullTransformMatrix(heading, pitch, roll) {
18438
+ const mapThree = this.getMapThree();
18439
+ if (!mapThree || !this.model) return;
18440
+ this.currentOrientation = {
18441
+ heading,
18442
+ pitch,
18443
+ roll
18444
+ };
18445
+ const fullTransform = new Matrix4();
18446
+ fullTransform.makeTranslation(this.modelTransform.translateX, this.modelTransform.translateY, this.modelTransform.translateZ);
18447
+ const scaleVec = new Vector3(this.modelTransform.scale, -this.modelTransform.scale, this.modelTransform.scale);
18448
+ fullTransform.scale(scaleVec);
18449
+ const baseRotationMatrix = new Matrix4();
18450
+ if (0 !== this.baseRotation[0]) baseRotationMatrix.multiply(new Matrix4().makeRotationX(this.baseRotation[0]));
18451
+ if (0 !== this.baseRotation[1]) baseRotationMatrix.multiply(new Matrix4().makeRotationY(this.baseRotation[1]));
18452
+ if (0 !== this.baseRotation[2]) baseRotationMatrix.multiply(new Matrix4().makeRotationZ(this.baseRotation[2]));
18453
+ const headingRad = -heading * Math.PI / 180;
18454
+ const pitchRad = pitch * Math.PI / 180;
18455
+ const rollRad = roll * Math.PI / 180;
18456
+ const headingMatrix = new Matrix4().makeRotationZ(headingRad);
18457
+ const pitchMatrix = new Matrix4().makeRotationX(pitchRad);
18458
+ const rollMatrix = new Matrix4().makeRotationY(rollRad);
18459
+ const orientationMatrix = new Matrix4();
18460
+ orientationMatrix.multiply(rollMatrix).multiply(pitchMatrix).multiply(headingMatrix);
18461
+ const fullRotation = new Matrix4();
18462
+ fullRotation.multiply(orientationMatrix).multiply(baseRotationMatrix);
18463
+ fullTransform.multiply(fullRotation);
18464
+ this.modelTransform.matrix = fullTransform;
18465
+ this.modelTransform.rotateX = void 0;
18466
+ this.modelTransform.rotateY = void 0;
18467
+ this.modelTransform.rotateZ = void 0;
18264
18468
  mapThree.updateRenderableObjectTransform(this.modelId, this.modelTransform);
18265
18469
  }
18470
+ setRotation(rotation) {
18471
+ const mapThree = this.getMapThree();
18472
+ if (!mapThree || !this.model) return;
18473
+ this.modelTransform.rotateX = rotation[0];
18474
+ this.modelTransform.rotateY = rotation[1];
18475
+ this.modelTransform.rotateZ = rotation[2];
18476
+ mapThree.updateRenderableObjectTransform(this.modelId, this.modelTransform);
18477
+ }
18478
+ setOrientation(heading, pitch, roll) {
18479
+ this._buildFullTransformMatrix(heading, pitch, roll);
18480
+ }
18481
+ resetToBaseOrientation() {
18482
+ this.currentOrientation = {
18483
+ heading: 0,
18484
+ pitch: 0,
18485
+ roll: 0
18486
+ };
18487
+ this._applyBaseRotation();
18488
+ }
18489
+ getBaseRotation() {
18490
+ return [
18491
+ ...this.baseRotation
18492
+ ];
18493
+ }
18494
+ getOrientation() {
18495
+ return {
18496
+ ...this.currentOrientation
18497
+ };
18498
+ }
18266
18499
  enable() {
18267
18500
  const mapThree = this.getMapThree();
18268
18501
  if (mapThree) mapThree.setRenderableObjectVisible(this.modelId, true);
@@ -18271,7 +18504,39 @@ class ThreeManager extends manager_Manager {
18271
18504
  const mapThree = this.getMapThree();
18272
18505
  if (mapThree) mapThree.setRenderableObjectVisible(this.modelId, false);
18273
18506
  }
18507
+ select() {
18508
+ if (!this.model || this.isSelected) return;
18509
+ this.boxHelper = new BoxHelper(this.model, 0xffff00);
18510
+ this.model.add(this.boxHelper);
18511
+ this.isSelected = true;
18512
+ this._updateBoxHelper();
18513
+ }
18514
+ deselect() {
18515
+ if (!this.isSelected || !this.boxHelper) return;
18516
+ if (this.model) this.model.remove(this.boxHelper);
18517
+ this.boxHelper = null;
18518
+ this.isSelected = false;
18519
+ }
18520
+ toggleSelect() {
18521
+ if (this.isSelected) this.deselect();
18522
+ else this.select();
18523
+ }
18524
+ setSelectionColor(color) {
18525
+ if (this.boxHelper) {
18526
+ const boxColor = 'string' == typeof color ? new Color(color) : color;
18527
+ const material = this.boxHelper.material;
18528
+ if (material) material.color.set(boxColor);
18529
+ }
18530
+ }
18531
+ getSelected() {
18532
+ return this.isSelected;
18533
+ }
18534
+ _updateBoxHelper() {
18535
+ if (!this.boxHelper || !this.model) return;
18536
+ this.boxHelper.update();
18537
+ }
18274
18538
  dispose() {
18539
+ this.deselect();
18275
18540
  const mapThree = this.getMapThree();
18276
18541
  if (mapThree && this.modelId) mapThree.removeRenderableObject(this.modelId);
18277
18542
  this.model = null;
@@ -19549,6 +19814,8 @@ class ClickStrategy extends PathCollectionStrategy {
19549
19814
  onStopCollection() {
19550
19815
  if (!this.map) return;
19551
19816
  this.map.getCanvas().style.cursor = '';
19817
+ this.clearPoints();
19818
+ this.updateLayers();
19552
19819
  }
19553
19820
  handleClick = (e)=>{
19554
19821
  if (!this.isActive) return void console.log('[ClickStrategy] Click ignored, not active');
@@ -19709,6 +19976,9 @@ class FreeStrategy extends PathCollectionStrategy {
19709
19976
  if (!this.map) return;
19710
19977
  this.map.getCanvas().style.cursor = '';
19711
19978
  this.isDragging = false;
19979
+ this.clearPoints();
19980
+ this.lastPoint = null;
19981
+ this.updateLayer();
19712
19982
  }
19713
19983
  handleMouseDown = (e)=>{
19714
19984
  if (!this.isActive || !this.map) return;
@@ -19937,6 +20207,9 @@ class PathTracker {
19937
20207
  type: pathType,
19938
20208
  segments: [],
19939
20209
  style: {
20210
+ color: '#1890ff',
20211
+ width: 2,
20212
+ opacity: 0.8,
19940
20213
  ...this.options.defaultStyle
19941
20214
  }
19942
20215
  };
@@ -19995,10 +20268,12 @@ class PathTracker {
19995
20268
  if (0 === this.currentPath.segments.length) {
19996
20269
  this.currentPath = null;
19997
20270
  this.isTracking = false;
20271
+ this.updateResultLayer();
19998
20272
  }
19999
20273
  } else {
20000
20274
  this.currentPath = null;
20001
20275
  this.isTracking = false;
20276
+ this.updateResultLayer();
20002
20277
  }
20003
20278
  this.callbacks.onCancel?.();
20004
20279
  }
@@ -20052,6 +20327,7 @@ class PathTracker {
20052
20327
  cancelTracking() {
20053
20328
  this.stopTracking();
20054
20329
  this.currentPath = null;
20330
+ this.updateResultLayer();
20055
20331
  }
20056
20332
  clearPaths() {
20057
20333
  this.triggerOnClear();