From b7f450f54c5d859f71c3e53388ca544a3d321934 Mon Sep 17 00:00:00 2001
From: athanasios <ath.kouk.oid@gmail.com>
Date: Wed, 15 Jul 2020 20:46:52 +0200
Subject: [PATCH] boundingbox now optional

---
 index.html                        | 86 ++++++++++++++++++-------------
 lib/helpers/BoundingBox.js        | 11 ++--
 lib/helpers/RequestWrapper.js     |  4 +-
 lib/helpers/UrlBuilder.js         |  9 +++-
 lib/main.js                       |  4 ++
 lib/state/BoundingBoxDefined.js   | 22 ++++----
 lib/state/BoundingBoxDefining.js  |  4 ++
 lib/state/BoundingBoxUndefined.js |  7 +++
 lib/state/FreezeScene.js          |  9 +++-
 lib/state/LayerSelected.js        | 49 ++++++++++++++++++
 lib/state/NoLayerSelected.js      |  9 +++-
 lib/state/Operations.js           | 43 ++++++++++++++--
 lib/state/SceneRendered.js        | 23 +++++----
 lib/state/State.js                |  4 ++
 lib/state/StateFactory.js         |  5 +-
 lib/state/WaitingForPortrayal.js  | 17 +++---
 16 files changed, 226 insertions(+), 80 deletions(-)
 create mode 100644 lib/state/LayerSelected.js

diff --git a/index.html b/index.html
index 38d864b..07526ac 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 7a8b578..5fcf269 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 3537b0a..426c1a3 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 307d89f..d4224cd 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 bab37de..f920aa2 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 44290d9..fc604cd 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 906b83d..6645a86 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 1ce987d..0078b33 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 f0ae118..0933936 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 0000000..43ea040
--- /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 1e6b996..fa2945b 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 46181fe..2959cb3 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 b4fe951..ed44a3c 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 81b4ae0..f38218d 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 672b76a..bc74637 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 ac1dceb..3068fe1 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) {
-- 
GitLab