一些技术路线测试,增加git,方便代码还原
f
shuishen
2025-11-21 7bab9ee5b085382ffe2344ca0c504c3aa7770d25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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)
  }
}