Add existing to tracked
This commit is contained in:
+118
@@ -0,0 +1,118 @@
|
||||
.cesium-viewer {
|
||||
font-family: sans-serif;
|
||||
font-size: 16px;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.cesium-viewer-cesiumWidgetContainer {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.cesium-viewer-bottom {
|
||||
display: block;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.cesium-viewer .cesium-widget-credits {
|
||||
display: inline;
|
||||
position: static;
|
||||
bottom: auto;
|
||||
left: auto;
|
||||
padding-right: 0;
|
||||
color: #ffffff;
|
||||
font-size: 10px;
|
||||
text-shadow: 0 0 2px #000000;
|
||||
}
|
||||
|
||||
.cesium-viewer-timelineContainer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 169px;
|
||||
right: 29px;
|
||||
height: 27px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.cesium-viewer-animationContainer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding: 0;
|
||||
width: 169px;
|
||||
height: 112px;
|
||||
}
|
||||
|
||||
.cesium-viewer-fullscreenContainer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
padding: 0;
|
||||
width: 29px;
|
||||
height: 29px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.cesium-viewer-vrContainer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
padding: 0;
|
||||
width: 29px;
|
||||
height: 29px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.cesium-viewer-toolbar {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
}
|
||||
|
||||
.cesium-viewer-cesiumInspectorContainer {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
.cesium-viewer-geocoderContainer {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
margin: 0 3px;
|
||||
}
|
||||
|
||||
.cesium-viewer-cesium3DTilesInspectorContainer {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
right: 10px;
|
||||
max-height: calc(100% - 120px);
|
||||
box-sizing: border-box;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.cesium-viewer-voxelInspectorContainer {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
right: 10px;
|
||||
max-height: calc(100% - 120px);
|
||||
box-sizing: border-box;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
+2084
File diff suppressed because it is too large
Load Diff
+37
@@ -0,0 +1,37 @@
|
||||
import { Check } from "@cesium/engine";
|
||||
import Cesium3DTilesInspector from "../Cesium3DTilesInspector/Cesium3DTilesInspector.js";
|
||||
|
||||
/**
|
||||
* A mixin which adds the {@link Cesium3DTilesInspector} widget to the {@link Viewer} widget.
|
||||
* Rather than being called directly, this function is normally passed as
|
||||
* a parameter to {@link Viewer#extend}, as shown in the example below.
|
||||
* @function
|
||||
*
|
||||
* @param {Viewer} viewer The viewer instance.
|
||||
*
|
||||
* @example
|
||||
* const viewer = new Cesium.Viewer('cesiumContainer');
|
||||
* viewer.extend(Cesium.viewerCesium3DTilesInspectorMixin);
|
||||
*/
|
||||
function viewerCesium3DTilesInspectorMixin(viewer) {
|
||||
//>>includeStart('debug', pragmas.debug);
|
||||
Check.typeOf.object("viewer", viewer);
|
||||
//>>includeEnd('debug');
|
||||
|
||||
const container = document.createElement("div");
|
||||
container.className = "cesium-viewer-cesium3DTilesInspectorContainer";
|
||||
viewer.container.appendChild(container);
|
||||
const cesium3DTilesInspector = new Cesium3DTilesInspector(
|
||||
container,
|
||||
viewer.scene,
|
||||
);
|
||||
|
||||
Object.defineProperties(viewer, {
|
||||
cesium3DTilesInspector: {
|
||||
get: function () {
|
||||
return cesium3DTilesInspector;
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
export default viewerCesium3DTilesInspectorMixin;
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
import { defined, DeveloperError } from "@cesium/engine";
|
||||
import CesiumInspector from "../CesiumInspector/CesiumInspector.js";
|
||||
|
||||
/**
|
||||
* A mixin which adds the CesiumInspector widget to the Viewer widget.
|
||||
* Rather than being called directly, this function is normally passed as
|
||||
* a parameter to {@link Viewer#extend}, as shown in the example below.
|
||||
* @function
|
||||
*
|
||||
* @param {Viewer} viewer The viewer instance.
|
||||
*
|
||||
* @exception {DeveloperError} viewer is required.
|
||||
*
|
||||
* @demo {@link https://sandcastle.cesium.com/index.html?id=cesium-inspector|Cesium Sandcastle Cesium Inspector Demo}
|
||||
*
|
||||
* @example
|
||||
* const viewer = new Cesium.Viewer('cesiumContainer');
|
||||
* viewer.extend(Cesium.viewerCesiumInspectorMixin);
|
||||
*/
|
||||
function viewerCesiumInspectorMixin(viewer) {
|
||||
//>>includeStart('debug', pragmas.debug);
|
||||
if (!defined(viewer)) {
|
||||
throw new DeveloperError("viewer is required.");
|
||||
}
|
||||
//>>includeEnd('debug');
|
||||
|
||||
const cesiumInspectorContainer = document.createElement("div");
|
||||
cesiumInspectorContainer.className = "cesium-viewer-cesiumInspectorContainer";
|
||||
viewer.container.appendChild(cesiumInspectorContainer);
|
||||
const cesiumInspector = new CesiumInspector(
|
||||
cesiumInspectorContainer,
|
||||
viewer.scene,
|
||||
);
|
||||
|
||||
Object.defineProperties(viewer, {
|
||||
cesiumInspector: {
|
||||
get: function () {
|
||||
return cesiumInspector;
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
export default viewerCesiumInspectorMixin;
|
||||
+314
@@ -0,0 +1,314 @@
|
||||
import {
|
||||
CzmlDataSource,
|
||||
Frozen,
|
||||
defined,
|
||||
DeveloperError,
|
||||
Event,
|
||||
GeoJsonDataSource,
|
||||
getElement,
|
||||
GpxDataSource,
|
||||
KmlDataSource,
|
||||
wrapFunction,
|
||||
} from "@cesium/engine";
|
||||
/**
|
||||
* A mixin which adds default drag and drop support for CZML files to the Viewer widget.
|
||||
* Rather than being called directly, this function is normally passed as
|
||||
* a parameter to {@link Viewer#extend}, as shown in the example below.
|
||||
* @function viewerDragDropMixin
|
||||
|
||||
* @param {Viewer} viewer The viewer instance.
|
||||
* @param {object} [options] Object with the following properties:
|
||||
* @param {Element|string} [options.dropTarget=viewer.container] The DOM element which will serve as the drop target.
|
||||
* @param {boolean} [options.clearOnDrop=true] When true, dropping files will clear all existing data sources first, when false, new data sources will be loaded after the existing ones.
|
||||
* @param {boolean} [options.flyToOnDrop=true] When true, dropping files will fly to the data source once it is loaded.
|
||||
* @param {boolean} [options.clampToGround=true] When true, datasources are clamped to the ground.
|
||||
* @param {Proxy} [options.proxy] The proxy to be used for KML network links.
|
||||
*
|
||||
* @exception {DeveloperError} Element with id <options.dropTarget> does not exist in the document.
|
||||
* @exception {DeveloperError} dropTarget is already defined by another mixin.
|
||||
* @exception {DeveloperError} dropEnabled is already defined by another mixin.
|
||||
* @exception {DeveloperError} dropError is already defined by another mixin.
|
||||
* @exception {DeveloperError} clearOnDrop is already defined by another mixin.
|
||||
*
|
||||
* @example
|
||||
* // Add basic drag and drop support and pop up an alert window on error.
|
||||
* const viewer = new Cesium.Viewer('cesiumContainer');
|
||||
* viewer.extend(Cesium.viewerDragDropMixin);
|
||||
* viewer.dropError.addEventListener(function(viewerArg, source, error) {
|
||||
* window.alert('Error processing ' + source + ':' + error);
|
||||
* });
|
||||
*/
|
||||
function viewerDragDropMixin(viewer, options) {
|
||||
//>>includeStart('debug', pragmas.debug);
|
||||
if (!defined(viewer)) {
|
||||
throw new DeveloperError("viewer is required.");
|
||||
}
|
||||
if (viewer.hasOwnProperty("dropTarget")) {
|
||||
throw new DeveloperError("dropTarget is already defined by another mixin.");
|
||||
}
|
||||
if (viewer.hasOwnProperty("dropEnabled")) {
|
||||
throw new DeveloperError(
|
||||
"dropEnabled is already defined by another mixin.",
|
||||
);
|
||||
}
|
||||
if (viewer.hasOwnProperty("dropError")) {
|
||||
throw new DeveloperError("dropError is already defined by another mixin.");
|
||||
}
|
||||
if (viewer.hasOwnProperty("clearOnDrop")) {
|
||||
throw new DeveloperError(
|
||||
"clearOnDrop is already defined by another mixin.",
|
||||
);
|
||||
}
|
||||
if (viewer.hasOwnProperty("flyToOnDrop")) {
|
||||
throw new DeveloperError(
|
||||
"flyToOnDrop is already defined by another mixin.",
|
||||
);
|
||||
}
|
||||
//>>includeEnd('debug');
|
||||
|
||||
options = options ?? Frozen.EMPTY_OBJECT;
|
||||
|
||||
//Local variables to be closed over by defineProperties.
|
||||
let dropEnabled = true;
|
||||
let flyToOnDrop = options.flyToOnDrop ?? true;
|
||||
const dropError = new Event();
|
||||
let clearOnDrop = options.clearOnDrop ?? true;
|
||||
let dropTarget = options.dropTarget ?? viewer.container;
|
||||
let clampToGround = options.clampToGround ?? true;
|
||||
let proxy = options.proxy;
|
||||
|
||||
dropTarget = getElement(dropTarget);
|
||||
|
||||
Object.defineProperties(viewer, {
|
||||
/**
|
||||
* Gets or sets the element to serve as the drop target.
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {Element}
|
||||
*/
|
||||
dropTarget: {
|
||||
//TODO See https://github.com/CesiumGS/cesium/issues/832
|
||||
get: function () {
|
||||
return dropTarget;
|
||||
},
|
||||
set: function (value) {
|
||||
//>>includeStart('debug', pragmas.debug);
|
||||
if (!defined(value)) {
|
||||
throw new DeveloperError("value is required.");
|
||||
}
|
||||
//>>includeEnd('debug');
|
||||
|
||||
unsubscribe(dropTarget, handleDrop);
|
||||
dropTarget = value;
|
||||
subscribe(dropTarget, handleDrop);
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets or sets a value indicating if drag and drop support is enabled.
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {Element}
|
||||
*/
|
||||
dropEnabled: {
|
||||
get: function () {
|
||||
return dropEnabled;
|
||||
},
|
||||
set: function (value) {
|
||||
if (value !== dropEnabled) {
|
||||
if (value) {
|
||||
subscribe(dropTarget, handleDrop);
|
||||
} else {
|
||||
unsubscribe(dropTarget, handleDrop);
|
||||
}
|
||||
dropEnabled = value;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the event that will be raised when an error is encountered during drop processing.
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {Event}
|
||||
*/
|
||||
dropError: {
|
||||
get: function () {
|
||||
return dropError;
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets or sets a value indicating if existing data sources should be cleared before adding the newly dropped sources.
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {boolean}
|
||||
*/
|
||||
clearOnDrop: {
|
||||
get: function () {
|
||||
return clearOnDrop;
|
||||
},
|
||||
set: function (value) {
|
||||
clearOnDrop = value;
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets or sets a value indicating if the camera should fly to the data source after it is loaded.
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {boolean}
|
||||
*/
|
||||
flyToOnDrop: {
|
||||
get: function () {
|
||||
return flyToOnDrop;
|
||||
},
|
||||
set: function (value) {
|
||||
flyToOnDrop = value;
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets or sets the proxy to be used for KML.
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {Proxy}
|
||||
*/
|
||||
proxy: {
|
||||
get: function () {
|
||||
return proxy;
|
||||
},
|
||||
set: function (value) {
|
||||
proxy = value;
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets or sets a value indicating if the datasources should be clamped to the ground
|
||||
* @memberof viewerDragDropMixin.prototype
|
||||
* @type {boolean}
|
||||
*/
|
||||
clampToGround: {
|
||||
get: function () {
|
||||
return clampToGround;
|
||||
},
|
||||
set: function (value) {
|
||||
clampToGround = value;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
function handleDrop(event) {
|
||||
stop(event);
|
||||
|
||||
if (clearOnDrop) {
|
||||
viewer.entities.removeAll();
|
||||
viewer.dataSources.removeAll();
|
||||
}
|
||||
|
||||
const files = event.dataTransfer.files;
|
||||
const length = files.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
const file = files[i];
|
||||
const reader = new FileReader();
|
||||
reader.onload = createOnLoadCallback(viewer, file, proxy, clampToGround);
|
||||
reader.onerror = createDropErrorCallback(viewer, file);
|
||||
reader.readAsText(file);
|
||||
}
|
||||
}
|
||||
|
||||
//Enable drop by default;
|
||||
subscribe(dropTarget, handleDrop);
|
||||
|
||||
//Wrap the destroy function to make sure all events are unsubscribed from
|
||||
viewer.destroy = wrapFunction(viewer, viewer.destroy, function () {
|
||||
viewer.dropEnabled = false;
|
||||
});
|
||||
|
||||
//Specs need access to handleDrop
|
||||
viewer._handleDrop = handleDrop;
|
||||
}
|
||||
|
||||
function stop(event) {
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
function unsubscribe(dropTarget, handleDrop) {
|
||||
const currentTarget = dropTarget;
|
||||
if (defined(currentTarget)) {
|
||||
currentTarget.removeEventListener("drop", handleDrop, false);
|
||||
currentTarget.removeEventListener("dragenter", stop, false);
|
||||
currentTarget.removeEventListener("dragover", stop, false);
|
||||
currentTarget.removeEventListener("dragexit", stop, false);
|
||||
}
|
||||
}
|
||||
|
||||
function subscribe(dropTarget, handleDrop) {
|
||||
dropTarget.addEventListener("drop", handleDrop, false);
|
||||
dropTarget.addEventListener("dragenter", stop, false);
|
||||
dropTarget.addEventListener("dragover", stop, false);
|
||||
dropTarget.addEventListener("dragexit", stop, false);
|
||||
}
|
||||
|
||||
function createOnLoadCallback(viewer, file, proxy, clampToGround) {
|
||||
const scene = viewer.scene;
|
||||
return function (evt) {
|
||||
const fileName = file.name;
|
||||
try {
|
||||
let loadPromise;
|
||||
|
||||
if (/\.czml$/i.test(fileName)) {
|
||||
loadPromise = CzmlDataSource.load(JSON.parse(evt.target.result), {
|
||||
sourceUri: fileName,
|
||||
});
|
||||
} else if (
|
||||
/\.geojson$/i.test(fileName) ||
|
||||
/\.json$/i.test(fileName) ||
|
||||
/\.topojson$/i.test(fileName)
|
||||
) {
|
||||
loadPromise = GeoJsonDataSource.load(JSON.parse(evt.target.result), {
|
||||
sourceUri: fileName,
|
||||
clampToGround: clampToGround,
|
||||
});
|
||||
} else if (/\.(kml|kmz)$/i.test(fileName)) {
|
||||
loadPromise = KmlDataSource.load(file, {
|
||||
sourceUri: fileName,
|
||||
proxy: proxy,
|
||||
camera: scene.camera,
|
||||
canvas: scene.canvas,
|
||||
clampToGround: clampToGround,
|
||||
screenOverlayContainer: viewer.container,
|
||||
});
|
||||
} else if (/\.gpx$/i.test(fileName)) {
|
||||
loadPromise = GpxDataSource.load(file, {
|
||||
sourceUri: fileName,
|
||||
proxy: proxy,
|
||||
});
|
||||
} else {
|
||||
viewer.dropError.raiseEvent(
|
||||
viewer,
|
||||
fileName,
|
||||
`Unrecognized file: ${fileName}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (defined(loadPromise)) {
|
||||
viewer.dataSources
|
||||
.add(loadPromise)
|
||||
.then(function (dataSource) {
|
||||
if (viewer.flyToOnDrop) {
|
||||
viewer.flyTo(dataSource);
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
viewer.dropError.raiseEvent(viewer, fileName, error);
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
viewer.dropError.raiseEvent(viewer, fileName, error);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function createDropErrorCallback(viewer, file) {
|
||||
return function (evt) {
|
||||
viewer.dropError.raiseEvent(viewer, file.name, evt.target.error);
|
||||
};
|
||||
}
|
||||
export default viewerDragDropMixin;
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
import { Frozen, defined, DeveloperError } from "@cesium/engine";
|
||||
import PerformanceWatchdog from "../PerformanceWatchdog/PerformanceWatchdog.js";
|
||||
|
||||
/**
|
||||
* A mixin which adds the {@link PerformanceWatchdog} widget to the {@link Viewer} widget.
|
||||
* Rather than being called directly, this function is normally passed as
|
||||
* a parameter to {@link Viewer#extend}, as shown in the example below.
|
||||
* @function
|
||||
*
|
||||
* @param {Viewer} viewer The viewer instance.
|
||||
* @param {object} [options] An object with properties.
|
||||
* @param {string} [options.lowFrameRateMessage='This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] The
|
||||
* message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure
|
||||
* it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks.
|
||||
*
|
||||
* @exception {DeveloperError} viewer is required.
|
||||
*
|
||||
* @example
|
||||
* const viewer = new Cesium.Viewer('cesiumContainer');
|
||||
* viewer.extend(Cesium.viewerPerformanceWatchdogMixin, {
|
||||
* lowFrameRateMessage : 'Why is this going so <em>slowly</em>?'
|
||||
* });
|
||||
*/
|
||||
function viewerPerformanceWatchdogMixin(viewer, options) {
|
||||
//>>includeStart('debug', pragmas.debug);
|
||||
if (!defined(viewer)) {
|
||||
throw new DeveloperError("viewer is required.");
|
||||
}
|
||||
//>>includeEnd('debug');
|
||||
|
||||
options = options ?? Frozen.EMPTY_OBJECT;
|
||||
|
||||
const performanceWatchdog = new PerformanceWatchdog({
|
||||
scene: viewer.scene,
|
||||
container: viewer.bottomContainer,
|
||||
lowFrameRateMessage: options.lowFrameRateMessage,
|
||||
});
|
||||
|
||||
Object.defineProperties(viewer, {
|
||||
performanceWatchdog: {
|
||||
get: function () {
|
||||
return performanceWatchdog;
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
export default viewerPerformanceWatchdogMixin;
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
import { Check } from "@cesium/engine";
|
||||
import VoxelInspector from "../VoxelInspector/VoxelInspector.js";
|
||||
|
||||
/**
|
||||
* A mixin which adds the {@link VoxelInspector} widget to the {@link Viewer} widget.
|
||||
* Rather than being called directly, this function is normally passed as
|
||||
* a parameter to {@link Viewer#extend}, as shown in the example below.
|
||||
* @function
|
||||
*
|
||||
* @param {Viewer} viewer The viewer instance.
|
||||
*
|
||||
* @example
|
||||
* var viewer = new Cesium.Viewer('cesiumContainer');
|
||||
* viewer.extend(Cesium.viewerVoxelInspectorMixin);
|
||||
*/
|
||||
function viewerVoxelInspectorMixin(viewer) {
|
||||
//>>includeStart('debug', pragmas.debug);
|
||||
Check.typeOf.object("viewer", viewer);
|
||||
//>>includeEnd('debug');
|
||||
|
||||
const container = document.createElement("div");
|
||||
container.className = "cesium-viewer-voxelInspectorContainer";
|
||||
viewer.container.appendChild(container);
|
||||
const voxelInspector = new VoxelInspector(container, viewer.scene);
|
||||
|
||||
Object.defineProperties(viewer, {
|
||||
voxelInspector: {
|
||||
get: function () {
|
||||
return voxelInspector;
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
export default viewerVoxelInspectorMixin;
|
||||
Reference in New Issue
Block a user