export class EditManager { constructor(viewer, entityFactory, eventHub, labelManager) { this.viewer = viewer this.entityFactory = entityFactory this.eventHub = eventHub this.labelManager = labelManager } computeCenter (positions) { const centerPosition = new Cesium.Cartesian3() Cesium.Cartesian3.add(positions[0], positions[1], centerPosition) Cesium.Cartesian3.add(positions[2], centerPosition, centerPosition) Cesium.Cartesian3.add(positions[3], centerPosition, centerPosition) const center = Cesium.Cartesian3.multiplyByScalar(centerPosition, 0.25, new Cesium.Cartesian3()) const centerPoint1423 = Cesium.Cartesian3.subtract(positions[0], positions[2], new Cesium.Cartesian3()) const centerPoint1234 = Cesium.Cartesian3.subtract(positions[1], positions[3], new Cesium.Cartesian3()) const centerVector = Cesium.Cartesian3.cross(centerPoint1423, centerPoint1234, new Cesium.Cartesian3()) return { center, centerVector } } updateEdgeLabels (index, positions, formatDistance, labels) { const cbPos = (a, b) => new Cesium.CallbackProperty(() => Cesium.Cartesian3.midpoint(a, b, new Cesium.Cartesian3()), false) const cbText = (a, b) => new Cesium.CallbackProperty(() => `${formatDistance(Cesium.Cartesian3.distance(a, b, new Cesium.Cartesian3()))}`, false) if (index === 0) { labels.d01.position = cbPos(positions[index + 1], positions[index]) labels.d01.label.text = cbText(positions[index + 1], positions[index]) labels.d34.position = cbPos(positions[index + 3], positions[index]) labels.d34.label.text = cbText(positions[index + 3], positions[index]) } else if (index === 1) { labels.d01.position = cbPos(positions[index + 1], positions[index]) labels.d01.label.text = cbText(positions[index + 1], positions[index]) labels.d12.position = cbPos(positions[index - 1], positions[index]) labels.d12.label.text = cbText(positions[index - 1], positions[index]) } else if (index === 2) { labels.d12.position = cbPos(positions[index - 1], positions[index]) labels.d12.label.text = cbText(positions[index - 1], positions[index]) labels.d23.position = cbPos(positions[index + 1], positions[index]) labels.d23.label.text = cbText(positions[index + 1], positions[index]) } else if (index === 3) { labels.d34.position = cbPos(positions[index - 3], positions[index]) labels.d34.label.text = cbText(positions[index - 3], positions[index]) labels.d23.position = cbPos(positions[index - 1], positions[index]) labels.d23.label.text = cbText(positions[index - 1], positions[index]) } } register (polygonPositionListRef, activeShapeRef, centerPointRef, axisManager, formatDistance, labels, faceAirLineTool, isActivateEditRef) { const viewer = this.viewer const editTriggerHandler = this.eventHub.get('editTrigger') const editDragHandler = this.eventHub.get('editDrag') editTriggerHandler.setInputAction((click) => { const pickC = viewer.scene.pick(click.position) this.entityFactory.removeEntityLikeName('polygonEditPoint') let isEdit = false if (Cesium.defined(pickC) && pickC.id) { } else { isEdit = false } if (!isEdit) return const positions = polygonPositionListRef.value positions.forEach((ele, index) => { viewer.entities.add({ name: 'polygonEditPoint', id: 'point' + index, position: ele, point: { color: new Cesium.Color(0, 1, 1, 0.9), pixelSize: 10 } }) }) isActivateEditRef.value = true editDragHandler.setInputAction((e) => { let center, centerVector const pick = viewer.scene.pick(e.position) if (Cesium.defined(pick)) { if (!pick.id) return if (pick?.id?.id.slice(0, 5) === 'point') { let pointEntity = pick.id let indexx = pick?.id?.id.slice(5) viewer.scene.screenSpaceCameraController.enableRotate = false viewer.screenSpaceEventHandler.setInputAction((arg) => { const ray = viewer.camera.getPickRay(arg.endPosition) if (ray) { const point = this.computeCenter(positions) center = point.center centerVector = point.centerVector const plane = Cesium.Plane.fromPointNormal(center, Cesium.Cartesian3.normalize(centerVector, new Cesium.Cartesian3())) const intersection = Cesium.IntersectionTests.rayPlane(ray, plane) positions[Number(indexx)] = intersection pointEntity.position = new Cesium.CallbackProperty(() => intersection, false) this.updateEdgeLabels(Number(indexx), positions, formatDistance, labels) activeShapeRef.value.polygon.hierarchy = new Cesium.CallbackProperty(() => new Cesium.PolygonHierarchy(positions), false) const distance = Cesium.Cartesian3.distance(center, centerPointRef.value, new Cesium.Cartesian3()) const lineAxis = Cesium.Cartesian3.subtract(center, centerPointRef.value, new Cesium.Cartesian3()) const normalize = Cesium.Cartesian3.normalize(lineAxis, new Cesium.Cartesian3()) const multiplyByScalar = Cesium.Cartesian3.multiplyByScalar(normalize, distance, new Cesium.Cartesian3()) axisManager.updateAxisEntities(multiplyByScalar) } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE) viewer.screenSpaceEventHandler.setInputAction(({ position }) => { viewer.scene.screenSpaceCameraController.enableRotate = true centerPointRef.value = center polygonPositionListRef.value = positions faceAirLineTool.setPositionData(positions, isActivateEditRef.value, true) viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE) }, Cesium.ScreenSpaceEventType.LEFT_UP) } } }, Cesium.ScreenSpaceEventType.LEFT_DOWN) }, Cesium.ScreenSpaceEventType.LEFT_CLICK) } }