export class EditManager { constructor(viewer, entityFactory, eventHub, labelManager) { this.viewer = viewer this.entityFactory = entityFactory this.eventHub = eventHub this.labelManager = labelManager this.enableCornerDrag = false // 后续开启方式:如需恢复顶点拖拽控制点,在外层调用 // editManager.setCornerDragEnabled(true) // 保持现有逻辑不变,避免再次修改核心代码 } 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') isActivateEditRef.value = true if (axisManager && typeof axisManager.setEditingEnabled === 'function') axisManager.setEditingEnabled(true) const toggleHandler = this.eventHub.get('editModeToggle') toggleHandler.setInputAction((click) => { const results = viewer.scene.drillPick(click.position) let hitPolygon = false let hitController = false if (Array.isArray(results) && results.length > 0) { for (let k = 0; k < results.length; k++) { const rid = (results[k] && (results[k].id?.id || results[k].id || results[k].primitive?.id)) if (!rid) continue const s = String(rid) if (s === 'polygon') { hitPolygon = true; break } if (s.slice(0, 6) === 'sphere' || s.slice(0, 4) === 'axis') { hitController = true; break } } } if (hitController) return if (hitPolygon) { isActivateEditRef.value = true; if (axisManager && axisManager.setEditingEnabled) axisManager.setEditingEnabled(true); return } isActivateEditRef.value = false this.entityFactory.removeEntityLikeName('polygonEditPoint') if (axisManager && axisManager.setEditingEnabled) axisManager.setEditingEnabled(false) }, Cesium.ScreenSpaceEventType.LEFT_CLICK) editTriggerHandler.setInputAction((click) => { this.entityFactory.removeEntityLikeName('polygonEditPoint') if (!this.enableCornerDrag) return if (!isActivateEditRef.value) return const pickC = viewer.scene.pick(click.position) const rid = pickC && (pickC.id?.id || pickC.id || pickC.primitive?.id) if (String(rid) !== 'polygon') 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 } }) }) 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) } // 开启/关闭顶点拖拽控制点(外层调用) // 使用方式:editManager.setCornerDragEnabled(true) setCornerDragEnabled (flag) { this.enableCornerDrag = !!flag } }