xushiting 2 rokov pred
rodič
commit
509b927c15

+ 15 - 14
src/graphic/Layer.js

@@ -562,25 +562,26 @@ export default class Layer {
       }
       //加宽
       else if (e.code == "KeyA") {
-        const road = dataService.getRoad(focusItem.vectorId);
-        road.width += 100;
-        edgeService.updateEdgeForMovePoint(road.startId);
-        edgeService.updateEdgeForMovePoint(road.endId);
-        roadService.setLanes(road.vectorId);
-        roadService.setMidDivideForPointId(road.startId);
-        roadService.setMidDivideForPointId(road.endId);
+        let road = dataService.getRoad(focusItem.vectorId);
+        if (road) {
+          roadService.updateForWidth(road.vectorId, road.width + 100);
+        } else {
+          road = dataService.getCurveRoad(focusItem.vectorId);
+          curveRoadService.updateForWidth(road.vectorId, road.width + 100);
+        }
+
         this.renderer.autoRedraw();
         this.history.save();
       }
       //变窄
       else if (e.code == "KeyB") {
-        const road = dataService.getRoad(focusItem.vectorId);
-        road.width -= 50;
-        edgeService.updateEdgeForMovePoint(road.startId);
-        edgeService.updateEdgeForMovePoint(road.endId);
-        roadService.setLanes(road.vectorId);
-        roadService.setMidDivideForPointId(road.startId);
-        roadService.setMidDivideForPointId(road.endId);
+        let road = dataService.getRoad(focusItem.vectorId);
+        if (road) {
+          roadService.updateForWidth(road.vectorId, road.width - 50);
+        } else {
+          road = dataService.getCurveRoad(focusItem.vectorId);
+          curveRoadService.updateForWidth(road.vectorId, road.width - 50);
+        }
         this.renderer.autoRedraw();
         this.history.save();
       }

+ 24 - 0
src/graphic/Service/CurveRoadService.js

@@ -561,6 +561,30 @@ export default class CurveRoadService extends RoadService {
     curveEdgeService.setCurves(rightCurveEdge);
   }
 
+  //变宽或者变窄(车道数据不变)
+  updateForWidth(curveRoadId, newWidth) {
+    let curveRoad = dataService.getCurveRoad(curveRoadId);
+    let leftCurveEdge = dataService.getCurveEdge(curveRoad.leftEdgeId);
+    let rightCurveEdge = dataService.getCurveEdge(curveRoad.rightEdgeId);
+
+    let ratio = newWidth / curveRoad.width;
+    for (let i = 0; i < curveRoad.points.length; ++i) {
+      let dx = (leftCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
+      leftCurveEdge.points[i].x = curveRoad.points[i].x + dx;
+      let dy = (leftCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
+      leftCurveEdge.points[i].y = curveRoad.points[i].y + dy;
+      dx = (rightCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
+      rightCurveEdge.points[i].x = curveRoad.points[i].x + dx;
+      dy = (rightCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
+      rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
+    }
+
+    curveEdgeService.setCurves(leftCurveEdge);
+    curveEdgeService.setCurves(rightCurveEdge);
+    this.setLanes(curveRoad);
+    curveRoad.setWidth(newWidth);
+  }
+
   setCurves(curveRoad) {
     curveRoad.curves = mathUtil.getCurvesByPoints(curveRoad.points);
   }

+ 34 - 0
src/graphic/Service/RoadService.js

@@ -1117,6 +1117,40 @@ export default class RoadService {
     edgeService.updateEdgeForMulRoad(road.startId);
     edgeService.updateEdgeForMulRoad(road.endId);
   }
+
+  //变宽或者变窄(车道数据不变)
+  updateForWidth(roadId, newWidth) {
+    let road = dataService.getRoad(roadId);
+    let startPoint = dataService.getPoint(road.startId);
+    let endPoint = dataService.getPoint(road.endId);
+    let leftEdge = dataService.getEdge(road.leftEdgeId);
+    let rightEdge = dataService.getEdge(road.rightEdgeId);
+
+    const line = roadService.getMidLine(road);
+    let leftWidth = mathUtil.getDisForPoinLine(leftEdge.start, line);
+    let rightWidth = mathUtil.getDisForPoinLine(rightEdge.start, line);
+
+    leftWidth = (newWidth / road.width) * leftWidth;
+    rightWidth = (newWidth / road.width) * rightWidth;
+
+    let edgePoints = mathUtil.RectangleVertex(
+      startPoint,
+      endPoint,
+      leftWidth * 2
+    );
+    mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
+    mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
+
+    edgePoints = mathUtil.RectangleVertex(startPoint, endPoint, rightWidth * 2);
+    mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
+    mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
+
+    edgeService.updateEdgeForMovePoint(road.startId);
+    edgeService.updateEdgeForMovePoint(road.endId);
+    roadService.setLanes(road.vectorId);
+    roadService.setMidDivideForPointId(road.startId);
+    roadService.setMidDivideForPointId(road.endId);
+  }
   /****************************************************************************************************************************************************************/
 }