xushiting пре 2 година
родитељ
комит
f6202e2896

+ 4 - 0
src/graphic/Controls/MoveRoad.js

@@ -5,6 +5,7 @@ import { mathUtil } from "../Util/MathUtil";
 import { curveRoadService } from "../Service/CurveRoadService";
 import { coordinate } from "../Coordinate";
 import { edgeService } from "../Service/EdgeService";
+import { controlPointService } from "../Service/ControlPointService";
 
 export default class MoveRoad {
   constructor() {
@@ -1138,6 +1139,9 @@ export default class MoveRoad {
     curveRoadService.updateForMovePoint(pointId, position);
   }
 
+  moveControlPoint(controlPointId, position) {
+    controlPointService.updateForMovePoint(controlPointId, position);
+  }
   /******************************************************************************************************************************************************************************/
 }
 

+ 32 - 3
src/graphic/Layer.js

@@ -328,6 +328,9 @@ export default class Layer {
         this.lastY = Y;
         break;
       case LayerEvents.MoveCurveRoadPoint:
+        if (!draggingItem || !draggingItem.vectorId) {
+          return;
+        }
         point = dataService.getCurvePoint(draggingItem.vectorId);
         listenLayer.start(
           position,
@@ -342,10 +345,30 @@ export default class Layer {
             y: listenLayer.modifyPoint.y,
           };
         }
-        if (draggingItem) {
-          moveRoad.moveCurveRoadPoint(draggingItem.vectorId, position);
-          needAutoRedraw = true;
+        moveRoad.moveCurveRoadPoint(draggingItem.vectorId, position);
+        needAutoRedraw = true;
+        break;
+      case LayerEvents.MoveControlPoint:
+        if (!draggingItem || !draggingItem.vectorId) {
+          return;
         }
+
+        listenLayer.start(
+          position,
+          draggingItem.vectorId,
+          null,
+          null,
+          null,
+          draggingItem.vectorId
+        );
+        if (listenLayer.modifyPoint) {
+          position = {
+            x: listenLayer.modifyPoint.x,
+            y: listenLayer.modifyPoint.y,
+          };
+        }
+        moveRoad.moveControlPoint(draggingItem.vectorId, position);
+        needAutoRedraw = true;
         break;
       case LayerEvents.AddTag:
         needAutoRedraw = true;
@@ -503,6 +526,10 @@ export default class Layer {
         needAutoRedraw = true;
         this.history.save();
         break;
+      case LayerEvents.MoveControlPoint:
+        needAutoRedraw = true;
+        this.history.save();
+        break;
       case LayerEvents.MoveTag:
         needAutoRedraw = true;
         if (focusItem != null && focusItem.type == VectorType.Tag) {
@@ -716,6 +743,8 @@ export default class Layer {
           stateService.setEventName(LayerEvents.MoveCurveRoad);
         } else if (selectItem.type == VectorType.CurvePoint) {
           stateService.setEventName(LayerEvents.MoveCurveRoadPoint);
+        } else if (selectItem.type == VectorType.ControlPoint) {
+          stateService.setEventName(LayerEvents.MoveControlPoint);
         } else if (selectItem.type == VectorType.Tag) {
           stateService.setEventName(LayerEvents.MoveTag);
         } else if (selectItem.type == VectorType.MeasureLine) {

+ 69 - 3
src/graphic/ListenLayer.js

@@ -36,6 +36,12 @@ export default class ListenLayer {
       state: null,
     };
 
+    this.crossControlPointInfo = {
+      crossControlPointId: null,
+      type: null,
+      distance: null,
+    };
+
     this.tagInfo = {
       tagId: null,
       state: null,
@@ -54,7 +60,8 @@ export default class ListenLayer {
     exceptPointId,
     exceptRoadIds,
     exceptCurvePointId,
-    exceptCurveRoadId
+    exceptCurveRoadId,
+    exceptCrossControlPointId
   ) {
     let flag = false;
     this.clear();
@@ -62,12 +69,19 @@ export default class ListenLayer {
     let roadInfo = this.isSelectRoad(position, exceptRoadIds);
     let curvePointInfo = this.isSelectCurvePoint(position, exceptCurvePointId);
     let pointInfo = this.isSelectPoint(position, exceptPointId);
+    //交叉口拐弯处的控制点
+    let controlPointInfo = this.isSelectCrossControlPoint(
+      position,
+      exceptPointId
+    );
+
     this.setModifyPoint(
       position,
       pointInfo,
       curvePointInfo,
       roadInfo,
-      curveRoadInfo
+      curveRoadInfo,
+      controlPointInfo
     );
     // let flag1 = this.equalAndClone(this.curveRoadInfo, curveRoadInfo);
     // let flag2 = this.equalAndClone(this.roadInfo, roadInfo);
@@ -326,7 +340,41 @@ export default class ListenLayer {
     return curveRoadInfo;
   }
 
-  setModifyPoint(position, pointInfo, curvePointInfo, roadInfo, curveRoadInfo) {
+  isSelectCrossControlPoint(position, exceptCrossControlPointId) {
+    let crossControlPointInfo = {
+      crossControlPointId: null,
+      type: null,
+      distance: null,
+    };
+    const controlPoints = dataService.getControlPoints();
+    for (const controlPointId in controlPoints) {
+      if (controlPointId == exceptCrossControlPointId) {
+        continue;
+      }
+      const controlPoint = dataService.getControlPoint2(controlPointId);
+      const distance = mathUtil.getDistance(position, controlPoint);
+      if (distance < Constant.minAdsorbPix) {
+        crossControlPointInfo = {
+          crossControlPointId: controlPointId,
+          type: VectorType.ControlPoint,
+          distance: distance,
+          x: controlPoint.x,
+          y: controlPoint.y,
+        };
+      }
+    }
+
+    return crossControlPointInfo;
+  }
+
+  setModifyPoint(
+    position,
+    pointInfo,
+    curvePointInfo,
+    roadInfo,
+    curveRoadInfo,
+    controlPointInfo
+  ) {
     //优先级最高
     if (pointInfo.pointId || curvePointInfo.curvePointId) {
       this.modifyPoint = {};
@@ -370,6 +418,12 @@ export default class ListenLayer {
         this.modifyPoint.x = curveRoadInfo.x;
         this.modifyPoint.y = curveRoadInfo.y;
       }
+    } else if (controlPointInfo.crossControlPointId) {
+      this.modifyPoint = {};
+      this.modifyPoint.linkedCrossControlPointId =
+        controlPointInfo.crossControlPointId;
+      this.modifyPoint.x = controlPointInfo.x;
+      this.modifyPoint.y = controlPointInfo.y;
     } else if (pointInfo.linkedPointIdX) {
       this.modifyPoint = {};
       this.modifyPoint.linkedPointIdX = pointInfo.linkedPointIdX;
@@ -428,6 +482,12 @@ export default class ListenLayer {
         VectorType.CurveRoad,
         SelectState.Select
       );
+    } else if (this.modifyPoint.linkedCrossControlPointId) {
+      stateService.setSelectItem(
+        this.modifyPoint.linkedCrossControlPointId,
+        VectorType.ControlPoint,
+        SelectState.Select
+      );
     }
 
     let newSelectItem = stateService.getSelectItem();
@@ -485,6 +545,12 @@ export default class ListenLayer {
       state: null,
     };
 
+    this.crossControlPointInfo = {
+      crossControlPointId: null,
+      type: null,
+      distance: null,
+    };
+
     this.tagInfo = {
       tagId: null,
       state: null,

+ 5 - 0
src/graphic/Service/ControlPointService.js

@@ -151,6 +151,11 @@ export default class ControlPointService {
       return false;
     }
   }
+
+  updateForMovePoint(controlPointId, newPosition) {
+    let controlPoint = dataService.getControlPoint2(controlPointId);
+    mathUtil.clonePoint(controlPoint, newPosition);
+  }
 }
 
 const controlPointService = new ControlPointService();

+ 2 - 0
src/graphic/enum/LayerEvents.js

@@ -11,6 +11,8 @@ const LayerEvents = {
   MoveCurveRoad: "moveCurveRoad",
   MoveCurveRoadPoint: "moveCurveRoadPoint",
 
+  MoveControlPoint: "moveControlPoint",
+
   AddTag: "addTag",
   MoveTag: "moveTag",