一些技术路线测试,增加git,方便代码还原
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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 }
}