@@ -121,6 +121,9 @@ Cesium.knockout.applyBindings(addSplashWindowModel, document.getElementById('cit
121
121
122
122
intiClient ( ) ;
123
123
124
+ // Store clicked entities
125
+ var clickedEntities = { } ;
126
+
124
127
var clockElementClicked = false ;
125
128
function intiClient ( ) {
126
129
// adjust cesium navigation help popup for splash window
@@ -177,9 +180,6 @@ function intiClient() {
177
180
// inspect the status of the showed and cached tiles
178
181
inspectTileStatus ( ) ;
179
182
180
- // bind view and model of the highlighted and hidden Objects...
181
- observeObjectList ( ) ;
182
-
183
183
// Zoom to desired camera position and load layers if encoded in the url...
184
184
zoomToDefaultCameraPosition ( ) . then ( function ( info ) {
185
185
var layers = getLayersFromUrl ( ) ;
@@ -370,84 +370,57 @@ function getLayersFromUrl() {
370
370
return nLayers ;
371
371
}
372
372
373
- function observeObjectList ( ) {
374
- var observable = Cesium . knockout . getObservable ( webMap , '_activeLayer' ) ;
375
- var highlightedObjectsSubscription = undefined ;
376
- var hiddenObjectsSubscription = undefined ;
377
-
373
+ function listHighlightedObjects ( ) {
378
374
var highlightingListElement = document . getElementById ( "citydb_highlightinglist" ) ;
379
- highlightingListElement . onchange = function ( ) {
380
- zoomToObjectById ( this . value ) ;
381
- highlightingListElement . selectedIndex = 0 ;
382
- } ;
383
375
384
- var hiddenListElement = document . getElementById ( "citydb_hiddenlist" ) ;
385
- hiddenListElement . onchange = function ( ) {
386
- zoomToObjectById ( this . value ) ;
387
- hiddenListElement . selectedIndex = 0 ;
388
- } ;
389
-
390
- observable . subscribe ( function ( deSelectedLayer ) {
391
- if ( Cesium . defined ( highlightedObjectsSubscription ) ) {
392
- highlightedObjectsSubscription . dispose ( ) ;
393
- }
394
- if ( Cesium . defined ( hiddenObjectsSubscription ) ) {
395
- hiddenObjectsSubscription . dispose ( ) ;
376
+ emptySelectBox ( highlightingListElement , function ( ) {
377
+ var highlightedObjects = webMap . getAllHightlightedObjects ( ) ;
378
+ for ( var i = 0 ; i < highlightedObjects . length ; i ++ ) {
379
+ var option = document . createElement ( "option" ) ;
380
+ option . text = highlightedObjects [ i ] ;
381
+ highlightingListElement . add ( option ) ;
382
+ highlightingListElement . selectedIndex = 0 ;
396
383
}
397
- } , observable , "beforeChange" ) ;
384
+ } ) ;
385
+ }
398
386
399
- observable . subscribe ( function ( selectedLayer ) {
400
- if ( Cesium . defined ( selectedLayer ) ) {
401
- document . getElementById ( selectedLayer . id ) . childNodes [ 0 ] . checked = true ;
387
+ function listHiddenObjects ( ) {
388
+ var hidddenListElement = document . getElementById ( "citydb_hiddenlist" ) ;
402
389
403
- highlightedObjectsSubscription = Cesium . knockout . getObservable ( selectedLayer , '_highlightedObjects' ) . subscribe ( function ( highlightedObjects ) {
404
- while ( highlightingListElement . length > 1 ) {
405
- highlightingListElement . remove ( 1 ) ;
406
- }
407
- for ( var id in highlightedObjects ) {
408
- var option = document . createElement ( "option" ) ;
409
- option . text = id ;
410
- highlightingListElement . add ( option ) ;
411
- }
412
- } ) ;
413
- selectedLayer . highlightedObjects = selectedLayer . highlightedObjects ;
390
+ emptySelectBox ( hidddenListElement , function ( ) {
391
+ var hiddenObjects = webMap . getAllHiddenObjects ( ) ;
392
+ for ( var i = 0 ; i < hiddenObjects . length ; i ++ ) {
393
+ var option = document . createElement ( "option" ) ;
394
+ option . text = hiddenObjects [ i ] ;
395
+ hidddenListElement . add ( option ) ;
396
+ hidddenListElement . selectedIndex = 0 ;
397
+ }
398
+ } ) ;
399
+ }
414
400
415
- hiddenObjectsSubscription = Cesium . knockout . getObservable ( selectedLayer , '_hiddenObjects' ) . subscribe ( function ( hiddenObjects ) {
416
- while ( hiddenListElement . length > 1 ) {
417
- hiddenListElement . remove ( 1 ) ;
418
- }
419
- for ( var k = 0 ; k < hiddenObjects . length ; k ++ ) {
420
- var id = hiddenObjects [ k ] ;
421
- var option = document . createElement ( "option" ) ;
422
- option . text = id ;
423
- hiddenListElement . add ( option ) ;
424
- }
425
- } ) ;
426
- selectedLayer . hiddenObjects = selectedLayer . hiddenObjects ;
401
+ function emptySelectBox ( selectElement , callback ) {
402
+ for ( var i = selectElement . length - 1 ; i >= 0 ; i -- ) {
403
+ selectElement . remove ( 1 ) ;
404
+ }
427
405
428
- updateAddLayerViewModel ( selectedLayer ) ;
429
- } else {
430
- while ( highlightingListElement . length > 1 ) {
431
- highlightingListElement . remove ( 1 ) ;
432
- }
433
- while ( hiddenListElement . length > 1 ) {
434
- hiddenListElement . remove ( 1 ) ;
435
- }
406
+ callback ( ) ;
407
+ }
408
+
409
+ function flyToClickedObject ( obj ) {
410
+ // The web client stores clicked or ctrlclicked entities in a dictionary clickedEntities with {id, entity} as KVP.
411
+ // The function flyTo from Cesium Viewer will be first employed to fly to the selected entity.
412
+ // NOTE: This flyTo function will fail if the target entity has been unloaded (e.g. user has moved camera away).
413
+ // In this case, the function zoomToObjectById shall be used instead.
414
+ // NOTE: This zoomToObjectById function requires a JSON file containing the IDs and coordinates of objects.
415
+ cesiumViewer . flyTo ( clickedEntities [ obj . value ] ) . then ( function ( result ) {
416
+ if ( ! result ) {
417
+ zoomToObjectById ( obj . value ) ;
436
418
}
419
+ } ) . otherwise ( function ( error ) {
420
+ zoomToObjectById ( obj . value ) ;
437
421
} ) ;
438
422
439
- function updateAddLayerViewModel ( selectedLayer ) {
440
- addLayerViewModel . url = selectedLayer . url ;
441
- addLayerViewModel . name = selectedLayer . name ;
442
- addLayerViewModel . layerDataType = selectedLayer . layerDataType ;
443
- addLayerViewModel . gltfVersion = selectedLayer . gltfVersion ;
444
- addLayerViewModel . thematicDataUrl = selectedLayer . thematicDataUrl ;
445
- addLayerViewModel . cityobjectsJsonUrl = selectedLayer . cityobjectsJsonUrl ;
446
- addLayerViewModel . minLodPixels = selectedLayer . minLodPixels ;
447
- addLayerViewModel . maxLodPixels = selectedLayer . maxLodPixels ;
448
- addLayerViewModel . maxSizeOfCachedTiles = selectedLayer . maxSizeOfCachedTiles ;
449
- addLayerViewModel . maxCountOfVisibleTiles = selectedLayer . maxCountOfVisibleTiles ;
450
- }
423
+ obj . selectedIndex = 0 ;
451
424
}
452
425
453
426
function saveLayerSettings ( ) {
@@ -471,7 +444,6 @@ function saveLayerSettings() {
471
444
if ( layerOption . id == activeLayer . id ) {
472
445
layerOption . childNodes [ 2 ] . innerHTML = activeLayer . name ;
473
446
}
474
- ;
475
447
}
476
448
477
449
document . getElementById ( 'loadingIndicator' ) . style . display = 'block' ;
@@ -576,7 +548,8 @@ function addLayerToList(layer) {
576
548
}
577
549
578
550
function addEventListeners ( layer ) {
579
- layer . registerEventHandler ( "CLICK" , function ( object ) {
551
+
552
+ function auxClickEventListener ( object ) {
580
553
var objectId ;
581
554
var targetEntity ;
582
555
if ( layer instanceof CitydbKmlLayer ) {
@@ -598,7 +571,19 @@ function addEventListeners(layer) {
598
571
cesiumViewer . selectedEntity = targetEntity ;
599
572
}
600
573
601
- createInfoTable ( objectId , targetEntity , layer ) ;
574
+ // Save this clicked object for later use (such as zooming using ID)
575
+ clickedEntities [ objectId ] = targetEntity ;
576
+
577
+ return [ objectId , targetEntity ] ;
578
+ }
579
+
580
+ layer . registerEventHandler ( "CLICK" , function ( object ) {
581
+ var res = auxClickEventListener ( object ) ;
582
+ createInfoTable ( res [ 0 ] , res [ 1 ] , layer ) ;
583
+ } ) ;
584
+
585
+ layer . registerEventHandler ( "CTRLCLICK" , function ( object ) {
586
+ auxClickEventListener ( object ) ;
602
587
} ) ;
603
588
}
604
589
0 commit comments