UNPKG

casc-cesium

Version:

Vue 3.x components for CesiumJS.

1 lines 91.6 kB
{"version":3,"file":"use-drawing-segment.mjs","sources":["../../../../../packages/composables/use-drawing/use-drawing-segment.ts"],"sourcesContent":["/*\n * @Author: zouyaoji@https://github.com/zouyaoji\n * @Date: 2021-10-22 14:09:42\n * @LastEditTime: 2022-08-02 22:20:33\n * @LastEditors: zouyaoji\n * @Description:\n * @FilePath: \\vue-cesium@next\\packages\\composables\\use-drawing\\use-drawing-segment.ts\n */\nimport { VcBtn, VcTooltip } from 'casc-cesium-components/ui'\nimport { VcOverlayHtml } from 'casc-cesium-components/overlays'\nimport { VcCollectionLabel, VcCollectionPoint, VcCollectionPrimitive, VcLabelProps, VcPolygon } from 'casc-cesium-components/primitive-collections'\nimport { VcPrimitive, VcPrimitiveGroundPolyline, VcViewshed } from 'casc-cesium-components/primitives'\nimport { VcGeometryInstance } from 'casc-cesium-components/geometry-instance'\nimport { VcGeometryPolyline, VcGeometryGroundPolyline } from 'casc-cesium-components/geometries'\nimport { useLocale } from '../use-locale'\nimport { DrawStatus, MeasureUnits } from 'casc-cesium-shared'\nimport {\n calculateAreaByPostions,\n getGeodesicDistance,\n getPolylineSegmentHeading,\n getHeadingPitchRoll,\n getPolylineSegmentEndpoint,\n getPolylineSegmentPitch,\n makeCartesian2,\n makeCartesian3Array,\n getFirstIntersection\n} from 'casc-cesium-utils/cesium-helpers'\nimport { VcSegmentDrawing } from 'casc-cesium-utils/drawing-types'\nimport type { VcComponentInternalInstance, VcDrawingProvider, VcReadyObject } from 'casc-cesium-utils/types'\nimport { isUndefined } from 'casc-cesium-utils/util'\nimport { reactive, VNode } from 'vue'\nimport { computed, getCurrentInstance, h, nextTick, ref } from 'vue'\nimport useCommon from '../use-common'\nimport useDrawingAction from './use-drawing-action'\nimport { VcAnalysesRef, VcDrawingsRef, VcMeasurementsRef } from 'casc-cesium-components'\nimport { platform } from 'casc-cesium-utils/platform'\n\nexport default function (props, ctx, cmpName: string) {\n const instance = getCurrentInstance() as VcComponentInternalInstance\n\n const commonState = useCommon(props, ctx, instance)\n if (commonState === void 0) {\n return\n }\n\n const { t } = useLocale()\n const $services = commonState.$services as VcDrawingProvider\n const { emit } = ctx\n\n const {\n drawingType,\n drawTip,\n drawTipOpts,\n drawStatus,\n canShowDrawTip,\n drawTipPosition,\n showEditor,\n editorPosition,\n mouseoverPoint,\n editingPoint,\n primitiveCollectionRef,\n editorType,\n onMouseoverPoints,\n onMouseoutPoints,\n onMouseenterEditor,\n onMouseleaveEditor,\n onPrimitiveCollectionReady,\n onVcCollectionPointReady,\n onVcCollectionLabelReady,\n onVcPrimitiveReady\n } = useDrawingAction(props, ctx, instance, cmpName, $services)\n\n const renderDatas = ref<Array<VcSegmentDrawing>>([])\n if (props.preRenderDatas && props.preRenderDatas.length) {\n props.preRenderDatas.forEach(preRenderData => {\n const segmentDrawing: VcSegmentDrawing = {\n positions: makeCartesian3Array(preRenderData) as Array<Cesium.Cartesian3>,\n show: true,\n drawStatus: DrawStatus.AfterDraw,\n distance: 0,\n labels: [],\n\n pointOpts: {},\n labelOpts: {},\n labelsOpts: {},\n polylineOpts: {},\n primitiveOpts: {},\n polygonOpts: {}\n }\n\n cmpName === 'VcMeasurementVertical' &&\n Object.assign(segmentDrawing, {\n draggingPlane: new Cesium.Plane(Cesium.Cartesian3.UNIT_X, 0),\n surfaceNormal: new Cesium.Cartesian3()\n })\n\n renderDatas.value.push(segmentDrawing)\n })\n }\n let restorePosition\n const computedRenderDatas = computed<Array<VcSegmentDrawing>>(() => {\n const polylines: Array<VcSegmentDrawing> = []\n const { Cartesian3, Cartographic, Rectangle, createGuid, defined, Math: CesiumMath, Ray } = Cesium\n const { viewer } = $services\n\n renderDatas.value.forEach(polylineSegment => {\n const startPosition = polylineSegment.positions[0]\n const endPosition = polylineSegment.positions[1]\n\n if (Cartesian3.equals(startPosition, endPosition)) {\n return\n }\n\n const labels = reactive<Array<VcLabelProps>>([])\n const distances: number[] = []\n const angles: number[] = []\n\n const distance =\n props.polylineOpts?.arcType === 0\n ? Cartesian3.distance(startPosition, endPosition)\n : getGeodesicDistance(startPosition, endPosition, $services.viewer.scene.globe.ellipsoid)\n const labelPosition = Cartesian3.midpoint(startPosition, endPosition, {} as any)\n\n const heading = getPolylineSegmentHeading(startPosition, endPosition)\n const pitch = getPolylineSegmentPitch(startPosition, endPosition)\n\n polylineSegment.points = polylineSegment.positions.map(v => {\n return {\n position: v\n }\n })\n\n const polyline: VcSegmentDrawing = {\n ...polylineSegment,\n distance,\n heading,\n pitch\n }\n\n const labelOpts = Object.assign({}, props.labelOpts, polyline.labelOpts)\n\n if (cmpName === 'VcDrawingRectangle' || cmpName === 'VcMeasurementRectangle') {\n const startCartographic = Cartographic.fromCartesian(startPosition, viewer.scene.globe.ellipsoid)\n const endCartographic = Cartographic.fromCartesian(endPosition, viewer.scene.globe.ellipsoid)\n const height = startCartographic.height\n !props.clampToGround && (endCartographic.height = height)\n\n const rectangle = Rectangle.fromCartesianArray(polylineSegment.positions, viewer.scene.globe.ellipsoid)\n const rectangleArr = [\n rectangle.west,\n rectangle.north,\n height,\n rectangle.east,\n rectangle.north,\n height,\n rectangle.east,\n rectangle.south,\n height,\n rectangle.west,\n rectangle.south,\n height,\n rectangle.west,\n rectangle.north,\n height\n ]\n const polygonPositions = Cartesian3.fromRadiansArrayHeights(rectangleArr, viewer.scene.globe.ellipsoid)\n Object.assign(polyline, {\n polygonPositions,\n height\n })\n } else if (cmpName === 'VcDrawingRegular' || cmpName === 'VcMeasurementRegular') {\n const startPosition = polylineSegment.positions[0]\n const endPosition = polylineSegment.positions[1]\n\n const hpr = getHeadingPitchRoll(startPosition, endPosition, viewer.scene)\n if (!isUndefined(hpr) && defined(hpr)) {\n const polygonPositions: Array<Cesium.Cartesian3> = []\n const startCartographic = Cartographic.fromCartesian(startPosition, viewer.scene.globe.ellipsoid)\n const endCartographic = Cartographic.fromCartesian(endPosition, viewer.scene.globe.ellipsoid)\n\n !props.clampToGround && (endCartographic.height = startCartographic.height)\n polygonPositions.push(Cartographic.toCartesian(endCartographic, viewer.scene.globe.ellipsoid))\n for (let i = 0; i < (props.edge || 4) - 1; i++) {\n const position = getPolylineSegmentEndpoint(\n startPosition,\n (hpr.heading += (Math.PI * 2) / (props.edge || 4)),\n distance,\n viewer.scene.globe.ellipsoid\n )\n polygonPositions.push(position)\n }\n\n Object.assign(polyline, {\n polygonPositions,\n height: startCartographic.height\n })\n }\n } else if (cmpName === 'VcAnalysisViewshed') {\n // updateViewshed\n Object.assign(polyline.viewshedOpts, { startPosition, endPosition })\n } else if (cmpName === 'VcAnalysisSightline') {\n if (props.sightlineType === 'segment') {\n const positionsNew: Array<Cesium.Cartesian3> = []\n positionsNew.push(startPosition)\n const objectsToExclude = []\n const primitiveCollection: Array<Cesium.PrimitiveCollection> = (primitiveCollectionRef.value.cesiumObject as any)._primitives\n primitiveCollection.forEach(primitive => {\n if (primitive instanceof Cesium.PointPrimitiveCollection) {\n objectsToExclude.push(...primitive._pointPrimitives)\n }\n if (primitive instanceof Cesium.Primitive) {\n objectsToExclude.push(primitive)\n }\n })\n const intersection = getFirstIntersection(startPosition, endPosition, $services.viewer, objectsToExclude)\n if (defined(intersection)) {\n positionsNew.push(intersection)\n }\n positionsNew.push(endPosition)\n let distance = 0\n const distances = []\n for (let i = 0; i < positionsNew.length - 1; i++) {\n const s = Cartesian3.distance(positionsNew[i], positionsNew[i + 1])\n distances.push(s)\n distance = distance + s\n }\n Object.assign(polyline, {\n positions: positionsNew,\n distance\n })\n } else if (props.sightlineType === 'circle') {\n // Todo\n }\n } else {\n labels.push({\n position: labelPosition,\n id: createGuid(),\n text: MeasureUnits.distanceToString(distance, props.measureUnits?.distanceUnits, props.locale, props.decimals?.distance),\n ...labelOpts\n })\n }\n\n if (polyline.polygonPositions && polyline.polygonPositions.length) {\n const labelsOpts = Object.assign({}, props.labelsOpts, polyline.labelsOpts)\n const positions = polyline.polygonPositions.slice()\n props.loop && positions.length > 2 && positions.push(positions[0])\n for (let i = 0; i < positions.length - 1; i++) {\n let s = 0\n if (props.polylineOpts?.arcType === 0) {\n s = getGeodesicDistance(positions[i], positions[i + 1], $services.viewer.scene.globe.ellipsoid)\n } else {\n s = Cartesian3.distance(positions[i], positions[i + 1])\n }\n distances.push(s)\n if (s > 0 && positions.length > 2 && props.showDistanceLabel) {\n labels.push({\n text: MeasureUnits.distanceToString(s, props.measureUnits?.distanceUnits, props.locale, props.decimals?.distance),\n position: Cartesian3.midpoint(positions[i], positions[i + 1], {} as any),\n id: createGuid(),\n ...labelsOpts\n })\n }\n if (positions.length > 2 && props.showAngleLabel) {\n if (i > 0 || props.loop) {\n const point0 = positions[i === 0 ? positions.length - 2 : i - 1]\n const point1 = positions[i]\n const point2 = positions[i + 1]\n const diffrence1 = Cartesian3.subtract(point0, point1, {} as any)\n const diffrence2 = Cartesian3.subtract(point2, point1, {} as any)\n let angle = 0\n if (!(Cartesian3.ZERO.equals(diffrence1) || Cartesian3.ZERO.equals(diffrence2))) {\n angle = Cartesian3.angleBetween(diffrence1, diffrence2)\n }\n angles.push(angle)\n labels.push({\n text: MeasureUnits.angleToString(angle, props.measureUnits?.angleUnits, props.locale, props.decimals?.angle),\n position: point1,\n id: createGuid(),\n ...labelsOpts\n })\n }\n }\n }\n\n const area = calculateAreaByPostions(positions)\n props.showLabel &&\n labels.push({\n text: MeasureUnits.areaToString(area, props.measureUnits?.areaUnits, props.locale, props.decimals?.area),\n position: polylineSegment.positions[0],\n id: createGuid(),\n ...labelOpts\n })\n }\n\n if (props.showComponentLines) {\n Object.assign(polyline, {\n xyPolylinePositions: [new Cartesian3(), new Cartesian3(), new Cartesian3()],\n xyBoxPositions: [new Cartesian3(), new Cartesian3(), new Cartesian3()],\n xDistance: 0,\n yDistance: 0,\n xAngle: 0,\n yAngle: 0\n })\n updateComponents(polyline)\n\n labels.push({\n position: polyline.xLabelPosition,\n id: createGuid(),\n text: MeasureUnits.distanceToString(polyline.xDistance || 0, props.measureUnits?.distanceUnits, props.locale, props.decimals?.distance),\n ...props.xLabelOpts\n })\n\n labels.push({\n position: polyline.yLabelPosition,\n id: createGuid(),\n text: MeasureUnits.distanceToString(polyline.yDistance || 0, props.measureUnits?.distanceUnits, props.locale, props.decimals?.distance),\n ...props.yLabelOpts\n })\n\n labels.push({\n position: polyline.xAnglePosition,\n id: createGuid(),\n text: MeasureUnits.angleToString(polyline.xAngle || 0, props.measureUnits?.angleUnits, props.locale, props.decimals?.angle),\n ...props.xAngleLabelOpts\n })\n\n labels.push({\n position: polyline.yAnglePosition,\n id: createGuid(),\n text: MeasureUnits.angleToString(polyline.yAngle || 0, props.measureUnits?.angleUnits, props.locale, props.decimals?.angle),\n ...props.yAngleLabelOpts\n })\n }\n\n Object.assign(polyline, {\n labels\n })\n polyline.positionsDegreesArray = polyline.positions.map(v => {\n const cart = Cesium.Cartographic.fromCartesian(v, viewer.scene.globe.ellipsoid)\n return [CesiumMath.toDegrees(cart.longitude), CesiumMath.toDegrees(cart.latitude), cart.height]\n })\n polyline?.polygonPositions?.length &&\n (polyline.polygonPositionsDegreesArray = polyline.polygonPositions.map(v => {\n const cart = Cesium.Cartographic.fromCartesian(v, viewer.scene.globe.ellipsoid)\n return [CesiumMath.toDegrees(cart.longitude), CesiumMath.toDegrees(cart.latitude), cart.height]\n }))\n\n polylines.push(polyline)\n })\n return polylines\n })\n\n // methods\n instance.createCesiumObject = async () => {\n return primitiveCollectionRef\n }\n\n instance.mount = async () => {\n const { viewer } = $services\n if (props.autoUpdateLabelPosition) {\n cmpName === 'VcMeasurementDistance' && viewer.scene.preRender.addEventListener(updateLabelPosition)\n ;(cmpName === 'VcMeasurementRegular' ||\n cmpName === 'VcMeasurementRectangle' ||\n cmpName === 'VcDrawingRegular' ||\n cmpName === 'VcDrawingRectangle') &&\n viewer.scene.preRender.addEventListener(updateLabelPositionPolygon)\n }\n\n return true\n }\n\n instance.unmount = async () => {\n const { viewer } = $services\n if (props.autoUpdateLabelPosition) {\n cmpName === 'VcMeasurementDistance' && viewer.scene.preRender.removeEventListener(updateLabelPosition)\n ;(cmpName === 'VcMeasurementRegular' ||\n cmpName === 'VcMeasurementRectangle' ||\n cmpName === 'VcDrawingRegular' ||\n cmpName === 'VcDrawingRectangle') &&\n viewer.scene.preRender.removeEventListener(updateLabelPositionPolygon)\n }\n\n return true\n }\n\n const getHeightPosition = (polyline: VcSegmentDrawing, movement: Cesium.Cartesian2) => {\n const { defined, SceneMode, Cartesian3, IntersectionTests, Plane, SceneTransforms, Ray } = Cesium\n const { viewer } = $services\n const scene = viewer.scene\n const camera = scene.camera\n const direction = camera.direction\n const ellipsoid = scene.frameState.mapProjection.ellipsoid as Cesium.Ellipsoid\n const positions = polyline.positions\n const p1 = positions[0]\n let startPoint = p1\n let endPoint = positions[1]\n let draggingPlane = polyline.draggingPlane\n let surfaceNormal = polyline.surfaceNormal\n let normal = surfaceNormal\n\n if (scene.mode === SceneMode.COLUMBUS_VIEW) {\n normal = Cartesian3.UNIT_X\n const startPointCartographic = ellipsoid.cartesianToCartographic(p1, {} as any)\n startPoint = scene.mapProjection.project(startPointCartographic, {} as any)\n Cartesian3.fromElements(startPoint.z, startPoint.x, startPoint.y, startPoint)\n }\n\n let forward = Cartesian3.cross(normal, direction, {} as any) // m\n forward = Cartesian3.cross(normal, forward, forward)\n forward = Cartesian3.normalize(forward, forward)\n draggingPlane = Plane.fromPointNormal(startPoint, forward, draggingPlane)\n const ray = camera.getPickRay(movement, new Ray())\n endPoint = IntersectionTests.rayPlane(ray, draggingPlane, {} as any)\n if (defined(endPoint)) {\n if (scene.mode === SceneMode.COLUMBUS_VIEW) {\n endPoint = Cartesian3.fromElements(endPoint.y, endPoint.z, endPoint.x, endPoint)\n const endPointCartographic = scene.mapProjection.unproject(endPoint, {} as any)\n endPoint = ellipsoid.cartographicToCartesian(endPointCartographic, endPoint)\n }\n\n if (SceneTransforms.wgs84ToWindowCoordinates(scene, positions[0], {} as any).y < movement.y) {\n surfaceNormal = Cartesian3.negate(surfaceNormal, {} as any)\n }\n let diffrence = Cartesian3.subtract(endPoint, p1, {} as any)\n diffrence = Cartesian3.projectVector(diffrence, surfaceNormal, diffrence)\n endPoint = Cartesian3.add(p1, diffrence, endPoint)\n return endPoint\n }\n }\n\n const updateComponents = (polyline: VcSegmentDrawing) => {\n const { Cartesian3, Math: CesiumMath, defined } = Cesium\n const { viewer } = $services\n const ellipsoid = viewer.scene.frameState.mapProjection.ellipsoid as Cesium.Ellipsoid\n const startPosition = polyline.positions[0]\n const endPosition = polyline.positions[1]\n const startCartographic = ellipsoid.cartesianToCartographic(startPosition, {} as any)\n\n if (!defined(startCartographic)) {\n return\n }\n const endCartographic = ellipsoid.cartesianToCartographic(endPosition, {} as any)\n\n const startHeight = startCartographic.height\n const endHeight = endCartographic.height\n\n let startPoint, endPoint, height1, height2\n\n if (startHeight < endHeight) {\n startPoint = startPosition\n endPoint = endPosition\n height2 = endHeight\n height1 = startHeight\n } else {\n startPoint = endPosition\n endPoint = startPosition\n height2 = startHeight\n height1 = endHeight\n }\n\n const xyPolylinePositions = polyline.xyPolylinePositions\n if (xyPolylinePositions === undefined) {\n return\n }\n xyPolylinePositions[0] = startPoint\n xyPolylinePositions[2] = endPoint\n let normal = ellipsoid.geodeticSurfaceNormal(startPoint, {} as any)\n normal = Cartesian3.multiplyByScalar(normal, height2 - height1, normal)\n const xyPoint = Cartesian3.add(startPoint, normal, xyPolylinePositions[1])\n if (!(Cartesian3.equalsEpsilon(xyPoint, endPoint, CesiumMath.EPSILON10) && Cartesian3.equalsEpsilon(xyPoint, startPoint, CesiumMath.EPSILON10))) {\n let diffrenceX = Cartesian3.subtract(endPoint, xyPoint, {} as any)\n let diffrenceY = Cartesian3.subtract(startPoint, xyPoint, {} as any)\n const distanceMin = Math.min(Cartesian3.magnitude(diffrenceX), Cartesian3.magnitude(diffrenceY))\n const factor = 15 < distanceMin ? 0.15 * distanceMin : 0.25 * distanceMin\n diffrenceX = Cartesian3.normalize(diffrenceX, diffrenceX)\n diffrenceY = Cartesian3.normalize(diffrenceY, diffrenceY)\n diffrenceX = Cartesian3.multiplyByScalar(diffrenceX, factor, diffrenceX)\n diffrenceY = Cartesian3.multiplyByScalar(diffrenceY, factor, diffrenceY)\n const xyBoxPositions = polyline.xyBoxPositions\n if (xyBoxPositions === undefined) {\n return\n }\n Cartesian3.add(xyPoint, diffrenceX, xyBoxPositions[0])\n Cartesian3.add(xyBoxPositions[0], diffrenceY, xyBoxPositions[1])\n Cartesian3.add(xyPoint, diffrenceY, xyBoxPositions[2])\n\n polyline.xLabelPosition = Cartesian3.midpoint(xyPoint, endPoint, {} as any)\n polyline.yLabelPosition = Cartesian3.midpoint(startPoint, xyPoint, {} as any)\n polyline.xAnglePosition = endPoint\n polyline.yAnglePosition = startPoint\n const diffrence1 = Cartesian3.subtract(xyPoint, endPoint, {} as any)\n const diffrence2 = Cartesian3.subtract(xyPoint, startPoint, {} as any)\n let diffrence3 = Cartesian3.subtract(endPoint, startPoint, {} as any)\n polyline.yAngle = Cartesian3.angleBetween(diffrence2, diffrence3)\n diffrence3 = Cartesian3.negate(diffrence3, diffrence3)\n polyline.xAngle = Cartesian3.angleBetween(diffrence1, diffrence3)\n polyline.xDistance = Cartesian3.magnitude(diffrence1)\n polyline.yDistance = Cartesian3.magnitude(diffrence2)\n }\n }\n\n const updateLabelPositionPolygon = () => {\n computedRenderDatas.value.forEach((polyline, index) => {\n const positions = polyline.polygonPositions!\n if (!(positions.length < 2)) {\n const { defined, SceneTransforms, Cartesian2, HorizontalOrigin } = Cesium\n const { viewer } = $services\n const scene = viewer.scene\n\n let startPosition = polyline.positions[0]\n const positionWindow = SceneTransforms.wgs84ToWindowCoordinates(scene, startPosition, {} as any)\n\n let startPositionWindow = defined(positionWindow)\n ? Cartesian2.clone(positionWindow, {} as any)\n : Cartesian2.fromElements(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY, {} as any)\n let startY = startPositionWindow.y\n const primitiveCollection = primitiveCollectionRef.value?.cesiumObject as Cesium.PrimitiveCollection\n const labelCollection: Array<Cesium.LabelCollection> = (primitiveCollection as any)._primitives.filter(\n v => v instanceof Cesium.LabelCollection\n )\n const labels = labelCollection[index]._labels\n const labelTotalLength = labels[labels.length - 1]\n\n if (!labelTotalLength) return\n for (let i = 1; i < positions.length; i++) {\n const positionWindow = SceneTransforms.wgs84ToWindowCoordinates(scene, positions[i], {} as any)\n if (defined(positionWindow)) {\n const l = (startPositionWindow.y - positionWindow.y) / (positionWindow.x - startPositionWindow.x)\n const label = labels[i - 1]\n if (label && label !== labelTotalLength) {\n label.horizontalOrigin = 0 < l ? HorizontalOrigin.LEFT : HorizontalOrigin.RIGHT\n }\n\n if (positionWindow.y < startY) {\n startY = positionWindow.y\n startPosition = positions[i]\n }\n\n startPositionWindow = Cartesian2.clone(positionWindow, startPositionWindow)\n }\n\n polyline.drawStatus === DrawStatus.AfterDraw && (labelTotalLength.position = startPosition)\n }\n }\n })\n }\n\n const updateLabelPosition = () => {\n computedRenderDatas.value.forEach((polyline, index) => {\n const { defined, SceneTransforms, HorizontalOrigin } = Cesium\n const { viewer } = $services\n const scene = viewer.scene\n const primitiveCollection = primitiveCollectionRef.value?.cesiumObject as Cesium.PrimitiveCollection\n const positions = polyline.positions\n const startPosition = positions[0]\n const endPosition = positions[1]\n const startPositionWindow = SceneTransforms.wgs84ToWindowCoordinates(scene, startPosition, {} as any)\n const endPositionWindow = SceneTransforms.wgs84ToWindowCoordinates(scene, endPosition, {} as any)\n if (defined(startPositionWindow) && defined(endPositionWindow)) {\n const labelCollection: Array<Cesium.LabelCollection> = (primitiveCollection as any)._primitives.filter(\n v => v instanceof Cesium.LabelCollection\n )\n if (labelCollection.length) {\n const label = labelCollection[index].get(0)\n let yLabel: Cesium.Label | undefined,\n xAngleLabel: Cesium.Label | undefined,\n yPixelOffset: Cesium.Cartesian2 | undefined,\n xPixelOffset: Cesium.Cartesian2 | undefined\n if (props.showComponentLines) {\n yLabel = labelCollection[index].get(2)\n xAngleLabel = labelCollection[index].get(3)\n yPixelOffset = makeCartesian2(props.yLabelOpts?.pixelOffset) as Cesium.Cartesian2\n xPixelOffset = makeCartesian2(props.xAngleLabelOpts?.pixelOffset) as Cesium.Cartesian2\n }\n\n if ((startPositionWindow.y - endPositionWindow.y) / (endPositionWindow.x - startPositionWindow.x) > 0) {\n if (!isUndefined(yLabel) && !isUndefined(yPixelOffset)) {\n yPixelOffset.x = -9\n yLabel.pixelOffset = yPixelOffset\n yLabel.horizontalOrigin = HorizontalOrigin.RIGHT\n }\n\n if (!isUndefined(xAngleLabel) && !isUndefined(xPixelOffset)) {\n xPixelOffset.x = 12\n xAngleLabel.pixelOffset = xPixelOffset\n xAngleLabel.horizontalOrigin = HorizontalOrigin.LEFT\n }\n\n label.horizontalOrigin = HorizontalOrigin.LEFT\n } else {\n if (!isUndefined(yLabel) && !isUndefined(yPixelOffset)) {\n yPixelOffset.x = 9\n yLabel.pixelOffset = yPixelOffset\n yLabel.horizontalOrigin = HorizontalOrigin.LEFT\n }\n\n if (!isUndefined(xAngleLabel) && !isUndefined(xPixelOffset)) {\n xPixelOffset.x = -12\n xAngleLabel.pixelOffset = xPixelOffset\n xAngleLabel.horizontalOrigin = HorizontalOrigin.RIGHT\n }\n\n label.horizontalOrigin = HorizontalOrigin.RIGHT\n }\n }\n }\n })\n }\n\n const makeHeightPositions = (polyline: VcSegmentDrawing, position: Cesium.Cartesian3) => {\n const { defined, defaultValue, Cartesian3 } = Cesium\n const { viewer } = $services\n const scene = viewer.scene\n const positions = polyline.positions\n positions[0] = position\n const ellipsoid = scene.frameState.mapProjection.ellipsoid as Cesium.Ellipsoid\n const postionCartographic = ellipsoid.cartesianToCartographic(position, {} as any)\n const globe = scene.globe\n postionCartographic.height = defined(globe) ? defaultValue(globe.getHeight(postionCartographic), 0) : 0\n positions[1] = ellipsoid.cartographicToCartesian(postionCartographic, {} as any)\n polyline.distance = Cartesian3.distance(positions[0], positions[1])\n polyline.labelPosition = Cartesian3.midpoint(positions[0], positions[1], {} as any)\n }\n\n const startNew = () => {\n const { Cartesian3, Plane } = Cesium\n const polyline: VcSegmentDrawing = {\n positions: [new Cartesian3(), new Cartesian3()],\n show: false,\n drawStatus: DrawStatus.BeforeDraw,\n distance: 0,\n labels: [],\n\n pointOpts: {},\n labelOpts: {},\n labelsOpts: {},\n polylineOpts: {},\n primitiveOpts: {},\n polygonOpts: {}\n }\n\n cmpName === 'VcMeasurementVertical' &&\n Object.assign(polyline, {\n draggingPlane: new Plane(Cartesian3.UNIT_X, 0),\n surfaceNormal: new Cartesian3()\n })\n\n renderDatas.value.push(polyline)\n drawStatus.value = DrawStatus.BeforeDraw\n canShowDrawTip.value = true\n drawTip.value = drawTipOpts.value.drawingTipStart\n }\n\n const stop = (removeLatest = true) => {\n if (removeLatest && drawStatus.value === DrawStatus.Drawing) {\n renderDatas.value.pop()\n }\n\n const index = editingPoint.value ? editingPoint.value._vcPolylineIndx : renderDatas.value.length - 1\n const polyline: VcSegmentDrawing = renderDatas.value[index]\n if (polyline) {\n polyline.drawStatus = DrawStatus.AfterDraw\n }\n\n drawStatus.value = DrawStatus.AfterDraw\n canShowDrawTip.value = false\n drawTipPosition.value = [0, 0, 0]\n }\n\n const handleMouseClick = (movement: Cesium.Cartesian2, options?) => {\n const { viewer, drawingFabInstance, selectedDrawingActionInstance, getWorldPosition } = $services\n const drawingFabInstanceVm = drawingFabInstance?.proxy as VcDrawingsRef | VcMeasurementsRef | VcAnalysesRef\n if (options.button === 2 && options.ctrl) {\n // 取消绘制\n const drawingsOption = drawingFabInstanceVm.getDrawingActionInstance(drawingType)\n drawingFabInstanceVm.toggleAction(drawingsOption)\n nextTick(() => {\n emit(\n 'drawEvt',\n {\n name: drawingType,\n finished: true,\n windowPoistion: movement,\n type: 'cancel'\n },\n viewer\n )\n })\n return\n }\n\n if (drawStatus.value === DrawStatus.AfterDraw) {\n startNew()\n }\n\n const index = editingPoint.value ? editingPoint.value._vcPolylineIndx : renderDatas.value.length - 1\n const polyline: VcSegmentDrawing = renderDatas.value[index]\n const positions = polyline.positions\n\n if (options.button === 2 && editingPoint.value) {\n // 放弃编辑\n drawingFabInstanceVm.editingActionName = undefined\n polyline.positions[editingPoint.value._index] = restorePosition\n drawStatus.value = DrawStatus.AfterDraw\n polyline.drawStatus = DrawStatus.AfterDraw\n editingPoint.value = undefined\n drawTip.value = drawTipOpts.value.drawingTipStart\n if (cmpName === 'VcMeasurementHeight') {\n makeHeightPositions(polyline, restorePosition)\n }\n nextTick(() => {\n emit(\n 'drawEvt',\n Object.assign(\n {\n name: drawingType,\n index,\n renderDatas,\n finished: true,\n windowPoistion: movement,\n type: 'cancel'\n },\n computedRenderDatas.value[index]\n ),\n viewer\n )\n })\n return\n }\n\n if (options.button !== 0) {\n return\n }\n\n const { defined } = Cesium\n let type = 'new'\n let emitPosition\n let finished = false\n const scene = viewer.scene\n\n if (drawStatus.value === DrawStatus.BeforeDraw) {\n const position = getWorldPosition(scene, movement, {} as any)\n\n if (!defined(position)) {\n return\n }\n positions[0] = position\n positions[1] = position\n polyline.show = true\n drawStatus.value = DrawStatus.Drawing\n polyline.drawStatus = DrawStatus.Drawing\n drawTip.value = drawTipOpts.value.drawingTipEnd\n emitPosition = position\n finished = false\n\n if (cmpName === 'VcMeasurementVertical') {\n const ellipsoid = scene.frameState.mapProjection.ellipsoid as Cesium.Ellipsoid\n polyline.surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, polyline.surfaceNormal)\n }\n\n if (cmpName === 'VcMeasurementHeight') {\n makeHeightPositions(polyline, position)\n finished = true\n\n polyline.drawStatus = DrawStatus.AfterDraw\n drawStatus.value = DrawStatus.AfterDraw\n drawTip.value = drawTipOpts.value.drawingTipStart\n\n if (props.mode === 1) {\n drawingFabInstanceVm.toggleAction(selectedDrawingActionInstance)\n }\n }\n\n if (cmpName === 'VcAnalysisViewshed') {\n polyline.viewshedOpts = {\n ...props.viewshedOpts\n }\n }\n } else {\n // if (cmpName !== 'VcMeasurementHeight') {\n\n // }\n polyline.drawStatus = DrawStatus.AfterDraw\n drawStatus.value = DrawStatus.AfterDraw\n\n if (editingPoint.value) {\n if (platform().hasTouch === true) {\n const position = getWorldPosition(scene, movement, {} as any)\n if (defined(position)) {\n const positions = polyline.positions\n positions.splice(editingPoint.value._index, 1, position)\n editingPoint.value.pixelSize = props.pointOpts?.pixelSize * 1.0\n }\n }\n\n editingPoint.value = undefined\n drawingFabInstanceVm.editingActionName = undefined\n canShowDrawTip.value = false\n drawTipPosition.value = [0, 0, 0]\n type = editorType.value\n\n if (selectedDrawingActionInstance) {\n drawTip.value = drawTipOpts.value.drawingTipStart\n canShowDrawTip.value = true\n }\n } else {\n if (platform().hasTouch === true) {\n const position = getWorldPosition(scene, movement, {} as any)\n if (defined(position)) {\n const positions = polyline.positions\n positions[1] = position\n }\n }\n if (props.mode === 1) {\n drawingFabInstanceVm.toggleAction(selectedDrawingActionInstance)\n }\n }\n\n finished = true\n emitPosition = polyline.positions[1]\n }\n\n nextTick(() => {\n emit(\n 'drawEvt',\n Object.assign(\n {\n index,\n renderDatas,\n name: drawingType,\n finished,\n position: emitPosition,\n windowPoistion: movement,\n type\n },\n computedRenderDatas.value[index]\n ),\n viewer\n )\n })\n }\n\n const handleMouseMove = movement => {\n const { viewer, getWorldPosition } = $services\n const scene = viewer.scene\n const position = getWorldPosition(scene, movement, {} as any)\n const { defined, Cartographic } = Cesium\n if (!defined(position)) {\n return\n }\n\n drawTipPosition.value = position\n\n if (drawStatus.value !== DrawStatus.Drawing) {\n return\n }\n\n if (cmpName === 'VcMeasurementVertical' && scene.mode === Cesium.SceneMode.SCENE2D) {\n return\n }\n\n const index = editingPoint.value ? editingPoint.value._vcPolylineIndx : renderDatas.value.length - 1\n const polyline: VcSegmentDrawing = renderDatas.value[index]\n\n if (cmpName === 'VcMeasurementVertical') {\n const heightPostion = getHeightPosition(polyline, movement)\n\n if (!isUndefined(heightPostion)) {\n const positions = polyline.positions.slice()\n positions[editingPoint.value ? editingPoint.value._index : 1] = heightPostion\n polyline.positions = positions\n }\n } else if (cmpName === 'VcMeasurementHeight') {\n makeHeightPositions(polyline, position)\n } else if (\n cmpName === 'VcDrawingRectangle' ||\n cmpName === 'VcDrawingRegular' ||\n cmpName === 'VcMeasurementRegular' ||\n cmpName === 'VcMeasurementRectangle'\n ) {\n const positions = polyline.positions\n const startPosition = positions[0]\n const startCartographic = Cartographic.fromCartesian(startPosition, viewer.scene.globe.ellipsoid)\n const endCartographic = Cartographic.fromCartesian(position, viewer.scene.globe.ellipsoid)\n !props.clampToGround && (endCartographic.height = startCartographic.height)\n positions[editingPoint.value ? editingPoint.value._index : 1] = Cartographic.toCartesian(endCartographic, viewer.scene.globe.ellipsoid)\n } else if (cmpName === 'VcAnalysisSightline') {\n // if (props.sightlineType === 'segment') {\n\n // }\n const positions = polyline.positions\n if (editingPoint.value) {\n const index = editingPoint.value._index > 0 ? 1 : 0\n positions[index] = position\n } else {\n positions[1] = position\n }\n } else {\n const positions = polyline.positions.slice()\n positions[editingPoint.value ? editingPoint.value._index : 1] = position\n polyline.positions = positions\n }\n\n nextTick(() => {\n emit(\n 'drawEvt',\n Object.assign(\n {\n index,\n renderDatas,\n name: drawingType,\n finished: false,\n position: polyline.positions[1],\n windowPoistion: movement,\n type: editingPoint.value ? editorType : 'new'\n },\n computedRenderDatas.value[index]\n ),\n viewer\n )\n })\n }\n\n const onEditorClick = e => {\n editorPosition.value = [0, 0, 0]\n showEditor.value = false\n\n if (!props.editable) {\n return\n }\n\n editorType.value = e\n\n const { viewer, drawingFabInstance } = $services\n if (e === 'move') {\n drawTip.value = drawTipOpts.value.drawingTipEditing\n drawStatus.value = DrawStatus.Drawing\n editingPoint.value = mouseoverPoint.value\n restorePosition = renderDatas.value[editingPoint.value._vcPolylineIndx].positions[editingPoint.value._index]\n canShowDrawTip.value = true\n const drawingFabInstanceVm = drawingFabInstance?.proxy as VcDrawingsRef | VcMeasurementsRef | VcAnalysesRef\n drawingFabInstanceVm.editingActionName = drawingType\n } else if (e === 'remove') {\n const index = mouseoverPoint.value._vcPolylineIndx\n const polyline = renderDatas.value[index]\n polyline.positions.splice(mouseoverPoint.value._index, 1)\n } else if (e === 'removeAll') {\n const index = mouseoverPoint.value._vcPolylineIndx\n renderDatas.value.splice(index, 1)\n } else {\n const index = mouseoverPoint.value._vcPolylineIndx\n const polyline = renderDatas.value[index]\n props.editorOpts?.[e]?.callback?.(index, polyline)\n }\n\n emit(\n 'editorEvt',\n {\n type: e,\n renderDatas,\n name: drawingType,\n index: mouseoverPoint.value._vcPolylineIndx\n },\n viewer\n )\n }\n\n const clear = () => {\n renderDatas.value = []\n stop()\n }\n\n // expose public methods\n const publicMethods = { computedRenderDatas, renderDatas, startNew, stop, clear, handleMouseClick, handleMouseMove }\n Object.assign(instance.proxy, publicMethods)\n\n return () => {\n const { createGuid } = Cesium\n\n const children: Array<VNode> = []\n computedRenderDatas.value.forEach((polyline, index) => {\n const isRegular =\n cmpName === 'VcDrawingRectangle' ||\n cmpName === 'VcDrawingRegular' ||\n cmpName === 'VcMeasurementRegular' ||\n cmpName === 'VcMeasurementRectangle'\n const positions = isRegular ? polyline.polygonPositions?.slice() : polyline.positions\n isRegular && positions?.push(positions[0])\n const polylineOpts = Object.assign({}, props.polylineOpts, polyline.polylineOpts)\n props.clampToGround && delete polylineOpts.arcType\n const primitiveOpts = Object.assign({}, props.primitiveOpts, polyline.primitiveOpts)\n if (positions?.length && positions?.length > 1) {\n // polyline\n children.push(\n h(\n props.clampToGround ? VcPrimitiveGroundPolyline : VcPrimitive,\n {\n ...primitiveOpts,\n show: (polyline.show && primitiveOpts.show) || props.editable || polyline.drawStatus === DrawStatus.Drawing,\n onReady: (readyObject: VcReadyObject) => {\n primitiveOpts?.onReady?.(readyObject)\n ;(readyObject.cesiumObject as any)._vcPolylineIndex = index // for editor\n }\n },\n () =>\n h(\n VcGeometryInstance,\n {\n id: createGuid()\n },\n () =>\n h(props.clampToGround ? VcGeometryGroundPolyline : VcGeometryPolyline, {\n positions: positions,\n ...polylineOpts\n })\n )\n )\n )\n\n // viewshed\n if (cmpName === 'VcAnalysisViewshed') {\n children.push(h(VcViewshed, { ...polyline.viewshedOpts }))\n }\n }\n\n if (polyline.polygonPositions && polyline.polygonPositions.length > 2) {\n const polygonOpts = Object.assign({}, props?.polygonOpts, polyline?.polygonOpts)\n polygonOpts.clampToGround = props.clampToGround\n // polygon\n children.push(\n h(VcPolygon, {\n positions: positions,\n show: polyline.show && polygonOpts?.show,\n ...polygonOpts,\n onReady: (readyObject: VcReadyObject) => {\n onVcPrimitiveReady(readyObject)\n polygonOpts?.onReady?.(readyObject)\n ;(readyObject.cesiumObject as any)._vcPolylineIndex = index // for editor\n }\n })\n )\n }\n if (polyline.xyPolylinePositions && polyline.xyPolylinePositions.length > 1) {\n // xyPolyline\n children.push(\n h(\n VcPrimitive,\n {\n show: (polyline.show && primitiveOpts) || props.editable || polyline.drawStatus === DrawStatus.Drawing,\n ...primitiveOpts,\n onReady: (readyObject: VcReadyObject) => {\n primitiveOpts?.onReady?.(readyObject)\n ;(readyObject.cesiumObject as any)._vcPolylineIndex = index // for editor\n }\n },\n () =>\n h(\n VcGeometryInstance,\n {\n id: createGuid()\n },\n () =>\n h(VcGeometryPolyline, {\n positions: polyline.xyPolylinePositions,\n ...polylineOpts\n })\n )\n )\n )\n }\n if (polyline.xyBoxPositions && polyline.xyBoxPositions.length > 1) {\n // xyBox\n children.push(\n h(\n VcPrimitive,\n {\n show: (polyline.show && primitiveOpts) || props.editable || polyline.drawStatus === DrawStatus.Drawing,\n ...primitiveOpts\n },\n () =>\n h(\n VcGeometryInstance,\n {\n id: createGuid()\n },\n () =>\n h(VcGeometryPolyline, {\n positions: polyline.xyBoxPositions,\n ...polylineOpts\n })\n )\n )\n )\n }\n // points\n const polylinePointOpts = Object.assign({}, props.pointOpts, polyline.pointOpts)\n children.push(\n h(VcCollectionPoint, {\n enableMouseEvent: props.enableMouseEvent,\n show: polyline.show,\n points: polyline.points.map((point, subIndex) => {\n const position = point.position as Cesium.Cartesian3\n const pointOpts = Object.assign({}, polylinePointOpts, point)\n return {\n position,\n id: createGuid(),\n _vcPolylineIndx: index, // for editor\n ...pointOpts,\n show:\n (pointOpts?.show || props.editable || polyline.drawStatus === DrawStatus.Drawing) &&\n (cmpName === 'VcAnalysisSightline' && polyline.positions.length === 3 ? subIndex !== 1 : true)\n }\n }),\n onMouseover: onMouseoverPoints,\n onMouseout: onMouseoutPoints,\n onReady: onVcCollectionPointReady\n })\n )\n\n // labels\n children.push(\n h(VcCollectionLabel, {\n enableMouseEvent: props.enableMouseEvent,\n show: polyline.show,\n labels: polyline.labels,\n onReady: onVcCollectionLabelReady\n })\n )\n })\n\n if (props.drawtip?.show && canShowDrawTip.value) {\n const { viewer } = $services\n children.push(\n h(\n VcOverlayHtml,\n {\n position: drawTipPosition.value,\n pixelOffset: props.drawtip?.pixelOffset,\n teleport: {\n to: viewer.container\n }\n },\n () =>\n h(\n 'div',\n {\n class: 'vc-drawtip vc-tooltip--style'\n },\n drawTip.value\n )\n )\n )\n }\n\n if (showEditor.value) {\n const buttons: Array<VNode> = []\n if (mouseoverPoint.value) {\n const editorOpts = props.editorOpts\n for (const key in editorOpts) {\n if (!Array.isArray(editorOpts[key]) && typeof editorOpts[key] !== 'number') {\n const opts = {\n ...editorOpts[key]\n }\n delete opts.color\n\n buttons.push(\n h(\n VcBtn,\n {\n style: { color: editorOpts[key].color, background: editorOpts[key].background },\n ...opts,\n onclick: onEditorClick.bind(undefined, key)\n },\n () =>\n h(\n VcTooltip,\n {\n ...editorOpts[key].tooltip\n },\n () => h('strong', null, editorOpts[key].tooltip?.tip || t(`vc.measurement.editor.${key}`))\n )\n )\n )\n }\n }\n }\n\n const { viewer } = $services\n children.push(\n h(\n VcOverlayHtml,\n {\n position: editorPosition.value,\n pixelOffset: props.editorOpts?.pixelOffset,\n teleport: {\n to: viewer.container\n },\n onMouseenter: onMouseenterEditor,\n onMouseleave: onMouseleaveEditor\n },\n () =>\n h(\n 'div',\n {\n class: 'vc-editor'\n },\n buttons\n )\n )\n )\n }\n return h(\n VcCollectionPrimitive,\n {\n ref: primitiveCollectionRef,\n show: props.show,\n onReady: onPrimitiveCollectionReady\n },\n () => children\n )\n }\n}\n"],"names":[],"mappings":"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