mirror of
https://github.com/ethan-zf/cesium-plot-js.git
synced 2025-06-24 03:27:29 +00:00
Allow the entire shape to be dragged while in edit mode.
This commit is contained in:
parent
6ad3734914
commit
ab6fe42235
79
src/base.ts
79
src/base.ts
@ -18,6 +18,9 @@ export default class Base {
|
|||||||
style: GeometryStyle | undefined;
|
style: GeometryStyle | undefined;
|
||||||
outlineEntity: CesiumTypeOnly.Entity;
|
outlineEntity: CesiumTypeOnly.Entity;
|
||||||
eventDispatcher: EventDispatcher;
|
eventDispatcher: EventDispatcher;
|
||||||
|
dragEventHandler: CesiumTypeOnly.ScreenSpaceEventHandler;
|
||||||
|
entityId: string = '';
|
||||||
|
points: CesiumTypeOnly.Cartesian3[] = [];
|
||||||
|
|
||||||
constructor(cesium: CesiumTypeOnly, viewer: CesiumTypeOnly.Viewer, style?: GeometryStyle) {
|
constructor(cesium: CesiumTypeOnly, viewer: CesiumTypeOnly.Viewer, style?: GeometryStyle) {
|
||||||
this.cesium = cesium;
|
this.cesium = cesium;
|
||||||
@ -87,11 +90,13 @@ export default class Base {
|
|||||||
if (!cartesian) {
|
if (!cartesian) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// "For non-freehand drawn shapes, validate that the distance between two consecutive clicks is greater than 10 meters
|
// "For non-freehand drawn shapes, validate that the distance between two consecutive clicks is greater than 10 meters
|
||||||
if (!this.freehand && points.length > 0 && !this.checkDistance(cartesian, points[points.length - 1])) {
|
if (!this.freehand && points.length > 0 && !this.checkDistance(cartesian, points[points.length - 1])) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.addPoint(cartesian);
|
this.addPoint(cartesian);
|
||||||
|
|
||||||
// Trigger 'drawStart' when the first point is being drawn.
|
// Trigger 'drawStart' when the first point is being drawn.
|
||||||
if (this.getPoints().length === 1) {
|
if (this.getPoints().length === 1) {
|
||||||
this.eventDispatcher.dispatchEvent('drawStart');
|
this.eventDispatcher.dispatchEvent('drawStart');
|
||||||
@ -102,6 +107,7 @@ export default class Base {
|
|||||||
if (!hitEntities || activeEntity.id !== pickedObject.id.id) {
|
if (!hitEntities || activeEntity.id !== pickedObject.id.id) {
|
||||||
this.setState('static');
|
this.setState('static');
|
||||||
this.removeControlPoints();
|
this.removeControlPoints();
|
||||||
|
this.disableDrag();
|
||||||
// Trigger 'drawEnd' and return the geometry shape points when exiting the edit mode.
|
// Trigger 'drawEnd' and return the geometry shape points when exiting the edit mode.
|
||||||
this.eventDispatcher.dispatchEvent('drawEnd', this.getPoints());
|
this.eventDispatcher.dispatchEvent('drawEnd', this.getPoints());
|
||||||
}
|
}
|
||||||
@ -113,6 +119,7 @@ export default class Base {
|
|||||||
// Hit Geometry Shape.
|
// Hit Geometry Shape.
|
||||||
this.setState('edit');
|
this.setState('edit');
|
||||||
this.addControlPoints();
|
this.addControlPoints();
|
||||||
|
this.draggable();
|
||||||
this.eventDispatcher.dispatchEvent('editStart');
|
this.eventDispatcher.dispatchEvent('editStart');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,7 +158,8 @@ export default class Base {
|
|||||||
finishDrawing() {
|
finishDrawing() {
|
||||||
this.removeMoveListener();
|
this.removeMoveListener();
|
||||||
this.setState('static');
|
this.setState('static');
|
||||||
|
const entity = this.polygonEntity || this.lineEntity;
|
||||||
|
this.entityId = entity.id;
|
||||||
/**
|
/**
|
||||||
* "I've noticed that CallbackProperty can lead to significant performance issues.
|
* "I've noticed that CallbackProperty can lead to significant performance issues.
|
||||||
* After drawing multiple shapes, the map becomes noticeably laggy. Using methods
|
* After drawing multiple shapes, the map becomes noticeably laggy. Using methods
|
||||||
@ -293,6 +301,7 @@ export default class Base {
|
|||||||
let dragStartPosition: CesiumTypeOnly.Cartesian3;
|
let dragStartPosition: CesiumTypeOnly.Cartesian3;
|
||||||
|
|
||||||
this.controlPointsEventHandler = new this.cesium.ScreenSpaceEventHandler(this.viewer.canvas);
|
this.controlPointsEventHandler = new this.cesium.ScreenSpaceEventHandler(this.viewer.canvas);
|
||||||
|
|
||||||
// Listen for left mouse button press events
|
// Listen for left mouse button press events
|
||||||
this.controlPointsEventHandler.setInputAction((clickEvent: any) => {
|
this.controlPointsEventHandler.setInputAction((clickEvent: any) => {
|
||||||
const pickedObject = this.viewer.scene.pick(clickEvent.position);
|
const pickedObject = this.viewer.scene.pick(clickEvent.position);
|
||||||
@ -347,6 +356,74 @@ export default class Base {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow the entire shape to be dragged while in edit mode.
|
||||||
|
*/
|
||||||
|
draggable() {
|
||||||
|
let dragging = false;
|
||||||
|
let startPosition: CesiumTypeOnly.Cartesian3 | undefined;
|
||||||
|
this.dragEventHandler = new this.cesium.ScreenSpaceEventHandler(this.viewer.canvas);
|
||||||
|
this.dragEventHandler.setInputAction((event: any) => {
|
||||||
|
const pickRay = this.viewer.scene.camera.getPickRay(event.position);
|
||||||
|
if (pickRay) {
|
||||||
|
const cartesian = this.viewer.scene.globe.pick(pickRay, this.viewer.scene);
|
||||||
|
const pickedObject = this.viewer.scene.pick(event.position);
|
||||||
|
if (this.cesium.defined(pickedObject) && pickedObject.id instanceof CesiumTypeOnly.Entity) {
|
||||||
|
const clickedEntity = pickedObject.id;
|
||||||
|
if (clickedEntity.id == this.entityId) {
|
||||||
|
//Clicking on the current instance's entity initiates drag logic.
|
||||||
|
dragging = true;
|
||||||
|
startPosition = cartesian;
|
||||||
|
this.viewer.scene.screenSpaceCameraController.enableRotate = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, this.cesium.ScreenSpaceEventType.LEFT_DOWN);
|
||||||
|
|
||||||
|
this.dragEventHandler.setInputAction((event: any) => {
|
||||||
|
if (dragging && startPosition) {
|
||||||
|
// Retrieve the world coordinates of the current mouse position.
|
||||||
|
const newPosition = this.pixelToCartesian(event.endPosition);
|
||||||
|
if (newPosition) {
|
||||||
|
// Calculate the displacement vector.
|
||||||
|
const translation = this.cesium.Cartesian3.subtract(newPosition, startPosition, new this.cesium.Cartesian3());
|
||||||
|
const newPoints = this.geometryPoints.map((p) => {
|
||||||
|
return this.cesium.Cartesian3.add(p, translation, new this.cesium.Cartesian3());
|
||||||
|
});
|
||||||
|
|
||||||
|
//Move all key points according to a vector.
|
||||||
|
this.points = this.points.map((p) => {
|
||||||
|
return this.cesium.Cartesian3.add(p, translation, new this.cesium.Cartesian3());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Move control points in the same manner.
|
||||||
|
this.controlPoints.map((p: CesiumTypeOnly.Entity) => {
|
||||||
|
const position = p.position?.getValue(this.cesium.JulianDate.now());
|
||||||
|
const newPosition = this.cesium.Cartesian3.add(position, translation, new this.cesium.Cartesian3());
|
||||||
|
p.position?.setValue(newPosition);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.setGeometryPoints(newPoints);
|
||||||
|
startPosition = newPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, this.cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
||||||
|
|
||||||
|
// Listen for the mouse release event to end dragging.
|
||||||
|
this.dragEventHandler.setInputAction(() => {
|
||||||
|
dragging = false;
|
||||||
|
startPosition = undefined;
|
||||||
|
this.viewer.scene.screenSpaceCameraController.enableRotate = true;
|
||||||
|
}, this.cesium.ScreenSpaceEventType.LEFT_UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finish editing, disable dragging."
|
||||||
|
disableDrag() {
|
||||||
|
this.dragEventHandler.removeInputAction(this.cesium.ScreenSpaceEventType.LEFT_DOWN);
|
||||||
|
this.dragEventHandler.removeInputAction(this.cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
||||||
|
this.dragEventHandler.removeInputAction(this.cesium.ScreenSpaceEventType.LEFT_UP);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uncertain whether it's a Cesium bug, but the lines do not render properly when 'clampToGround'
|
* Uncertain whether it's a Cesium bug, but the lines do not render properly when 'clampToGround'
|
||||||
* is not set (display irregularities). After drawing, the camera adjusts its view based on the shape,
|
* is not set (display irregularities). After drawing, the camera adjusts its view based on the shape,
|
||||||
|
Loading…
Reference in New Issue
Block a user