diff --git a/index.html b/index.html index 38d864b6800244266e390d3e4ab06af82f92dfba..07526accf74bd6fb7df5f387cb9b7f27b5923307 100644 --- a/index.html +++ b/index.html @@ -21,46 +21,60 @@ <div id="wrapper"> <div id="sidebar"> <form> - <div class="row"> - <div class="col-8"> - <div class="form-group"> - <label>host</label> - <input type="text" class="form-control" id="host" /> - </div> + <div class="form-row"> + + <div class="form-group col-8"> + <label>host</label> + <input type="text" class="form-control" id="host" /> </div> - <div class="col-4"> - <div class="form-group"> - <label>port</label> - <input type="text" class="form-control" id="port" /> - </div> + + <div class="form-group col-4"> + <label>port</label> + <input type="text" class="form-control" id="port" /> </div> - </div> - <div class="form-group"> - <label>endpoint</label> - <input type="text" class="form-control" id="endpoint" /> - </div> - <div class="form-group"> - <label>layers</label> - <select class="form-control" id="layersList" size="10"></select> - <button id="getLayers" class="btn btn-primary btn-block" type="button">Get Layers</button> - </div> + <div class="form-group col-12"> + <label>endpoint</label> + <input type="text" class="form-control" id="endpoint" /> + </div> + + <div class="form-group col-12"> + <label>layers</label> + <select class="form-control" id="layersList" size="10"></select> + </div> + + <div class="form-group col-12"> + <button id="getLayers" class="btn btn-primary btn-block" type="button">Get Layers</button> + </div> + + <div class="form-group col-12"> + <label>bounding box</label> + <input id="boundingBoxInput" type="text" class="form-control" /> + </div> + + <div class="form-group col-6"> + <button id="setBoundingBox" class="btn btn-primary btn-block" type="button">Set</button> + </div> + + <div class="form-group col-6"> + <button id="clearBoundingBox" class="btn btn-primary btn-block" type="button">Clear</button> + </div> + + <div class="form-group col-12"> + <label for="stylesList">style</label> + <select class="form-control" id="stylesList"> + <option>Default</option> + <option>Node Level</option> + </select> + </div> + + <div class="form-group col-12"> + <div class="form-check"> + <input type="checkbox" class="form-check-input" id="toggleFreezeScene" disabled> + <label class="form-check-label" for="toggleFreezeScene">Freeze Scene</label> + </div> + </div> - <div class="form-group"> - <label>bounding box</label> - <input id="boundingBoxInput" type="text" class="form-control mb-2" /> - <button id="setBoundingBox" class="btn btn-primary btn-block" type="button">Set</button> - </div> - <div class="form-group"> - <label for="stylesList">style</label> - <select class="form-control" id="stylesList"> - <option>Default</option> - <option>Node Level</option> - </select> - </div> - <div class="form-check"> - <input type="checkbox" class="form-check-input" id="toggleFreezeScene" disabled> - <label class="form-check-label" for="toggleFreezeScene">Freeze Scene</label> </div> </form> </div> diff --git a/lib/helpers/BoundingBox.js b/lib/helpers/BoundingBox.js index 7a8b578869579a18ccd3f1b39267eb851e9f98cd..5fcf2695445313263d2c87c439acdd751c568886 100644 --- a/lib/helpers/BoundingBox.js +++ b/lib/helpers/BoundingBox.js @@ -10,6 +10,7 @@ define([ this.mouseClicks = 0; this.lons = []; this.lats = []; + this.defined = false; this.bindedClickHandler = this.clickHandler.bind(this); this.bindedMoveHandler = this.moveHandler.bind(this); this.bindedDynaimcPropertyHandler = this.dynamicPropertyHandler.bind(this); @@ -22,7 +23,6 @@ define([ register: function () { let viewer = CesiumViewer.getViewer(); viewer.scene.canvas.addEventListener('click', this.bindedClickHandler); - }, unregister: function () { @@ -39,7 +39,7 @@ define([ this.mouseClicks = 0; this.lons = []; this.lats = []; - + this.defined = false; let viewer = CesiumViewer.getViewer(); viewer.entities.removeById("bb"); this.rectangle = new Cesium.Rectangle(); @@ -75,6 +75,7 @@ define([ viewer.scene.canvas.removeEventListener('mousemove', this.bindedMoveHandler); this.lons = this.lons.sort(function (a, b) { return a - b; }); this.lats = this.lats.sort(function (a, b) { return a - b; }); + this.defined = true; topic.publish("BoundingBoxCreated", "BoundingBoxDefined"); } @@ -99,8 +100,12 @@ define([ return Cesium.Rectangle.clone(this.rectangle, result); }, + isDefined: function () { + return this.defined; + }, + toString: function () { - return this.lons[0] + "," + this.lats[0] + "," + this.lons[1] + "," + this.lats[1]; + return `${this.lons[0]},${this.lats[0]},${this.lons[1]},${this.lats[1]}`; } }); diff --git a/lib/helpers/RequestWrapper.js b/lib/helpers/RequestWrapper.js index 3537b0a4d8bf724ee84c599fb86d520c2bd6d0fd..426c1a319c0c1618be95ab768573a7166bfd66e6 100644 --- a/lib/helpers/RequestWrapper.js +++ b/lib/helpers/RequestWrapper.js @@ -22,13 +22,13 @@ define([ .param("service", "3DPS") .param("acceptversions", "1.0") .param("request", "GetScene") - .param("boundingbox", req.boundingBox) + .param("layers", req.layer) .param("cullingvolume", clientParams.cullingVolume2Url()) .param("camera", clientParams.camera2Url()) .param("frustum", clientParams.frustum2Url()) .param("drawingbuffer", clientParams.drawingBuffer2Url()) .param("time", Date.now()) - .param("intersect", true) + .optional("boundingbox", req.boundingBox) .build(); StatusBar.beginProcess("Waiting for response"); diff --git a/lib/helpers/UrlBuilder.js b/lib/helpers/UrlBuilder.js index 307d89f13347e84d5c2df273f0dd802346ce5130..d4224cd86e047d18ed59c767ae6c1982e25322a4 100644 --- a/lib/helpers/UrlBuilder.js +++ b/lib/helpers/UrlBuilder.js @@ -26,8 +26,15 @@ define([ return this; }; + this.optional = function (name, value) { + if (value) { + this._params.push(`${name}=${value}&`); + } + return this; + } + this.build = function () { - let result = `${this._protocol}://${this._host}`; + let result = `${this._protocol}://${this._host}`; if (this._port) { result += `:${this._port}`; } if (this._path) { result += `/${this._path}`; } if (this._params) { diff --git a/lib/main.js b/lib/main.js index bab37ded1e5be3bf3a98bda99081f2796cd67cb9..f920aa26ce476333beb5e1a65fbc938f90244133 100644 --- a/lib/main.js +++ b/lib/main.js @@ -83,6 +83,10 @@ require([ state.setBoundingBox(); }); + $("#clearBoundingBox").click(function (event) { + state.clearBoundingBox(); + }); + $("#toggleFreezeScene").change(function () { state.toggleFreezeScene(); }); diff --git a/lib/state/BoundingBoxDefined.js b/lib/state/BoundingBoxDefined.js index 44290d9a8f6798fbca4358f62ba507bd2311a33b..fc604cdd6f0cbe5bde3ad37f5cd382bf0897b5ec 100644 --- a/lib/state/BoundingBoxDefined.js +++ b/lib/state/BoundingBoxDefined.js @@ -1,8 +1,7 @@ define([ "dojo/_base/declare", - "helpers/NodeCache", - "helpers/RequestWrapper" -], function (declare, NodeCache, RequestWrapper) { + "helpers/NodeCache" +], function (declare, NodeCache) { return declare(null, { @@ -10,8 +9,11 @@ define([ init(target, bb) { bb.unregister(); + NodeCache.clearAll(); $("#boundingBoxInput").val(bb.toString()); + $('#toggleFreezeScene').prop('checked', false); $("#toggleFreezeScene").prop("disabled", false); + target.operations.setBoundingBox(bb.toString()); target.makeRequest(); }, @@ -21,14 +23,12 @@ define([ target.changeState("BoundingBoxDefining"); }, + clearingBoundingBox: function (target, bb) { + // no-op + }, + makingRequest: function (target) { - let requestWrapper = new RequestWrapper(); - requestWrapper.request({ - host: $("#host").val(), - port: $("#port").val(), - endpoint: $("#endpoint").val(), - boundingBox: $("#boundingBoxInput").val() - }); + target.operations.invokeRequest(); target.changeState("WaitingForPortrayal"); }, @@ -38,7 +38,7 @@ define([ selectingLayer: function (target, layer) { target.operations.selectLayer(layer); - target.changeState("BoundingBoxUndefined"); + target.changeState("LayerSelected"); }, gettingLayers: function (target) { diff --git a/lib/state/BoundingBoxDefining.js b/lib/state/BoundingBoxDefining.js index 906b83d5dafef9adb99db9b3b1af66f118e1493a..6645a864fe6a39494277bd63b0df5f182fd55176 100644 --- a/lib/state/BoundingBoxDefining.js +++ b/lib/state/BoundingBoxDefining.js @@ -19,6 +19,10 @@ define([ bb.clear(); }, + clearingBoundingBox: function (target, bb) { + // no-op + }, + makingRequest: function (target) { // no-op }, diff --git a/lib/state/BoundingBoxUndefined.js b/lib/state/BoundingBoxUndefined.js index 1ce987d3cee23006da0b69539ef8c2d5689faff4..0078b339881a8a3df92dcb74087d482bbf1d0bbd 100644 --- a/lib/state/BoundingBoxUndefined.js +++ b/lib/state/BoundingBoxUndefined.js @@ -13,6 +13,7 @@ define([ bb.clear(); NodeCache.clearAll(); $("#boundingBoxInput").val(""); + $('#toggleFreezeScene').prop('checked', false); $('#toggleFreezeScene').prop('disabled', true); }, @@ -20,6 +21,10 @@ define([ target.changeState("BoundingBoxDefining"); }, + clearingBoundingBox: function (target, bb) { + // no-op + }, + makingRequest: function (target) { // no-op }, @@ -30,6 +35,8 @@ define([ selectingLayer: function (target, layer) { target.operations.selectLayer(layer); + target.operations.invokeRequest({ layer: layer }); + target.changeState("WaitingForPortrayal"); }, gettingLayers: function (target) { diff --git a/lib/state/FreezeScene.js b/lib/state/FreezeScene.js index f0ae118e3514d9e5e29269fa438965534fa4fbb8..0933936ff06d11f96313347d08867faf49fad57b 100644 --- a/lib/state/FreezeScene.js +++ b/lib/state/FreezeScene.js @@ -15,10 +15,14 @@ define([ settingBoundingBox: function (target, bb) { bb.clear(); - NodeCache.clearAll(); + // NodeCache.clearAll(); target.changeState("BoundingBoxDefining"); }, + clearingBoundingBox: function (target, bb) { + // no-op + }, + makingRequest: function (target) { // no-op }, @@ -28,8 +32,9 @@ define([ }, selectingLayer: function (target, layer) { + target.operations.clear(); target.operations.selectLayer(layer); - target.changeState("BoundingBoxUndefined"); + target.changeState("LayerSelected"); }, gettingLayers: function (target) { diff --git a/lib/state/LayerSelected.js b/lib/state/LayerSelected.js new file mode 100644 index 0000000000000000000000000000000000000000..43ea0400eb70b40c26f8e7a9a8fedaef963d0372 --- /dev/null +++ b/lib/state/LayerSelected.js @@ -0,0 +1,49 @@ +define([ + "dojo/_base/declare", + "helpers/NodeCache" +], function (declare, NodeCache) { + + return declare(null, { + + constructor: function () { + + }, + + init(target, bb) { + bb.clear(); + NodeCache.clearAll(); + $("#boundingBoxInput").val(""); + $('#toggleFreezeScene').prop('checked', false); + $('#toggleFreezeScene').prop('disabled', true); + }, + + settingBoundingBox: function (target, bb) { + // no-op + }, + + clearingBoundingBox: function (target, bb) { + // no-op + }, + + makingRequest: function (target) { + target.operations.invokeRequest(); + target.changeState("WaitingForPortrayal"); + }, + + toggleFreezingScene: function (target) { + // no-op + }, + + selectingLayer: function (target, layer) { + console.log("hihoho"); + target.operations.selectLayer(layer); + }, + + gettingLayers: function (target) { + target.operations.getLayers(); + target.changeState("NoLayerSelected"); + } + + }); + +}); \ No newline at end of file diff --git a/lib/state/NoLayerSelected.js b/lib/state/NoLayerSelected.js index 1e6b996fb1e7bbdb3cc7f315ae8c08846ec9957d..fa2945b9df9f8875339d20ca29566bf581f38367 100644 --- a/lib/state/NoLayerSelected.js +++ b/lib/state/NoLayerSelected.js @@ -12,7 +12,9 @@ define([ init(target, bb) { bb.clear(); NodeCache.clearAll(); + target.operations.clear(); $("#boundingBoxInput").val(""); + $('#toggleFreezeScene').prop('checked', false); $('#toggleFreezeScene').prop('disabled', true); }, @@ -20,6 +22,10 @@ define([ // no-op }, + clearingBoundingBox: function (target, bb) { + // no-op + }, + makingRequest: function (target) { // no-op }, @@ -29,8 +35,9 @@ define([ }, selectingLayer: function (target, layer) { + target.operations.clear(); target.operations.selectLayer(layer); - target.changeState("BoundingBoxUndefined"); + target.changeState("LayerSelected"); }, gettingLayers: function (target) { diff --git a/lib/state/Operations.js b/lib/state/Operations.js index 46181fecc7883bd16250e6eae7b92e87c77746c9..2959cb36e876ee4375e345d0d6734733dcd0139f 100644 --- a/lib/state/Operations.js +++ b/lib/state/Operations.js @@ -3,13 +3,16 @@ define([ "dojo/request", "helpers/UrlBuilder", "CesiumAdaptor/CesiumViewer", - "helpers/Layers" -], function (declare, request, UrlBuilder, CesiumViewer, Layers) { + "helpers/Layers", + "helpers/RequestWrapper" +], function (declare, request, UrlBuilder, CesiumViewer, Layers, RequestWrapper) { return declare(null, { constructor: function () { this._layers = null; + this._active_layer = null; + this._bb = null; }, @@ -42,13 +45,45 @@ define([ }, selectLayer: function (layer) { - // let selection = listElement.value; + this._active_layer = layer; let layerCenter = this._layers.getLayerCenter(layer); let viewer = CesiumViewer.getViewer(); let center = Cesium.Cartesian3.fromDegrees(layerCenter.lon, layerCenter.lat, 20000.0); viewer.camera.setView({ - destination: center + destination: center, + orientation: { + heading: 0.0, + pitch: Cesium.Math.toRadians(-90), + roll: 0.0 + } }); + }, + + setBoundingBox: function (bb) { + this._bb = bb; + }, + + invokeRequest: function () { + let requestWrapper = new RequestWrapper(); + let req = { + host: $("#host").val(), + port: $("#port").val(), + endpoint: $("#endpoint").val(), + layer: this._active_layer + }; + if (this._bb) { + req.boundingBox = this._bb; + } + requestWrapper.request(req); + }, + + clear: function () { + this._active_layer = null; + this._bb = null; + }, + + clearBoundingBox: function () { + this._bb = null; } }); diff --git a/lib/state/SceneRendered.js b/lib/state/SceneRendered.js index b4fe9519c867584bed6987bf6a6b36b8c9a502d9..ed44a3c8d55b2e3f24736c5817ea5b7920add69d 100644 --- a/lib/state/SceneRendered.js +++ b/lib/state/SceneRendered.js @@ -14,18 +14,22 @@ define([ settingBoundingBox: function (target, bb) { bb.clear(); - NodeCache.clearAll(); target.changeState("BoundingBoxDefining"); }, + clearingBoundingBox: function (target, bb) { + if (bb.isDefined()) { + bb.clear(); + NodeCache.clearAll(); + target.operations.clearBoundingBox(); + $("#boundingBoxInput").val(""); + target.makeRequest(); + } + + }, + makingRequest: function (target) { - let requestWrapper = new RequestWrapper(); - requestWrapper.request({ - host: $("#host").val(), - port: $("#port").val(), - endpoint: $("#endpoint").val(), - boundingBox: $("#boundingBoxInput").val() - }); + target.operations.invokeRequest(); target.changeState("WaitingForPortrayal"); }, @@ -34,8 +38,9 @@ define([ }, selectingLayer: function (target, layer) { + target.operations.clear(); target.operations.selectLayer(layer); - target.changeState("BoundingBoxUndefined"); + target.changeState("LayerSelected"); }, gettingLayers: function (target) { diff --git a/lib/state/State.js b/lib/state/State.js index 81b4ae0b77715fcd78f895369e26303ac92c1404..f38218d0882506d8a5d91c0b68a0fec7789aa86b 100644 --- a/lib/state/State.js +++ b/lib/state/State.js @@ -20,6 +20,10 @@ define([ this._current.settingBoundingBox(this, this._boundingBox); }, + clearBoundingBox: function () { + this._current.clearingBoundingBox(this, this._boundingBox); + }, + makeRequest: function () { this._current.makingRequest(this); }, diff --git a/lib/state/StateFactory.js b/lib/state/StateFactory.js index 672b76ad718ceaa1e3bf4803b04aee8000d93256..bc74637a2a59e27d44a23ed60154af9792d17b79 100644 --- a/lib/state/StateFactory.js +++ b/lib/state/StateFactory.js @@ -1,13 +1,14 @@ define([ "dojo/_base/declare", "state/NoLayerSelected", + "state/LayerSelected", "state/BoundingBoxUndefined", "state/BoundingBoxDefining", "state/BoundingBoxDefined", "state/WaitingForPortrayal", "state/FreezeScene", "state/SceneRendered" -], function (declare, NoLayerSelected, BoundingBoxUndefined, BoundingBoxDefining, BoundingBoxDefined, WaitingForPortrayal, FreezeScene, SceneRendered) { +], function (declare, NoLayerSelected, LayerSelected, BoundingBoxUndefined, BoundingBoxDefining, BoundingBoxDefined, WaitingForPortrayal, FreezeScene, SceneRendered) { return declare(null, { @@ -19,6 +20,8 @@ define([ switch (stateName) { case "NoLayerSelected": return new NoLayerSelected(); + case "LayerSelected": + return new LayerSelected(); case "BoundingBoxUndefined": return new BoundingBoxUndefined(); case "BoundingBoxDefining": diff --git a/lib/state/WaitingForPortrayal.js b/lib/state/WaitingForPortrayal.js index ac1dceb3560557492eb8fc32f5c40404e36a8dc1..3068fe1aed501dbd847092498d35aadece622cc6 100644 --- a/lib/state/WaitingForPortrayal.js +++ b/lib/state/WaitingForPortrayal.js @@ -1,7 +1,6 @@ define([ - "dojo/_base/declare", - "helpers/RequestWrapper" -], function (declare, RequestWrapper) { + "dojo/_base/declare" +], function (declare) { return declare(null, { @@ -15,14 +14,12 @@ define([ // no-op }, + clearingBoundingBox: function (target, bb) { + // no-op + }, + makingRequest: function (target) { - requestWrapper = new RequestWrapper(); - requestWrapper.request({ - host: $("#host").val(), - port: $("#port").val(), - endpoint: $("#endpoint").val(), - boundingBox: $("#boundingBoxInput").val() - }); + target.operations.invokeRequest(); }, toggleFreezingScene: function (target) {