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)
|
}
|
}
|