From 28bf5e1289446b41a53e8b79c0d46e1e084e0dd5 Mon Sep 17 00:00:00 2001 From: Benjamin Gerber Date: Mon, 7 Oct 2024 20:42:18 +0200 Subject: [PATCH] Remove ol-cesium --- .github/renovate.json5 | 5 - buildtools/extract-ngeo-dependencies | 1 - package.json | 4 +- src/olcs/Manager.js | 57 ----- src/olcs/Service.js | 164 -------------- src/olcs/constants.js | 55 ----- src/olcs/controls3d.html.js | 35 --- src/olcs/controls3d.js | 315 --------------------------- src/olcs/controls3d.scss | 124 ----------- src/olcs/img/angle.png | Bin 6791 -> 0 bytes src/olcs/img/left.png | Bin 1507 -> 0 bytes src/olcs/img/left_grey.png | Bin 809 -> 0 bytes src/olcs/img/right.png | Bin 1491 -> 0 bytes src/olcs/img/right_grey.png | Bin 792 -> 0 bytes src/olcs/img/rotation.png | Bin 5296 -> 0 bytes src/olcs/img/zoomin.png | Bin 836 -> 0 bytes src/olcs/img/zoomout.png | Bin 877 -> 0 bytes src/olcs/olcsModule.js | 32 --- src/permalink/Permalink.js | 18 +- 19 files changed, 8 insertions(+), 802 deletions(-) delete mode 100644 src/olcs/Manager.js delete mode 100644 src/olcs/Service.js delete mode 100644 src/olcs/constants.js delete mode 100644 src/olcs/controls3d.html.js delete mode 100644 src/olcs/controls3d.js delete mode 100644 src/olcs/controls3d.scss delete mode 100644 src/olcs/img/angle.png delete mode 100644 src/olcs/img/left.png delete mode 100644 src/olcs/img/left_grey.png delete mode 100644 src/olcs/img/right.png delete mode 100644 src/olcs/img/right_grey.png delete mode 100644 src/olcs/img/rotation.png delete mode 100644 src/olcs/img/zoomin.png delete mode 100644 src/olcs/img/zoomout.png delete mode 100644 src/olcs/olcsModule.js diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 6d321eb36dc2..07cc4682beea 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -98,11 +98,6 @@ groupName: 'CI dependencies', automerge: true, }, - /** Disable ol-cesium updates */ - { - enabled: false, - matchDepNames: ['ol-cesium'], - }, /** Packages published very recently are not pushed to stabilization branches for security reasons */ { matchBaseBranches: ['/^[0-9]+\\.[0-9]+$/'], diff --git a/buildtools/extract-ngeo-dependencies b/buildtools/extract-ngeo-dependencies index e148d41fdce4..1aa5c356f6ad 100755 --- a/buildtools/extract-ngeo-dependencies +++ b/buildtools/extract-ngeo-dependencies @@ -51,7 +51,6 @@ all_required_js = {a for a in all_required_js if not a.startswith("./")} all_required_js = {a for a in all_required_js if not a.startswith("ngeo/")} all_required_js = {a for a in all_required_js if not a.startswith("gmf/")} all_required_js = {a for a in all_required_js if not a.startswith("gmfapi/")} -all_required_js = {a for a in all_required_js if not a.startswith("olcs/")} all_required_js = {a for a in all_required_js if not a.startswith("jsts/")} all_required_js = {a for a in all_required_js if not a.startswith("mapillary-js/")} all_required_js = { diff --git a/package.json b/package.json index 09a564e2f20d..a60e1c192f83 100644 --- a/package.json +++ b/package.json @@ -107,9 +107,7 @@ "_optionalDependenciesComment_": "Dep. for plugins", "optionalDependencies": { "jsts": "2.11.3", - "localforage": "1.10.0", - "mapillary-js": "4.1.2", - "ol-cesium": "2.14.0" + "mapillary-js": "4.1.2" }, "devDependencies": { "@chromatic-com/storybook": "2.0.2", diff --git a/src/olcs/Manager.js b/src/olcs/Manager.js deleted file mode 100644 index fb6ff110300b..000000000000 --- a/src/olcs/Manager.js +++ /dev/null @@ -1,57 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2017-2024 Camptocamp SA -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import olcsContribManager from 'olcs/contrib/Manager'; - -/** - * @hidden - */ -class Manager extends olcsContribManager { - /** - * @param {string} url . - * @param {angular.IScope} $rootScope . - * @param {import('olcs/contrib/Manager').ManagerOptions} options . - */ - constructor(url, $rootScope, options) { - super(url, options); - /** - * @type {angular.IScope} - * @private - */ - this.rootScope_ = $rootScope; - } - - /** - * @override - */ - toggle3d() { - // The transition is asynchronous and at the end of it the state of OLCesium is changed. - // In order to have all code dependent on OLCesium state updated, we kick an Angular digest cycle. - const promise = super.toggle3d(); - return /** @type {Promise} */ ( - promise.then(() => { - this.rootScope_.$apply(); - }) - ); - } -} - -export default Manager; diff --git a/src/olcs/Service.js b/src/olcs/Service.js deleted file mode 100644 index 2d766dfa6aa3..000000000000 --- a/src/olcs/Service.js +++ /dev/null @@ -1,164 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2017-2024 Camptocamp SA -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import angular from 'angular'; -import ngeoMiscDebounce from 'ngeo/misc/debounce'; -import ngeoStatemanagerLocation from 'ngeo/statemanager/Location'; -import {Permalink3dParam} from 'ngeo/olcs/constants'; -import ngeoStatemanagerService from 'ngeo/statemanager/Service'; -import {toDegrees} from 'ol/math'; - -/** - * @hidden - */ -export class OlcsService { - /** - * @param {import('ngeo/misc/debounce').miscDebounce} ngeoDebounce ngeo debounce - * service. - * @param {import('ngeo/statemanager/Location').StatemanagerLocation} ngeoLocation ngeo location - * service. - * @param {import('ngeo/statemanager/Service').StatemanagerService} ngeoStateManager The ngeo - * StateManager service. - */ - constructor(ngeoDebounce, ngeoLocation, ngeoStateManager) { - /** - * @private - * @type {?import('olcs/contrib/Manager').default} - */ - this.manager_ = null; - - /** - * @private - * @type {import('ngeo/misc/debounce').miscDebounce} - */ - this.ngeoDebounce_ = ngeoDebounce; - - /** - * @private - * @type {import('ngeo/statemanager/Location').StatemanagerLocation} - */ - this.ngeoLocation_ = ngeoLocation; - - /** - * @private - * @type {import('ngeo/statemanager/Service').StatemanagerService} - */ - this.ngeoStateManager_ = ngeoStateManager; - } - - /** - * @param {import('olcs/contrib/Manager').default} manager Manager. - */ - initialize(manager) { - this.manager_ = manager; - this.manager_.on('load', () => { - this.cameraToState_(); - }); - if (this.ngeoStateManager_.getInitialBooleanValue('3d_enabled')) { - this.initialStateToCamera_(); - } - } - - /** - * @returns {?import('olcs/contrib/Manager').default} the manager. - */ - getManager() { - return this.manager_; - } - - /** - * @private - * @returns {Promise} A promise after load & enabled. - */ - initialStateToCamera_() { - if (!this.manager_) { - throw new Error('Missing manager'); - } - const stateManager = this.ngeoStateManager_; - const lon = stateManager.getInitialNumberValue(Permalink3dParam.LON); - const lat = stateManager.getInitialNumberValue(Permalink3dParam.LAT); - const elevation = stateManager.getInitialNumberValue(Permalink3dParam.ELEVATION); - const heading = stateManager.getInitialNumberValue(Permalink3dParam.HEADING) || 0; - const pitch = stateManager.getInitialNumberValue(Permalink3dParam.PITCH) || 0; - if (!lon) { - throw new Error('Missing lon'); - } - if (!lat) { - throw new Error('Missing lat'); - } - if (!elevation) { - throw new Error('Missing elevation'); - } - return this.manager_.set3dWithView(lon, lat, elevation, heading, pitch); - } - - /** - * @private - */ - cameraToState_() { - if (!this.manager_) { - throw new Error('Missing manager'); - } - const manager = this.manager_; - const scene = manager.getOl3d().getCesiumScene(); - const camera = scene.camera; - camera.moveEnd.addEventListener( - this.ngeoDebounce_( - () => { - const position = camera.positionCartographic; - this.ngeoStateManager_.updateState({ - [Permalink3dParam.ENABLED]: true, - [Permalink3dParam.LON]: toDegrees(position.longitude).toFixed(5), - [Permalink3dParam.LAT]: toDegrees(position.latitude).toFixed(5), - [Permalink3dParam.ELEVATION]: position.height.toFixed(0), - [Permalink3dParam.HEADING]: toDegrees(camera.heading).toFixed(3), - [Permalink3dParam.PITCH]: toDegrees(camera.pitch).toFixed(3), - }); - }, - 1000, - true, - ), - ); - this.manager_.on('toggle', (event) => { - if (!event.target.is3dEnabled()) { - this.remove3dState_(); - } - }); - } - - /** - * @private - */ - remove3dState_() { - this.ngeoLocation_.getParamKeysWithPrefix(Permalink3dParam.PREFIX).forEach((key) => { - this.ngeoStateManager_.deleteParam(key); - }); - } -} -OlcsService.$inject = ['ngeoDebounce', 'ngeoLocation', 'ngeoStateManager']; -/** - * @type {angular.IModule} - * @hidden - */ -const myModule = angular - .module(name, [ngeoMiscDebounce.name, ngeoStatemanagerLocation.name, ngeoStatemanagerService.name]) - .service('ngeoOlcsService', OlcsService); -export default myModule; diff --git a/src/olcs/constants.js b/src/olcs/constants.js deleted file mode 100644 index 3f899f3600b9..000000000000 --- a/src/olcs/constants.js +++ /dev/null @@ -1,55 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2018-2024 Camptocamp SA -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/** - * @enum {string} - * @hidden - */ -export const Permalink3dParam = { - /** - * @type {string} - */ - ENABLED: '3d_enabled', - /** - * @type {string} - */ - LON: '3d_lon', - /** - * @type {string} - */ - LAT: '3d_lat', - /** - * @type {string} - */ - ELEVATION: '3d_elevation', - /** - * @type {string} - */ - HEADING: '3d_heading', - /** - * @type {string} - */ - PITCH: '3d_pitch', - /** - * @type {string} - */ - PREFIX: '3d_', -}; diff --git a/src/olcs/controls3d.html.js b/src/olcs/controls3d.html.js deleted file mode 100644 index 76d92ed9e13f..000000000000 --- a/src/olcs/controls3d.html.js +++ /dev/null @@ -1,35 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2024 Camptocamp SA -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -export default `
-
- - -
-
- - -
-
-
- - -
`; diff --git a/src/olcs/controls3d.js b/src/olcs/controls3d.js deleted file mode 100644 index b2222e7cb9a2..000000000000 --- a/src/olcs/controls3d.js +++ /dev/null @@ -1,315 +0,0 @@ -ngeoOlcsControls3dTemplateUrlInjectable.$inject = ['$attrs', 'ngeoOlcsControls3dTemplateUrl']; -// The MIT License (MIT) -// -// Copyright (c) 2017-2024 Camptocamp SA -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -/* global Cesium */ - -import angular from 'angular'; -import * as olEasing from 'ol/easing'; -import {toRadians} from 'ol/math'; -import olcsCore from 'olcs/core'; -import htmlTemplate from './controls3d.html'; - -/** - * @type {angular.IModule} - * @hidden - */ -const myModule = angular.module('ngeoOlcsControls3d', []); - -/** - * @private - * @hidden - * @param {number} older Older - * @param {number} newer Newer - * @returns {boolean} ? - */ -function shouldUpdate(older, newer) { - return Number.isFinite(newer) && (!Number.isFinite(older) || Math.abs(newer - older) > 0.05); -} - -/** - * @hidden - */ -export class Controller { - /** - * @param {JQuery} $element The element - * @param {import('ngeo/olcs/Service').OlcsService} ngeoOlcsService The ol-cesium service. - */ - constructor($element, ngeoOlcsService) { - /** - * @type {JQuery} - * @private - */ - this.element_ = $element; - - /** - * @type {?import('olcs/contrib/Manager').default} - */ - this.ol3dm = null; - - /** - * @type {number} - */ - this.minTilt = -1; - - /** - * @type {number} - * @private - */ - this.maxTilt = -1; - - /** - * @type {?JQuery} - * @private - */ - this.tiltRightEl_ = null; - - /** - * @type {?JQuery} - * @private - */ - this.tiltLeftEl_ = null; - - /** - * @type {?JQuery} - * @private - */ - this.rotation3dEl_ = null; - - /** - * @type {?JQuery} - * @private - */ - this.angle3dEl_ = null; - - /** - * @type {number} - * @private - */ - this.previousRotation_ = -1; - - /** - * @type {?Cesium.Matrix4} - * @private - */ - this.previousViewMatrix_ = null; - - /** - * @type {number} - * @private - */ - this.animationFrameRequestId_ = -1; - - /** - * @type {import('ngeo/olcs/Service').OlcsService} - * @private - */ - this.olcsService_ = ngeoOlcsService; - } - updateWidget_() { - if (!this.ol3dm) { - throw new Error('Missing ol3dm'); - } - if (!this.rotation3dEl_) { - throw new Error('Missing rotation3dEl_'); - } - if (!this.angle3dEl_) { - throw new Error('Missing angle3dEl_'); - } - if (!this.tiltRightEl_) { - throw new Error('Missing tiltRightEl_'); - } - if (!this.tiltLeftEl_) { - throw new Error('Missing tiltLeftEl_'); - } - const newRotation = this.ol3dm.getOl3d().getOlView().getRotation(); - if (shouldUpdate(this.previousRotation_, newRotation)) { - this.rotateElement_(this.rotation3dEl_, newRotation); - this.previousRotation_ = newRotation; - } - const newViewMatrix = this.ol3dm.getCesiumViewMatrix(); - if (!Cesium.Matrix4.equalsEpsilon(this.previousViewMatrix_, newViewMatrix, 1e-5)) { - const newTilt = this.ol3dm.getTiltOnGlobe(); // this is expensive!! - if (newTilt != undefined && Number.isFinite(newTilt || 0)) { - this.rotateElement_(this.angle3dEl_, newTilt); - this.previousViewMatrix_ = Cesium.Matrix4.clone(newViewMatrix); - - // if min or max tilt is reached, disable the tilting buttons - const buffer = 0.01; // rad - if (newTilt - this.minTilt < buffer) { - this.tiltRightEl_.addClass('ngeo-right-inactive'); - } else if (this.tiltRightEl_.hasClass('ngeo-right-inactive')) { - this.tiltRightEl_.removeClass('ngeo-right-inactive'); - } - if (this.maxTilt - newTilt < buffer) { - this.tiltLeftEl_.addClass('ngeo-left-inactive'); - } else if (this.tiltLeftEl_.hasClass('ngeo-left-inactive')) { - this.tiltLeftEl_.removeClass('ngeo-left-inactive'); - } - } - } - this.animationFrameRequestId_ = requestAnimationFrame(() => this.updateWidget_()); - } - $onDestroy() { - if (this.animationFrameRequestId_) { - cancelAnimationFrame(this.animationFrameRequestId_); - } - } - $onInit() { - if (this.minTilt === undefined) { - this.minTilt = 0; - } - if (this.maxTilt === undefined) { - this.maxTilt = (7 * Math.PI) / 16; - } - if (!this.ol3dm) { - this.ol3dm = this.olcsService_.getManager() || null; - } - this.tiltRightEl_ = this.element_.find('.ngeo-tilt-right'); - this.tiltLeftEl_ = this.element_.find('.ngeo-tilt-left'); - this.rotation3dEl_ = this.element_.find('.ngeo-rotation3d'); - this.angle3dEl_ = this.element_.find('.ngeo-angle3d'); - this.updateWidget_(); - } - - /** - * @param {JQuery} element Element to rotate. - * @param {(number|undefined)} angle Angle in radians - * @private - */ - rotateElement_(element, angle) { - const r = `rotate(${angle}rad)`; - element.css({ - '-moz-transform': r, - '-webkit-transform': r, - '-o-transform': r, - '-ms-transform': r, - 'transform': r, - }); - } - - /** - * @param {number} angle Angle in degrees. - */ - rotate(angle) { - if (!this.ol3dm) { - throw new Error('Missing ol3dm'); - } - this.ol3dm.setHeading(toRadians(angle)); - } - - /** - * @param {number} angle Angle in degrees. - */ - tilt(angle) { - if (!this.ol3dm) { - throw new Error('Missing ol3dm'); - } - angle = toRadians(angle); - const tiltOnGlobe = Number(this.ol3dm.getTiltOnGlobe()); - if (tiltOnGlobe + angle < this.minTilt) { - angle = this.minTilt - tiltOnGlobe; - } else if (tiltOnGlobe + angle > this.maxTilt) { - angle = this.maxTilt - tiltOnGlobe; - } - const scene = this.ol3dm.getCesiumScene(); - olcsCore.rotateAroundBottomCenter(scene, angle); - } - - /** - * @param {number} delta 1 to zoom out and 1 to zoom in. - */ - zoom(delta) { - if (!this.ol3dm) { - throw new Error('Missing ol3dm'); - } - const view = this.ol3dm.getOlView(); - const cur = view.getResolution(); - const newResolution = view.constrainResolution(cur, delta); - if (view.getAnimating()) { - view.cancelAnimations(); - } - view.animate({ - resolution: newResolution, - duration: 250, - easing: olEasing.easeOut, - }); - } -} -Controller.$inject = ['$element', 'ngeoOlcsService']; -/** - * @param {angular.IAttributes} $attrs Attributes. - * @param {string} ngeoOlcsControls3dTemplateUrl Template function. - * @returns {string} Template URL. - * @private - * @hidden - */ -function ngeoOlcsControls3dTemplateUrlInjectable($attrs, ngeoOlcsControls3dTemplateUrl) { - if (ngeoOlcsControls3dTemplateUrl) { - return ngeoOlcsControls3dTemplateUrl; - } - const templateUrl = $attrs['ngeoOlcsControls3dTemplateUrl']; - return templateUrl ? templateUrl : 'ngeo/olsc/controls3d'; -} -myModule.run( - /** - * @param {angular.ITemplateCacheService} $templateCache - */ - [ - '$templateCache', - ($templateCache) => { - // @ts-ignore: webpack - $templateCache.put('ngeo/olsc/controls3d', htmlTemplate); - }, - ], -); - -/** - * Provides the "ngeoOlcsControls3d" component, a widget for - * controlling the 3D camera. - * - * Example: - * - * - * - * - * By default the directive uses "controls3d.html" as its templateUrl. This - * can be changed by redefining the "ngeoOlcsControls3dTemplateUrl" value. - * - * See our live example: [../examples/simple3d.html](../examples/simple3d.html) - * - * @htmlAttribute {olcs.contrib.Manager} ngeo-olcs-manager The OL-Cesium manager. - * @type {angular.IComponentOptions} - * @ngdoc component - * @ngname ngeoOlcsControls3d - */ -const olscControls3dComponent = { - bindings: { - 'minTilt': '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 JPDHLkV1mnl&%OWv diff --git a/src/olcs/img/left_grey.png b/src/olcs/img/left_grey.png deleted file mode 100644 index 84917ca06535ccb1195750bede72c80ecbf0992b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmV+^1J?YBP)eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00NasL_t(Y$IX??PE%17hQEETiUS+e32~rIyvC?Ch8RVpm~by`PkT;j zORw7j&z)j-*^8ND0U@&jtyZ>lV+EkXy`?J^rloh#iu$ z&<&m^DYtn@v_{xufe3oA*a(5>m+Tm{fuFSpk!W0aUmj=sZ zD$))Ly*QUF-3+Y-7yXRZHSZmJqynXGa0N%mgAY@U_=ETC&mFY6cct2C$CL*z=WFU0 zyyOEBY50nr*M*gSMi|FY*S-awu@#QXLu7m0gerzO$0VZ8;5GO7%(m2K4;#u5wVoxC zvzvEU_{d6~1;98rxQGjf-?nb9bV$^vlqV)P`N=23O}6M6F5zbk6+1R;)7B+%x}pp* zxxp%5S!>APBwRRAxykkFt~&`EZc&zC#>IDXO)YeE;4Bl3xWJA_D6$7TDq*&eEwa$j z8*xyuqX>(%;beeeHrQ)wVPG`Fj|?or=2OFN2JsRh!Y}EO00000NkvXXu0mjfpKDv1 diff --git a/src/olcs/img/right.png b/src/olcs/img/right.png deleted file mode 100644 index f17ce79ee85dc7673330e86c0fac91669a9cc92b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1491 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 diff --git a/src/olcs/img/zoomin.png b/src/olcs/img/zoomin.png deleted file mode 100644 index 77a0d83e8a59ad4587d4bc32ef693ef89ff3df3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 836 zcmV-K1H1f*P)qYe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00OK@L_t(I%dJ&CPbxtaJ+scP zV1;I^Z80=-*zr-(>>t?5#F&@}2`2WqKfuIfwIIf*4K2ksG^|jeosGd3E!ij)uFkS! zwIlO@_blG6COfm|o;mm4Geii1MbYc^M5oii^Yb%CqY(gLb8{2h+uJCWO33H)WYK@* zPr!$V2T`xr;rl))r3;gVVF<<;Y}-aImm^C7&(F`r<>e)k$s~RgK@ebne;K^jP#E6d-;0BT10)g&dDt)v z)M_=DrU_lw0RWtHxUP${vom~seJM;EjRtbL93esol*?r?9*^aLt*tFIn@y~&tSr^g zvMjv3yvT2LO3`dKVHk$o^L-z^UQcMA=gDeDQG}zT zBZV0u1er_*nM?+R{1lW@idwBEHKmlo^E_yS!9X7R`1pWnnsdx_U6(q}?wO{EAPD65 z!C(M7d)J#_;<33IKS2e@7UG zpp-%gA(>>eSpdM}uB-HJ zI-Lf&ySo#|$H!8;)zwvao~N`;3^2Q%PNygqi&DQZ3~_pT3awBm5XP9y^7;7*%d#+? zPUo1;f?1ZOObcTS`Fx&e08p>jmGTdVLzGG-v|25MVW><F2t*tY#EgFQJp!OqSO`Kx2c(d~BS6A(`mV@y5)g+gKB6YveB@n2XqA;*sZ O0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00PxXL_t(I%dJ#BPvbxkee2kJ zS*n1bLKYOHA`$<9NOT4a1tLW{x(HE(HhkDV0ktJWgM_F+A{{bc9lCUsk)c8qKp7OE zNpkVWUUBkX63C&GZYpbL_Icj!n@7+Uhlht`X=#aDmSq4iZ*Ol=tyTd5LqkJIr_lHEK!NCD(G#bYK{{Ch=7^M`2LIJw2Ls687DjdgwZQE$IS{;+-^ZDtrqU??xLxXNF)U9YPI@D zHvcQ+!NEa1KR*KiUSD6~`#xk@2IpK%@)>192t3cj+uIxZ`ufCbN~u&zG{)m`IF2JI z_ll_II1b|RxX7ncDM+5@ZF-)^0YH)@*tU%z2)?8i1OaT@h9pTsHULb*Ij7ld_Gi0D zzY=y31jyxbXkUg%*fCXA!{Om!+}zw`B0avpzvJlW2#G`j$z)PY;rl*LPfwB0=TWQG zI#zFCVd4AY;^Gg|ZVp#hSLt@k3d0c1W)uDW{Q!Vktp>)J_(4Qf(=>N`dwb%8eHDwv z%Guf3KiSvp?5w-9voq1tV0U+S&2qVHJUl%7)nLcQ#>nL4q_wiL(qXV4gv}VUN~O{_ zP16ib)1ay<7-L|JK~+^uPfufJX2vX)N`x_Hb)WwQ)qqL