Add existing to tracked

This commit is contained in:
Jay
2026-08-11 09:53:42 -04:00
parent afe07f3055
commit ffd6e3d73c
8531 changed files with 4396230 additions and 0 deletions
+118
View File
@@ -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;
}
File diff suppressed because it is too large Load Diff
@@ -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;
@@ -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
View File
@@ -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;
@@ -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;
@@ -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;