vue-cesium
Version:
Vue 3.x components for CesiumJS.
1,078 lines (1,073 loc) • 46.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var index$7 = require('../../components/ui/index.js');
var index$6 = require('../../components/overlays/index.js');
var index$5 = require('../../components/primitive-collections/index.js');
var index$2 = require('../../components/primitives/index.js');
var index$3 = require('../../components/geometry-instance/index.js');
var index$4 = require('../../components/geometries/index.js');
var index$1 = require('../use-locale/index.js');
require('../../shared/index.js');
var cesiumHelpers = require('../../utils/cesium-helpers.js');
require('../../utils/util.js');
var vue = require('vue');
var index = require('../use-common/index.js');
var useDrawingAction = require('./use-drawing-action.js');
var platform = require('../../utils/platform.js');
var DrawStatus = require('../../shared/src/DrawStatus.js');
var MeasureUnits = require('../../shared/src/MeasureUnits.js');
var lodashUnified = require('lodash-unified');
"use strict";
function useDrawingSegment(props, ctx, cmpName) {
const instance = vue.getCurrentInstance();
const commonState = index["default"](props, ctx, instance);
if (commonState === void 0) {
return;
}
const { t } = index$1.useLocale();
const $services = commonState.$services;
const { emit } = ctx;
const {
drawingType,
drawTip,
drawTipOpts,
drawStatus,
canShowDrawTip,
drawTipPosition,
showEditor,
editorPosition,
mouseoverPoint,
editingPoint,
primitiveCollectionRef,
editorType,
onMouseoverPoints,
onMouseoutPoints,
onMouseenterEditor,
onMouseleaveEditor,
onPrimitiveCollectionReady,
onVcCollectionPointReady,
onVcCollectionLabelReady,
onVcPrimitiveReady
} = useDrawingAction["default"](props, ctx, instance, cmpName, $services);
const renderDatas = vue.ref([]);
if (props.preRenderDatas && props.preRenderDatas.length) {
props.preRenderDatas.forEach((preRenderData) => {
const segmentDrawing = {
positions: cesiumHelpers.makeCartesian3Array(preRenderData),
show: true,
drawStatus: DrawStatus["default"].AfterDraw,
distance: 0,
labels: [],
pointOpts: {},
labelOpts: {},
labelsOpts: {},
polylineOpts: {},
primitiveOpts: {},
polygonOpts: {}
};
cmpName === "VcMeasurementVertical" && Object.assign(segmentDrawing, {
draggingPlane: new Cesium.Plane(Cesium.Cartesian3.UNIT_X, 0),
surfaceNormal: new Cesium.Cartesian3()
});
renderDatas.value.push(segmentDrawing);
});
}
let restorePosition;
const computedRenderDatas = vue.computed(() => {
const polylines = [];
const { Cartesian3, Cartographic, Rectangle, createGuid, defined, Math: CesiumMath, Ray } = Cesium;
const { viewer } = $services;
const angleFormatter = props.angleFormatter || MeasureUnits["default"].angleToString;
const distanceFormatter = props.distanceFormatter || MeasureUnits["default"].distanceToString;
const areaFormatter = props.areaFormatter || MeasureUnits["default"].areaToString;
renderDatas.value.forEach((polylineSegment) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
const startPosition = polylineSegment.positions[0];
const endPosition = polylineSegment.positions[1];
if (Cartesian3.equals(startPosition, endPosition)) {
return;
}
const labels = vue.reactive([]);
const distances = [];
const angles = [];
const distance = ((_a = props.polylineOpts) == null ? void 0 : _a.arcType) === 0 ? Cartesian3.distance(startPosition, endPosition) : cesiumHelpers.getGeodesicDistance(startPosition, endPosition, $services.viewer.scene.globe.ellipsoid);
const labelPosition = Cartesian3.midpoint(startPosition, endPosition, {});
const heading = cesiumHelpers.getPolylineSegmentHeading(startPosition, endPosition);
const pitch = cesiumHelpers.getPolylineSegmentPitch(startPosition, endPosition);
polylineSegment.points = polylineSegment.positions.map((v) => {
return {
position: v
};
});
const polyline = {
...polylineSegment,
distance,
heading,
pitch
};
const labelOpts = Object.assign({}, props.labelOpts, polyline.labelOpts);
if (cmpName === "VcDrawingRectangle" || cmpName === "VcMeasurementRectangle") {
const startCartographic = Cartographic.fromCartesian(startPosition, viewer.scene.globe.ellipsoid);
const endCartographic = Cartographic.fromCartesian(endPosition, viewer.scene.globe.ellipsoid);
const height = startCartographic.height;
!props.clampToGround && (endCartographic.height = height);
const rectangle = Rectangle.fromCartesianArray(polylineSegment.positions, viewer.scene.globe.ellipsoid);
const rectangleArr = [
rectangle.west,
rectangle.north,
height,
rectangle.east,
rectangle.north,
height,
rectangle.east,
rectangle.south,
height,
rectangle.west,
rectangle.south,
height,
rectangle.west,
rectangle.north,
height
];
const polygonPositions = Cartesian3.fromRadiansArrayHeights(rectangleArr, viewer.scene.globe.ellipsoid);
Object.assign(polyline, {
polygonPositions,
height
});
} else if (cmpName === "VcDrawingRegular" || cmpName === "VcMeasurementRegular") {
const startPosition2 = polylineSegment.positions[0];
const endPosition2 = polylineSegment.positions[1];
const hpr = cesiumHelpers.getHeadingPitchRoll(startPosition2, endPosition2, viewer.scene);
if (!lodashUnified.isUndefined(hpr) && defined(hpr)) {
const polygonPositions = [];
const startCartographic = Cartographic.fromCartesian(startPosition2, viewer.scene.globe.ellipsoid);
const endCartographic = Cartographic.fromCartesian(endPosition2, viewer.scene.globe.ellipsoid);
!props.clampToGround && (endCartographic.height = startCartographic.height);
polygonPositions.push(Cartographic.toCartesian(endCartographic, viewer.scene.globe.ellipsoid));
for (let i = 0; i < (props.edge || 4) - 1; i++) {
const position = cesiumHelpers.getPolylineSegmentEndpoint(
startPosition2,
hpr.heading += Math.PI * 2 / (props.edge || 4),
distance,
viewer.scene.globe.ellipsoid
);
polygonPositions.push(position);
}
Object.assign(polyline, {
polygonPositions,
height: startCartographic.height
});
}
} else if (cmpName === "VcAnalysisViewshed") {
Object.assign(polyline.viewshedOpts, { startPosition, endPosition });
} else if (cmpName === "VcAnalysisSightline") {
if (props.sightlineType === "segment") {
const positionsNew = [];
positionsNew.push(startPosition);
const objectsToExclude = [];
const primitiveCollection = primitiveCollectionRef.value.cesiumObject._primitives;
primitiveCollection.forEach((primitive) => {
if (primitive instanceof Cesium.PointPrimitiveCollection) {
objectsToExclude.push(...primitive._pointPrimitives);
}
if (primitive instanceof Cesium.Primitive) {
objectsToExclude.push(primitive);
}
});
const intersection = cesiumHelpers.getFirstIntersection(startPosition, endPosition, $services.viewer, objectsToExclude);
if (defined(intersection)) {
positionsNew.push(intersection);
}
positionsNew.push(endPosition);
let distance2 = 0;
const distances2 = [];
for (let i = 0; i < positionsNew.length - 1; i++) {
const s = Cartesian3.distance(positionsNew[i], positionsNew[i + 1]);
distances2.push(s);
distance2 = distance2 + s;
}
Object.assign(polyline, {
positions: positionsNew,
distance: distance2
});
} else if (props.sightlineType === "circle") {
}
} else {
labels.push({
position: labelPosition,
id: createGuid(),
text: distanceFormatter(distance, (_b = props.measureUnits) == null ? void 0 : _b.distanceUnits, props.locale, (_c = props.decimals) == null ? void 0 : _c.distance),
...labelOpts
});
}
if (polyline.polygonPositions && polyline.polygonPositions.length) {
const labelsOpts = Object.assign({}, props.labelsOpts, polyline.labelsOpts);
const positions = polyline.polygonPositions.slice();
props.loop && positions.length > 2 && positions.push(positions[0]);
for (let i = 0; i < positions.length - 1; i++) {
let s = 0;
if (((_d = props.polylineOpts) == null ? void 0 : _d.arcType) === 0) {
s = cesiumHelpers.getGeodesicDistance(positions[i], positions[i + 1], $services.viewer.scene.globe.ellipsoid);
} else {
s = Cartesian3.distance(positions[i], positions[i + 1]);
}
distances.push(s);
if (s > 0 && positions.length > 2 && props.showDistanceLabel) {
labels.push({
text: distanceFormatter(s, (_e = props.measureUnits) == null ? void 0 : _e.distanceUnits, props.locale, (_f = props.decimals) == null ? void 0 : _f.distance),
position: Cartesian3.midpoint(positions[i], positions[i + 1], {}),
id: createGuid(),
...labelsOpts
});
}
if (positions.length > 2 && props.showAngleLabel) {
if (i > 0 || props.loop) {
const point0 = positions[i === 0 ? positions.length - 2 : i - 1];
const point1 = positions[i];
const point2 = positions[i + 1];
const diffrence1 = Cartesian3.subtract(point0, point1, {});
const diffrence2 = Cartesian3.subtract(point2, point1, {});
let angle = 0;
if (!(Cartesian3.ZERO.equals(diffrence1) || Cartesian3.ZERO.equals(diffrence2))) {
angle = Cartesian3.angleBetween(diffrence1, diffrence2);
}
angles.push(angle);
labels.push({
text: angleFormatter(angle, (_g = props.measureUnits) == null ? void 0 : _g.angleUnits, props.locale, (_h = props.decimals) == null ? void 0 : _h.angle),
position: point1,
id: createGuid(),
...labelsOpts
});
}
}
}
const area = cesiumHelpers.calculateAreaByPostions(positions);
props.showLabel && labels.push({
text: areaFormatter(area, (_i = props.measureUnits) == null ? void 0 : _i.areaUnits, props.locale, (_j = props.decimals) == null ? void 0 : _j.area),
position: polylineSegment.positions[0],
id: createGuid(),
...labelOpts
});
}
if (props.showComponentLines) {
Object.assign(polyline, {
xyPolylinePositions: [new Cartesian3(), new Cartesian3(), new Cartesian3()],
xyBoxPositions: [new Cartesian3(), new Cartesian3(), new Cartesian3()],
xDistance: 0,
yDistance: 0,
xAngle: 0,
yAngle: 0
});
updateComponents(polyline);
labels.push({
position: polyline.xLabelPosition,
id: createGuid(),
text: distanceFormatter(polyline.xDistance || 0, (_k = props.measureUnits) == null ? void 0 : _k.distanceUnits, props.locale, (_l = props.decimals) == null ? void 0 : _l.distance),
...props.xLabelOpts
});
labels.push({
position: polyline.yLabelPosition,
id: createGuid(),
text: distanceFormatter(polyline.yDistance || 0, (_m = props.measureUnits) == null ? void 0 : _m.distanceUnits, props.locale, (_n = props.decimals) == null ? void 0 : _n.distance),
...props.yLabelOpts
});
labels.push({
position: polyline.xAnglePosition,
id: createGuid(),
text: angleFormatter(polyline.xAngle || 0, (_o = props.measureUnits) == null ? void 0 : _o.angleUnits, props.locale, (_p = props.decimals) == null ? void 0 : _p.angle),
...props.xAngleLabelOpts
});
labels.push({
position: polyline.yAnglePosition,
id: createGuid(),
text: angleFormatter(polyline.yAngle || 0, (_q = props.measureUnits) == null ? void 0 : _q.angleUnits, props.locale, (_r = props.decimals) == null ? void 0 : _r.angle),
...props.yAngleLabelOpts
});
}
Object.assign(polyline, {
labels
});
polyline.positionsDegreesArray = polyline.positions.map((v) => {
const cart = Cesium.Cartographic.fromCartesian(v, viewer.scene.globe.ellipsoid);
return [CesiumMath.toDegrees(cart.longitude), CesiumMath.toDegrees(cart.latitude), cart.height];
});
((_s = polyline == null ? void 0 : polyline.polygonPositions) == null ? void 0 : _s.length) && (polyline.polygonPositionsDegreesArray = polyline.polygonPositions.map((v) => {
const cart = Cesium.Cartographic.fromCartesian(v, viewer.scene.globe.ellipsoid);
return [CesiumMath.toDegrees(cart.longitude), CesiumMath.toDegrees(cart.latitude), cart.height];
}));
polylines.push(polyline);
});
return polylines;
});
instance.createCesiumObject = async () => {
return primitiveCollectionRef;
};
instance.mount = async () => {
const { viewer } = $services;
if (props.autoUpdateLabelPosition) {
cmpName === "VcMeasurementDistance" && viewer.scene.preRender.addEventListener(updateLabelPosition);
(cmpName === "VcMeasurementRegular" || cmpName === "VcMeasurementRectangle" || cmpName === "VcDrawingRegular" || cmpName === "VcDrawingRectangle") && viewer.scene.preRender.addEventListener(updateLabelPositionPolygon);
}
return true;
};
instance.unmount = async () => {
const { viewer } = $services;
if (props.autoUpdateLabelPosition) {
cmpName === "VcMeasurementDistance" && viewer.scene.preRender.removeEventListener(updateLabelPosition);
(cmpName === "VcMeasurementRegular" || cmpName === "VcMeasurementRectangle" || cmpName === "VcDrawingRegular" || cmpName === "VcDrawingRectangle") && viewer.scene.preRender.removeEventListener(updateLabelPositionPolygon);
}
return true;
};
const getHeightPosition = (polyline, movement) => {
const { defined, SceneMode, Cartesian3, IntersectionTests, Plane, SceneTransforms, Ray } = Cesium;
const { viewer } = $services;
const scene = viewer.scene;
const camera = scene.camera;
const direction = camera.direction;
const ellipsoid = scene.frameState.mapProjection.ellipsoid;
const positions = polyline.positions;
const p1 = positions[0];
let startPoint = p1;
let endPoint = positions[1];
let draggingPlane = polyline.draggingPlane;
let surfaceNormal = polyline.surfaceNormal;
let normal = surfaceNormal;
if (scene.mode === SceneMode.COLUMBUS_VIEW) {
normal = Cartesian3.UNIT_X;
const startPointCartographic = ellipsoid.cartesianToCartographic(p1, {});
startPoint = scene.mapProjection.project(startPointCartographic, {});
Cartesian3.fromElements(startPoint.z, startPoint.x, startPoint.y, startPoint);
}
let forward = Cartesian3.cross(normal, direction, {});
forward = Cartesian3.cross(normal, forward, forward);
forward = Cartesian3.normalize(forward, forward);
draggingPlane = Plane.fromPointNormal(startPoint, forward, draggingPlane);
const ray = camera.getPickRay(movement, new Ray());
endPoint = IntersectionTests.rayPlane(ray, draggingPlane, {});
if (defined(endPoint)) {
if (scene.mode === SceneMode.COLUMBUS_VIEW) {
endPoint = Cartesian3.fromElements(endPoint.y, endPoint.z, endPoint.x, endPoint);
const endPointCartographic = scene.mapProjection.unproject(endPoint, {});
endPoint = ellipsoid.cartographicToCartesian(endPointCartographic, endPoint);
}
const worldToWindowCoordinates = cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.121") ? SceneTransforms.worldToWindowCoordinates : SceneTransforms["wgs84ToWindowCoordinates"];
if (worldToWindowCoordinates(scene, positions[0], {}).y < movement.y) {
surfaceNormal = Cartesian3.negate(surfaceNormal, {});
}
let diffrence = Cartesian3.subtract(endPoint, p1, {});
diffrence = Cartesian3.projectVector(diffrence, surfaceNormal, diffrence);
endPoint = Cartesian3.add(p1, diffrence, endPoint);
return endPoint;
}
};
const updateComponents = (polyline) => {
const { Cartesian3, Math: CesiumMath, defined } = Cesium;
const { viewer } = $services;
const ellipsoid = viewer.scene.frameState.mapProjection.ellipsoid;
const startPosition = polyline.positions[0];
const endPosition = polyline.positions[1];
const startCartographic = ellipsoid.cartesianToCartographic(startPosition, {});
if (!defined(startCartographic)) {
return;
}
const endCartographic = ellipsoid.cartesianToCartographic(endPosition, {});
const startHeight = startCartographic.height;
const endHeight = endCartographic.height;
let startPoint, endPoint, height1, height2;
if (startHeight < endHeight) {
startPoint = startPosition;
endPoint = endPosition;
height2 = endHeight;
height1 = startHeight;
} else {
startPoint = endPosition;
endPoint = startPosition;
height2 = startHeight;
height1 = endHeight;
}
const xyPolylinePositions = polyline.xyPolylinePositions;
if (xyPolylinePositions === void 0) {
return;
}
xyPolylinePositions[0] = startPoint;
xyPolylinePositions[2] = endPoint;
let normal = ellipsoid.geodeticSurfaceNormal(startPoint, {});
normal = Cartesian3.multiplyByScalar(normal, height2 - height1, normal);
const xyPoint = Cartesian3.add(startPoint, normal, xyPolylinePositions[1]);
if (!(Cartesian3.equalsEpsilon(xyPoint, endPoint, CesiumMath.EPSILON10) && Cartesian3.equalsEpsilon(xyPoint, startPoint, CesiumMath.EPSILON10))) {
let diffrenceX = Cartesian3.subtract(endPoint, xyPoint, {});
let diffrenceY = Cartesian3.subtract(startPoint, xyPoint, {});
const distanceMin = Math.min(Cartesian3.magnitude(diffrenceX), Cartesian3.magnitude(diffrenceY));
const factor = 15 < distanceMin ? 0.15 * distanceMin : 0.25 * distanceMin;
diffrenceX = Cartesian3.normalize(diffrenceX, diffrenceX);
diffrenceY = Cartesian3.normalize(diffrenceY, diffrenceY);
diffrenceX = Cartesian3.multiplyByScalar(diffrenceX, factor, diffrenceX);
diffrenceY = Cartesian3.multiplyByScalar(diffrenceY, factor, diffrenceY);
const xyBoxPositions = polyline.xyBoxPositions;
if (xyBoxPositions === void 0) {
return;
}
Cartesian3.add(xyPoint, diffrenceX, xyBoxPositions[0]);
Cartesian3.add(xyBoxPositions[0], diffrenceY, xyBoxPositions[1]);
Cartesian3.add(xyPoint, diffrenceY, xyBoxPositions[2]);
polyline.xLabelPosition = Cartesian3.midpoint(xyPoint, endPoint, {});
polyline.yLabelPosition = Cartesian3.midpoint(startPoint, xyPoint, {});
polyline.xAnglePosition = endPoint;
polyline.yAnglePosition = startPoint;
const diffrence1 = Cartesian3.subtract(xyPoint, endPoint, {});
const diffrence2 = Cartesian3.subtract(xyPoint, startPoint, {});
let diffrence3 = Cartesian3.subtract(endPoint, startPoint, {});
polyline.yAngle = Cartesian3.angleBetween(diffrence2, diffrence3);
diffrence3 = Cartesian3.negate(diffrence3, diffrence3);
polyline.xAngle = Cartesian3.angleBetween(diffrence1, diffrence3);
polyline.xDistance = Cartesian3.magnitude(diffrence1);
polyline.yDistance = Cartesian3.magnitude(diffrence2);
}
};
const updateLabelPositionPolygon = () => {
computedRenderDatas.value.forEach((polyline, index) => {
var _a;
const positions = polyline.polygonPositions;
if (!(positions.length < 2)) {
const { defined, SceneTransforms, Cartesian2, HorizontalOrigin } = Cesium;
const { viewer } = $services;
const scene = viewer.scene;
let startPosition = polyline.positions[0];
const worldToWindowCoordinates = cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.121") ? SceneTransforms.worldToWindowCoordinates : SceneTransforms["wgs84ToWindowCoordinates"];
const positionWindow = worldToWindowCoordinates(scene, startPosition, {});
let startPositionWindow = defined(positionWindow) ? Cartesian2.clone(positionWindow, {}) : Cartesian2.fromElements(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY, {});
let startY = startPositionWindow.y;
const primitiveCollection = (_a = primitiveCollectionRef.value) == null ? void 0 : _a.cesiumObject;
const labelCollection = primitiveCollection._primitives.filter(
(v) => v instanceof Cesium.LabelCollection
);
const labels = labelCollection[index]._labels;
const labelTotalLength = labels[labels.length - 1];
if (!labelTotalLength)
return;
for (let i = 1; i < positions.length; i++) {
const positionWindow2 = worldToWindowCoordinates(scene, positions[i], {});
if (defined(positionWindow2)) {
const l = (startPositionWindow.y - positionWindow2.y) / (positionWindow2.x - startPositionWindow.x);
const label = labels[i - 1];
if (label && label !== labelTotalLength) {
if (defined(label == null ? void 0 : label.horizontalOrigin)) {
label.horizontalOrigin = 0 < l ? HorizontalOrigin.LEFT : HorizontalOrigin.RIGHT;
}
}
if (positionWindow2.y < startY) {
startY = positionWindow2.y;
startPosition = positions[i];
}
startPositionWindow = Cartesian2.clone(positionWindow2, startPositionWindow);
}
polyline.drawStatus === DrawStatus["default"].AfterDraw && (labelTotalLength.position = startPosition);
}
}
});
};
const updateLabelPosition = () => {
computedRenderDatas.value.forEach((polyline, index) => {
var _a, _b, _c;
const { defined, SceneTransforms, HorizontalOrigin } = Cesium;
const { viewer } = $services;
const scene = viewer.scene;
const primitiveCollection = (_a = primitiveCollectionRef.value) == null ? void 0 : _a.cesiumObject;
const positions = polyline.positions;
const startPosition = positions[0];
const endPosition = positions[1];
const worldToWindowCoordinates = cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.121") ? SceneTransforms.worldToWindowCoordinates : SceneTransforms["wgs84ToWindowCoordinates"];
const startPositionWindow = worldToWindowCoordinates(scene, startPosition, {});
const endPositionWindow = worldToWindowCoordinates(scene, endPosition, {});
if (defined(startPositionWindow) && defined(endPositionWindow)) {
const labelCollection = primitiveCollection._primitives.filter(
(v) => v instanceof Cesium.LabelCollection
);
if (labelCollection.length) {
const label = labelCollection[index].get(0);
let yLabel, xAngleLabel, yPixelOffset, xPixelOffset;
if (props.showComponentLines) {
yLabel = labelCollection[index].get(2);
xAngleLabel = labelCollection[index].get(3);
yPixelOffset = cesiumHelpers.makeCartesian2((_b = props.yLabelOpts) == null ? void 0 : _b.pixelOffset);
xPixelOffset = cesiumHelpers.makeCartesian2((_c = props.xAngleLabelOpts) == null ? void 0 : _c.pixelOffset);
}
if ((startPositionWindow.y - endPositionWindow.y) / (endPositionWindow.x - startPositionWindow.x) > 0) {
if (!lodashUnified.isUndefined(yLabel) && !lodashUnified.isUndefined(yPixelOffset)) {
yPixelOffset.x = -9;
yLabel.pixelOffset = yPixelOffset;
yLabel.horizontalOrigin = HorizontalOrigin.RIGHT;
}
if (!lodashUnified.isUndefined(xAngleLabel) && !lodashUnified.isUndefined(xPixelOffset)) {
xPixelOffset.x = 12;
xAngleLabel.pixelOffset = xPixelOffset;
xAngleLabel.horizontalOrigin = HorizontalOrigin.LEFT;
}
label.horizontalOrigin = HorizontalOrigin.LEFT;
} else {
if (!lodashUnified.isUndefined(yLabel) && !lodashUnified.isUndefined(yPixelOffset)) {
yPixelOffset.x = 9;
yLabel.pixelOffset = yPixelOffset;
yLabel.horizontalOrigin = HorizontalOrigin.LEFT;
}
if (!lodashUnified.isUndefined(xAngleLabel) && !lodashUnified.isUndefined(xPixelOffset)) {
xPixelOffset.x = -12;
xAngleLabel.pixelOffset = xPixelOffset;
xAngleLabel.horizontalOrigin = HorizontalOrigin.RIGHT;
}
label.horizontalOrigin = HorizontalOrigin.RIGHT;
}
}
}
});
};
const makeHeightPositions = (polyline, position) => {
const { defined, defaultValue, Cartesian3 } = Cesium;
const { viewer } = $services;
const scene = viewer.scene;
const positions = polyline.positions;
positions[0] = position;
const ellipsoid = scene.frameState.mapProjection.ellipsoid;
const postionCartographic = ellipsoid.cartesianToCartographic(position, {});
const globe = scene.globe;
postionCartographic.height = defined(globe) ? defaultValue(globe.getHeight(postionCartographic), 0) : 0;
positions[1] = ellipsoid.cartographicToCartesian(postionCartographic, {});
polyline.distance = Cartesian3.distance(positions[0], positions[1]);
polyline.labelPosition = Cartesian3.midpoint(positions[0], positions[1], {});
};
const startNew = () => {
const { Cartesian3, Plane } = Cesium;
const polyline = {
positions: [new Cartesian3(), new Cartesian3()],
show: false,
drawStatus: DrawStatus["default"].BeforeDraw,
distance: 0,
labels: [],
pointOpts: {},
labelOpts: {},
labelsOpts: {},
polylineOpts: {},
primitiveOpts: {},
polygonOpts: {}
};
cmpName === "VcMeasurementVertical" && Object.assign(polyline, {
draggingPlane: new Plane(Cartesian3.UNIT_X, 0),
surfaceNormal: new Cartesian3()
});
renderDatas.value.push(polyline);
drawStatus.value = DrawStatus["default"].BeforeDraw;
canShowDrawTip.value = true;
drawTip.value = drawTipOpts.value.drawingTipStart;
};
const stop = (removeLatest = true) => {
if (removeLatest && drawStatus.value === DrawStatus["default"].Drawing) {
renderDatas.value.pop();
}
const index = editingPoint.value ? editingPoint.value._vcPolylineIndx : renderDatas.value.length - 1;
const polyline = renderDatas.value[index];
if (polyline) {
polyline.drawStatus = DrawStatus["default"].AfterDraw;
}
drawStatus.value = DrawStatus["default"].AfterDraw;
canShowDrawTip.value = false;
drawTipPosition.value = [0, 0, 0];
};
const handleMouseClick = (movement, options) => {
var _a;
const { viewer, drawingFabInstance, selectedDrawingActionInstance, getWorldPosition } = $services;
const drawingFabInstanceVm = drawingFabInstance == null ? void 0 : drawingFabInstance.proxy;
if (options.button === 2 && options.ctrl) {
const drawingsOption = drawingFabInstanceVm.getDrawingActionInstance(drawingType);
drawingFabInstanceVm.toggleAction(drawingsOption);
vue.nextTick(() => {
emit(
"drawEvt",
{
name: drawingType,
finished: true,
windowPoistion: movement,
type: "cancel"
},
viewer
);
});
return;
}
if (drawStatus.value === DrawStatus["default"].AfterDraw) {
startNew();
}
const index = editingPoint.value ? editingPoint.value._vcPolylineIndx : renderDatas.value.length - 1;
const polyline = renderDatas.value[index];
const positions = polyline.positions;
const pointIndex = editingPoint.value ? editingPoint.value._index : polyline.positions.length - 1;
if (options.button === 2 && editingPoint.value) {
drawingFabInstanceVm.editingActionName = void 0;
polyline.positions[editingPoint.value._index] = restorePosition;
drawStatus.value = DrawStatus["default"].AfterDraw;
polyline.drawStatus = DrawStatus["default"].AfterDraw;
editingPoint.value = void 0;
drawTip.value = drawTipOpts.value.drawingTipStart;
canShowDrawTip.value = Cesium.defined(selectedDrawingActionInstance);
if (cmpName === "VcMeasurementHeight") {
makeHeightPositions(polyline, restorePosition);
}
vue.nextTick(() => {
emit(
"drawEvt",
Object.assign(
{
name: drawingType,
index,
pointIndex,
renderDatas,
finished: true,
windowPoistion: movement,
type: "cancel"
},
computedRenderDatas.value[index]
),
viewer
);
});
return;
}
if (options.button !== 0) {
return;
}
const { defined } = Cesium;
let type = "new";
let emitPosition;
let finished = false;
const scene = viewer.scene;
if (drawStatus.value === DrawStatus["default"].BeforeDraw) {
const position = getWorldPosition(scene, movement, {});
if (!defined(position)) {
return;
}
positions[0] = position;
positions[1] = position;
polyline.show = true;
drawStatus.value = DrawStatus["default"].Drawing;
polyline.drawStatus = DrawStatus["default"].Drawing;
drawTip.value = drawTipOpts.value.drawingTipEnd;
emitPosition = position;
finished = false;
if (cmpName === "VcMeasurementVertical") {
const ellipsoid = scene.frameState.mapProjection.ellipsoid;
polyline.surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, polyline.surfaceNormal);
}
if (cmpName === "VcMeasurementHeight") {
makeHeightPositions(polyline, position);
finished = true;
polyline.drawStatus = DrawStatus["default"].AfterDraw;
drawStatus.value = DrawStatus["default"].AfterDraw;
drawTip.value = drawTipOpts.value.drawingTipStart;
if (props.mode === 1) {
drawingFabInstanceVm.toggleAction(selectedDrawingActionInstance);
}
}
if (cmpName === "VcAnalysisViewshed") {
polyline.viewshedOpts = {
...props.viewshedOpts
};
}
} else {
polyline.drawStatus = DrawStatus["default"].AfterDraw;
drawStatus.value = DrawStatus["default"].AfterDraw;
if (editingPoint.value) {
if (platform.platform().hasTouch === true) {
const position = getWorldPosition(scene, movement, {});
if (defined(position)) {
const positions2 = polyline.positions;
positions2.splice(editingPoint.value._index, 1, position);
editingPoint.value.pixelSize = ((_a = props.pointOpts) == null ? void 0 : _a.pixelSize) * 1;
}
}
editingPoint.value = void 0;
drawingFabInstanceVm.editingActionName = void 0;
canShowDrawTip.value = false;
drawTipPosition.value = [0, 0, 0];
type = editorType.value;
if (selectedDrawingActionInstance) {
drawTip.value = drawTipOpts.value.drawingTipStart;
canShowDrawTip.value = true;
}
} else {
if (cmpName !== "VcMeasurementVertical") {
if (platform.platform().hasTouch === true) {
const position = getWorldPosition(scene, movement, {});
if (defined(position)) {
const positions2 = polyline.positions;
positions2[1] = position;
}
}
}
if (props.mode === 1) {
drawingFabInstanceVm.toggleAction(selectedDrawingActionInstance);
}
}
finished = true;
emitPosition = polyline.positions[1];
}
vue.nextTick(() => {
emit(
"drawEvt",
Object.assign(
{
index,
pointIndex,
renderDatas,
name: drawingType,
finished,
position: emitPosition,
windowPoistion: movement,
type
},
computedRenderDatas.value[index]
),
viewer
);
});
};
const handleMouseMove = (movement) => {
const { viewer, getWorldPosition } = $services;
const scene = viewer.scene;
const position = getWorldPosition(scene, movement, {});
const { defined, Cartographic } = Cesium;
if (!defined(position)) {
return;
}
drawTipPosition.value = position;
if (drawStatus.value !== DrawStatus["default"].Drawing) {
return;
}
if (cmpName === "VcMeasurementVertical" && scene.mode === Cesium.SceneMode.SCENE2D) {
return;
}
const index = editingPoint.value ? editingPoint.value._vcPolylineIndx : renderDatas.value.length - 1;
const polyline = renderDatas.value[index];
const pointIndex = editingPoint.value ? editingPoint.value._index : polyline.positions.length - 1;
if (cmpName === "VcMeasurementVertical") {
const heightPostion = getHeightPosition(polyline, movement);
if (!lodashUnified.isUndefined(heightPostion)) {
const positions = polyline.positions.slice();
positions[editingPoint.value ? editingPoint.value._index : 1] = heightPostion;
polyline.positions = positions;
}
} else if (cmpName === "VcMeasurementHeight") {
makeHeightPositions(polyline, position);
} else if (cmpName === "VcDrawingRectangle" || cmpName === "VcDrawingRegular" || cmpName === "VcMeasurementRegular" || cmpName === "VcMeasurementRectangle") {
const positions = polyline.positions;
const startPosition = positions[0];
const startCartographic = Cartographic.fromCartesian(startPosition, viewer.scene.globe.ellipsoid);
const endCartographic = Cartographic.fromCartesian(position, viewer.scene.globe.ellipsoid);
!props.clampToGround && (endCartographic.height = startCartographic.height);
positions[editingPoint.value ? editingPoint.value._index : 1] = Cartographic.toCartesian(endCartographic, viewer.scene.globe.ellipsoid);
} else if (cmpName === "VcAnalysisSightline") {
const positions = polyline.positions;
if (editingPoint.value) {
const index2 = editingPoint.value._index > 0 ? 1 : 0;
positions[index2] = position;
} else {
positions[1] = position;
}
} else {
const positions = polyline.positions.slice();
positions[editingPoint.value ? editingPoint.value._index : 1] = position;
polyline.positions = positions;
}
vue.nextTick(() => {
emit(
"drawEvt",
Object.assign(
{
index,
pointIndex,
renderDatas,
name: drawingType,
finished: false,
position: polyline.positions[1],
windowPoistion: movement,
type: editingPoint.value ? editorType : "new"
},
computedRenderDatas.value[index]
),
viewer
);
});
};
const onEditorClick = (e) => {
var _a, _b, _c;
editorPosition.value = [0, 0, 0];
showEditor.value = false;
if (!props.editable) {
return;
}
editorType.value = e;
const { viewer, drawingFabInstance } = $services;
if (e === "move") {
drawTip.value = drawTipOpts.value.drawingTipEditing;
drawStatus.value = DrawStatus["default"].Drawing;
editingPoint.value = mouseoverPoint.value;
restorePosition = renderDatas.value[editingPoint.value._vcPolylineIndx].positions[editingPoint.value._index];
canShowDrawTip.value = true;
const drawingFabInstanceVm = drawingFabInstance == null ? void 0 : drawingFabInstance.proxy;
drawingFabInstanceVm.editingActionName = drawingType;
} else if (e === "remove") {
const index = mouseoverPoint.value._vcPolylineIndx;
const polyline = renderDatas.value[index];
polyline.positions.splice(mouseoverPoint.value._index, 1);
} else if (e === "removeAll") {
const index = mouseoverPoint.value._vcPolylineIndx;
renderDatas.value.splice(index, 1);
} else {
const index = mouseoverPoint.value._vcPolylineIndx;
const polyline = renderDatas.value[index];
(_c = (_b = (_a = props.editorOpts) == null ? void 0 : _a[e]) == null ? void 0 : _b.callback) == null ? void 0 : _c.call(_b, index, polyline);
}
emit(
"editorEvt",
{
type: e,
renderDatas,
name: drawingType,
index: mouseoverPoint.value._vcPolylineIndx,
pointIndex: mouseoverPoint.value._index,
point: mouseoverPoint.value
},
viewer
);
};
const clear = () => {
renderDatas.value = [];
stop();
};
const publicMethods = { computedRenderDatas, renderDatas, startNew, stop, clear, handleMouseClick, handleMouseMove };
Object.assign(instance.proxy, publicMethods);
return () => {
var _a, _b, _c;
const { createGuid } = Cesium;
const children = [];
computedRenderDatas.value.forEach((polyline, index) => {
var _a2;
const isRegular = cmpName === "VcDrawingRectangle" || cmpName === "VcDrawingRegular" || cmpName === "VcMeasurementRegular" || cmpName === "VcMeasurementRectangle";
const positions = isRegular ? (_a2 = polyline.polygonPositions) == null ? void 0 : _a2.slice() : polyline.positions;
isRegular && (positions == null ? void 0 : positions.push(positions[0]));
const polylineOpts = Object.assign({}, props.polylineOpts, polyline.polylineOpts);
props.clampToGround && delete polylineOpts.arcType;
const primitiveOpts = Object.assign({}, props.primitiveOpts, polyline.primitiveOpts);
if ((positions == null ? void 0 : positions.length) && (positions == null ? void 0 : positions.length) > 1) {
children.push(
vue.h(
props.clampToGround ? index$2.VcPrimitiveGroundPolyline : index$2.VcPrimitive,
{
...primitiveOpts,
show: polyline.show && primitiveOpts.show || props.editable || polyline.drawStatus === DrawStatus["default"].Drawing,
onReady: (readyObject) => {
var _a3;
(_a3 = primitiveOpts == null ? void 0 : primitiveOpts.onReady) == null ? void 0 : _a3.call(primitiveOpts, readyObject);
readyObject.cesiumObject._vcPolylineIndex = index;
}
},
() => vue.h(
index$3.VcGeometryInstance,
{
id: createGuid()
},
() => vue.h(props.clampToGround ? index$4.VcGeometryGroundPolyline : index$4.VcGeometryPolyline, {
positions,
...polylineOpts
})
)
)
);
if (cmpName === "VcAnalysisViewshed") {
children.push(vue.h(index$2.VcViewshed, { ...polyline.viewshedOpts }));
}
}
if (polyline.polygonPositions && polyline.polygonPositions.length > 2) {
const polygonOpts = Object.assign({}, props == null ? void 0 : props.polygonOpts, polyline == null ? void 0 : polyline.polygonOpts);
polygonOpts.clampToGround = props.clampToGround;
children.push(
vue.h(index$5.VcPolygon, {
positions,
show: polyline.show && (polygonOpts == null ? void 0 : polygonOpts.show),
...polygonOpts,
onReady: (readyObject) => {
var _a3;
onVcPrimitiveReady(readyObject);
(_a3 = polygonOpts == null ? void 0 : polygonOpts.onReady) == null ? void 0 : _a3.call(polygonOpts, readyObject);
readyObject.cesiumObject._vcPolylineIndex = index;
}
})
);
}
if (polyline.xyPolylinePositions && polyline.xyPolylinePositions.length > 1) {
children.push(
vue.h(
index$2.VcPrimitive,
{
show: polyline.show && primitiveOpts || props.editable || polyline.drawStatus === DrawStatus["default"].Drawing,
...primitiveOpts,
onReady: (readyObject) => {
var _a3;
(_a3 = primitiveOpts == null ? void 0 : primitiveOpts.onReady) == null ? void 0 : _a3.call(primitiveOpts, readyObject);
readyObject.cesiumObject._vcPolylineIndex = index;
}
},
() => vue.h(
index$3.VcGeometryInstance,
{
id: createGuid()
},
() => vue.h(index$4.VcGeometryPolyline, {
positions: polyline.xyPolylinePositions,
...polylineOpts
})
)
)
);
}
if (polyline.xyBoxPositions && polyline.xyBoxPositions.length > 1) {
children.push(
vue.h(
index$2.VcPrimitive,
{
show: polyline.show && primitiveOpts || props.editable || polyline.drawStatus === DrawStatus["default"].Drawing,
...primitiveOpts
},
() => vue.h(
index$3.VcGeometryInstance,
{
id: createGuid()
},
() => vue.h(index$4.VcGeometryPolyline, {
positions: polyline.xyBoxPositions,
...polylineOpts
})
)
)
);
}
const polylinePointOpts = Object.assign({}, props.pointOpts, polyline.pointOpts);
children.push(
vue.h(index$5.VcCollectionPoint, {
enableMouseEvent: props.enableMouseEvent,
show: polyline.show,
points: polyline.points.map((point, subIndex) => {
const position = point.position;
const pointOpts = Object.assign({}, polylinePointOpts, point);
return {
position,
id: createGuid(),
_vcPolylineIndx: index,
// for editor
...pointOpts,
show: ((pointOpts == null ? void 0 : pointOpts.show) || props.editable || polyline.drawStatus === DrawStatus["default"].Drawing) && (cmpName === "VcAnalysisSightline" && polyline.positions.length === 3 ? subIndex !== 1 : true)
};
}),
onMouseover: onMouseoverPoints,
onMouseout: onMouseoutPoints,
onReady: onVcCollectionPointReady
})
);
children.push(
vue.h(index$5.VcCollectionLabel, {
enableMouseEvent: props.enableMouseEvent,
show: polyline.show,
labels: polyline.labels,
onReady: onVcCollectionLabelReady
})
);
});
if (((_a = props.drawtip) == null ? void 0 : _a.show) && canShowDrawTip.value) {
const { viewer } = $services;
children.push(
vue.h(
index$6.VcOverlayHtml,
{
position: drawTipPosition.value,
pixelOffset: (_b = props.drawtip) == null ? void 0 : _b.pixelOffset,
teleport: {
to: viewer.container
}
},
() => vue.h(
"div",
{
class: "vc-drawtip vc-tooltip--style"
},
drawTip.value
)
)
);
}
if (showEditor.value) {
const buttons = [];
if (mouseoverPoint.value) {
const editorOpts = props.editorOpts;
for (const key in editorOpts) {
if (!Array.isArray(editorOpts[key]) && typeof editorOpts[key] !== "number") {
const opts = {
...editorOpts[key]
};
delete opts.color;
buttons.push(
vue.h(
index$7.VcBtn,
{
style: { color: editorOpts[key].color, background: editorOpts[key].background },
...opts,
onclick: onEditorClick.bind(void 0, key)
},
() => vue.h(
index$7.VcTooltip,
{
...editorOpts[key].tooltip
},
() => {
var _a2;
return vue.h("strong", null, ((_a2 = editorOpts[key].tooltip) == null ? void 0 : _a2.tip) || t(`vc.measurement.editor.${key}`));
}
)
)
);
}
}
}
const { viewer } = $services;
children.push(
vue.h(
index$6.VcOverlayHtml,
{
position: editorPosition.value,
pixelOffset: (_c = props.editorOpts) == null ? void 0 : _c.pixelOffset,
teleport: {
to: viewer.container
},
onMouseenter: onMouseenterEditor,
onMouseleave: onMouseleaveEditor
},
() => vue.h(
"div",
{
class: "vc-editor"
},
buttons
)
)
);
}
return vue.h(
index$5.VcCollectionPrimitive,
{
ref: primitiveCollectionRef,
show: props.show,
onReady: onPrimitiveCollectionReady
},
() => children
);
};
}
exports["default"] = useDrawingSegment;
//# sourceMappingURL=use-drawing-segment.js.map