Skip to content

Commit 4c7bcfd

Browse files
committed
Fix highlighting and hiding function for multiple layers
1 parent 9837581 commit 4c7bcfd

File tree

3 files changed

+101
-82
lines changed

3 files changed

+101
-82
lines changed

3dwebclient/index.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -447,14 +447,14 @@
447447
</div>
448448
</div>
449449

450-
<div class="citydb_long_container">
451-
<select id = "citydb_highlightinglist" style="width: 100%;" class="cesium-button">
452-
<option selected="selected" disabled="disabled">Choose highlighted Object</option>
453-
</select>
450+
<div class="citydb_long_container" onmouseover="listHighlightedObjects()">
451+
<select id = "citydb_highlightinglist" style="width: 100%;" class="cesium-button" onchange="flyToClickedObject(this)">
452+
<option selected="selected" disabled="disabled">Choose highlighted Object</option>
453+
</select>
454454
</div>
455-
<div class="citydb_long_container">
456-
<select id = "citydb_hiddenlist" style="width: 100%;" class="cesium-button">
457-
<option selected="selected" disabled="disabled">Choose hidden Object</option>
455+
<div class="citydb_long_container" onmouseover="listHiddenObjects()">
456+
<select id = "citydb_hiddenlist" style="width: 100%;" class="cesium-button" onchange="flyToClickedObject(this)">
457+
<option selected="selected" disabled="disabled">Choose hidden Object</option>
458458
</select>
459459
</div>
460460
<div>

3dwebclient/script.js

Lines changed: 59 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ Cesium.knockout.applyBindings(addSplashWindowModel, document.getElementById('cit
121121

122122
intiClient();
123123

124+
// Store clicked entities
125+
var clickedEntities = {};
126+
124127
var clockElementClicked = false;
125128
function intiClient() {
126129
// adjust cesium navigation help popup for splash window
@@ -177,9 +180,6 @@ function intiClient() {
177180
// inspect the status of the showed and cached tiles
178181
inspectTileStatus();
179182

180-
// bind view and model of the highlighted and hidden Objects...
181-
observeObjectList();
182-
183183
// Zoom to desired camera position and load layers if encoded in the url...
184184
zoomToDefaultCameraPosition().then(function (info) {
185185
var layers = getLayersFromUrl();
@@ -370,84 +370,57 @@ function getLayersFromUrl() {
370370
return nLayers;
371371
}
372372

373-
function observeObjectList() {
374-
var observable = Cesium.knockout.getObservable(webMap, '_activeLayer');
375-
var highlightedObjectsSubscription = undefined;
376-
var hiddenObjectsSubscription = undefined;
377-
373+
function listHighlightedObjects() {
378374
var highlightingListElement = document.getElementById("citydb_highlightinglist");
379-
highlightingListElement.onchange = function () {
380-
zoomToObjectById(this.value);
381-
highlightingListElement.selectedIndex = 0;
382-
};
383375

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;
396383
}
397-
}, observable, "beforeChange");
384+
});
385+
}
398386

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");
402389

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+
}
414400

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+
}
427405

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);
436418
}
419+
}).otherwise(function (error) {
420+
zoomToObjectById(obj.value);
437421
});
438422

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;
451424
}
452425

453426
function saveLayerSettings() {
@@ -471,7 +444,6 @@ function saveLayerSettings() {
471444
if (layerOption.id == activeLayer.id) {
472445
layerOption.childNodes[2].innerHTML = activeLayer.name;
473446
}
474-
;
475447
}
476448

477449
document.getElementById('loadingIndicator').style.display = 'block';
@@ -576,7 +548,8 @@ function addLayerToList(layer) {
576548
}
577549

578550
function addEventListeners(layer) {
579-
layer.registerEventHandler("CLICK", function (object) {
551+
552+
function auxClickEventListener(object) {
580553
var objectId;
581554
var targetEntity;
582555
if (layer instanceof CitydbKmlLayer) {
@@ -598,7 +571,19 @@ function addEventListeners(layer) {
598571
cesiumViewer.selectedEntity = targetEntity;
599572
}
600573

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);
602587
});
603588
}
604589

js/3dcitydb-web-map.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
this._eventHandler = new Cesium.ScreenSpaceEventHandler(cesiumViewer.scene.canvas);
4242
this._cameraEventAggregator = new Cesium.CameraEventAggregator(cesiumViewer.scene.canvas);
4343
this._activeLayer = undefined;
44-
Cesium.knockout.track(this, ['_activeLayer']);
4544
}
4645

4746
Object.defineProperties(WebMap3DCityDB.prototype, {
@@ -279,5 +278,40 @@
279278
}
280279
this._mouseMoveEvents = active;
281280
};
281+
282+
/**
283+
* get highlighted objects from all layers
284+
* @returns {Array}
285+
*/
286+
WebMap3DCityDB.prototype.getAllHightlightedObjects = function () {
287+
var results = [];
288+
var count = 0;
289+
var layers = this._layers;
290+
for (var i = 0; i < layers.length; i++) {
291+
var curLayer = this._layers[i];
292+
for (var obj in curLayer._highlightedObjects) {
293+
results[count++] = obj;
294+
}
295+
}
296+
return results;
297+
};
298+
299+
/**
300+
* get hidden objects from all layers
301+
* @returns {Array}
302+
*/
303+
WebMap3DCityDB.prototype.getAllHiddenObjects = function () {
304+
var results = [];
305+
var count = 0;
306+
var layers = this._layers;
307+
for (var i = 0; i < layers.length; i++) {
308+
var curLayer = this._layers[i];
309+
for (var j = 0; j < curLayer._hiddenObjects.length; j++) {
310+
results[count++] = curLayer._hiddenObjects[j];
311+
}
312+
}
313+
return results;
314+
};
315+
282316
window.WebMap3DCityDB = WebMap3DCityDB;
283317
})();

0 commit comments

Comments
 (0)