xushiting 2 lat temu
rodzic
commit
9cd0928b3f
2 zmienionych plików z 150 dodań i 151 usunięć
  1. 4 1
      src/graphic/Layer.js
  2. 146 150
      src/graphic/ListenLayer.js

+ 4 - 1
src/graphic/Layer.js

@@ -89,7 +89,7 @@ export default class Layer {
       this.renderer.autoRedraw();
       return;
     }
-
+    this.dragging = false;
     this.setEventName("mouseDown");
     const selectItem = stateService.getSelectItem();
     const eventName = stateService.getEventName();
@@ -506,6 +506,7 @@ export default class Layer {
   onKeydown(e) {
     let focusItem = stateService.getFocusItem();
     if (focusItem) {
+      console.log("键盘(foucus有效):" + e.code);
       if (e.code == "Delete") {
         //删除
         const road = dataService.getRoad(focusItem.vectorId);
@@ -534,6 +535,8 @@ export default class Layer {
         this.renderer.autoRedraw();
         this.history.save();
       }
+    } else {
+      console.log("键盘(foucus无效):" + e.code);
     }
   }
 

+ 146 - 150
src/graphic/ListenLayer.js

@@ -84,6 +84,69 @@ export default class ListenLayer {
   // 同时获得吸附的相关信息
   // 找到选中的symbol(只有选中了,才算是最近的)
   getNearForVectors(position, exceptPointId, exceptRoadIds) {
+    let info1 = this.getNearForRoad(position, exceptPointId, exceptRoadIds);
+    let info2 = this.getNearForCurveRoad(
+      position,
+      exceptPointId,
+      exceptRoadIds
+    );
+
+    let min1 = info1.min1;
+    let modifyPoint = info1.modifyPoint;
+    let _modifyPoint = info1._modifyPoint;
+
+    if (min1 == null) {
+      min1 = info2.min1;
+      modifyPoint = info2.modifyPoint;
+      _modifyPoint = info2._modifyPoint;
+    } else if (info2.min1 != null) {
+      if (info1.min1.distance > info2.min1.distance) {
+        min1 = info2.min1;
+        modifyPoint = info2.modifyPoint;
+        _modifyPoint = info2._modifyPoint;
+      }
+    }
+
+    let min2 = info1.min2;
+    if (min2 == null) {
+      min2 = info2.min2;
+      modifyPoint = info2.modifyPoint;
+      _modifyPoint = info2._modifyPoint;
+    } else if (info2.min2 != null) {
+      if (info1.min2.distance > info2.min2.distance) {
+        min2 = info2.min2;
+        modifyPoint = info2.modifyPoint;
+        _modifyPoint = info2._modifyPoint;
+      }
+    }
+
+    const result = {
+      minPoint: min1,
+      minRoad: min2,
+      tagInfo: {},
+    };
+
+    if (_modifyPoint != null) {
+      result.modifyPoint = JSON.parse(JSON.stringify(_modifyPoint));
+    } else if (
+      modifyPoint.hasOwnProperty("x") &&
+      modifyPoint.hasOwnProperty("y")
+    ) {
+      result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
+    } else if (modifyPoint.hasOwnProperty("x")) {
+      result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
+      result.modifyPoint.x = modifyPoint.x;
+      result.modifyPoint.y = position.y;
+    } else if (modifyPoint.hasOwnProperty("y")) {
+      result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
+      result.modifyPoint.x = position.x;
+      result.modifyPoint.y = modifyPoint.y;
+    }
+
+    return result;
+  }
+
+  getNearForRoad(position, exceptPointId, exceptRoadIds) {
     let min1 = null; // 与墙角的距离
     let min2 = null; // 与墙面的距离
     // 纠正
@@ -95,7 +158,6 @@ export default class ListenLayer {
     if (exceptPointId) {
       hasPointIds.push(exceptPointId);
     }
-
     const roads = dataService.getRoads();
     for (const roadId in roads) {
       if (exceptRoadIds && exceptRoadIds.hasOwnProperty(roadId)) {
@@ -113,7 +175,7 @@ export default class ListenLayer {
         //删除墙
         dataService.deleteRoad(roadId);
         continue;
-        console.error("getNearForVectors************************************");
+        console.error("getNearForRoad************************************");
       }
       const join = mathUtil.getJoinLinePoint(position, line);
 
@@ -262,6 +324,26 @@ export default class ListenLayer {
       }
     }
 
+    return {
+      min1: min1,
+      min2: min2,
+      modifyPoint: modifyPoint,
+      _modifyPoint: _modifyPoint,
+    };
+  }
+
+  getNearForCurveRoad(position, exceptPointId, exceptRoadIds) {
+    let min1 = null; // 与墙角的距离
+    let min2 = null; // 与墙面的距离
+    // 纠正
+    // 垂直,水平
+    const modifyPoint = {};
+    // 吸附在墙面上
+    let _modifyPoint = null;
+    const hasPointIds = [];
+    if (exceptPointId) {
+      hasPointIds.push(exceptPointId);
+    }
     const curveRoads = dataService.getCurveRoads();
     for (const curveRoadId in curveRoads) {
       if (exceptRoadIds && exceptRoadIds.hasOwnProperty(curveRoadId)) {
@@ -269,165 +351,79 @@ export default class ListenLayer {
       }
 
       const curveRoad = dataService.getCurveRoad(curveRoadId);
-      const startPoint = dataService.getCurvePoint(curveRoad.startId);
-      const endPoint = dataService.getCurvePoint(curveRoad.endId);
-      let distance = null;
-
-      //先找端点
-      if (hasPointIds.indexOf(curveRoad.startId) == -1) {
-        hasPointIds.push(curveRoad.startId);
-        distance = mathUtil.getDistance(position, startPoint);
-
-        if (min1 == null || min1.distance > distance) {
-          min1 = {
-            distance: distance,
-            pointId: curveRoad.startId,
-            type: VectorType.CurveRoadCorner,
-          };
-
-          if (min1.distance < Constant.minAdsorbPix) {
-            modifyPoint.linkedPointId = curveRoad.startId;
-            modifyPoint.x = startPoint.x;
-            modifyPoint.y = startPoint.y;
-            delete modifyPoint.linkedPointIdX;
-            delete modifyPoint.linkedPointIdY;
-            break;
-          }
-        }
-
-        //start部分找到了与x接近的其他点
-        if (Math.abs(position.x - startPoint.x) < Constant.minAdsorbPix) {
-          if (!modifyPoint.linkedPointIdX) {
-            modifyPoint.x = startPoint.x;
-            modifyPoint.linkedPointIdX = curveRoad.startId;
-          } else {
-            const linkedPointX = dataService.getCurvePoint(
-              modifyPoint.linkedPointIdX
-            );
-            if (
-              mathUtil.getDistance(position, linkedPointX) >
-              mathUtil.getDistance(position, startPoint)
-            ) {
-              modifyPoint.x = startPoint.x;
-              modifyPoint.linkedPointIdX = curveRoad.startId;
-            }
-          }
-        }
-        //start部分找到了与y接近的其他点
-        if (Math.abs(position.y - startPoint.y) < Constant.minAdsorbPix) {
-          if (!modifyPoint.linkedPointIdY) {
-            modifyPoint.y = startPoint.y;
-            modifyPoint.linkedPointIdY = curveRoad.startId;
-          } else {
-            const linkedPointY = dataService.getCurvePoint(
-              modifyPoint.linkedPointIdY
-            );
-            if (
-              mathUtil.getDistance(position, linkedPointY) >
-              mathUtil.getDistance(position, startPoint)
-            ) {
-              modifyPoint.y = startPoint.y;
-              modifyPoint.linkedPointIdY = curveRoad.startId;
+      for (let i = 0; i < curveRoad.points.length; ++i) {
+        let distance = null;
+        //先找端点
+        if (hasPointIds.indexOf(curveRoad.points[i].vectorId) == -1) {
+          hasPointIds.push(curveRoad.points[i].vectorId);
+          distance = mathUtil.getDistance(position, curveRoad.points[i]);
+
+          if (min1 == null || min1.distance > distance) {
+            min1 = {
+              distance: distance,
+              pointId: curveRoad.points[i].vectorId,
+              type: VectorType.CurveRoadCorner,
+            };
+
+            if (min1.distance < Constant.minAdsorbPix) {
+              modifyPoint.linkedPointId = curveRoad.points[i].vectorId;
+              modifyPoint.x = curveRoad.points[i].x;
+              modifyPoint.y = curveRoad.points[i].y;
+              delete modifyPoint.linkedPointIdX;
+              delete modifyPoint.linkedPointIdY;
+              break;
             }
           }
-        }
-      }
 
-      if (hasPointIds.indexOf(curveRoad.endId) == -1) {
-        hasPointIds.push(curveRoad.endId);
-        distance = mathUtil.getDistance(position, endPoint);
-
-        if (min1 == null || min1.distance > distance) {
-          min1 = {
-            distance: distance,
-            pointId: curveRoad.endId,
-            type: VectorType.CurveRoadCorner,
-          };
-          //end部分找到了墙的端点
-          if (min1.distance < Constant.minAdsorbPix) {
-            modifyPoint.linkedPointId = curveRoad.endId;
-            modifyPoint.x = endPoint.x;
-            modifyPoint.y = endPoint.y;
-            delete modifyPoint.linkedPointIdX;
-            delete modifyPoint.linkedPointIdY;
-            break;
-          }
-        }
-        //end部分找到了与x接近的其他点
-        if (Math.abs(position.x - endPoint.x) < Constant.minAdsorbPix) {
-          if (!modifyPoint.linkedPointIdX) {
-            modifyPoint.x = endPoint.x;
-            modifyPoint.linkedPointIdX = curveRoad.endId;
-          } else {
-            const linkedPointX = dataService.getCurvePoint(
-              modifyPoint.linkedPointIdX
-            );
-            if (
-              mathUtil.getDistance(position, linkedPointX) >
-              mathUtil.getDistance(position, endPoint)
-            ) {
-              modifyPoint.x = endPoint.x;
-              modifyPoint.linkedPointIdX = curveRoad.endId;
+          //start部分找到了与x接近的其他点
+          if (
+            Math.abs(position.x - curveRoad.points[i].x) < Constant.minAdsorbPix
+          ) {
+            if (!modifyPoint.linkedPointIdX) {
+              modifyPoint.x = curveRoad.points[i].x;
+              modifyPoint.linkedPointIdX = curveRoad.points[i].vectorId;
+            } else {
+              const linkedPointX = dataService.getCurvePoint(
+                modifyPoint.linkedPointIdX
+              );
+              if (
+                mathUtil.getDistance(position, linkedPointX) >
+                mathUtil.getDistance(position, curveRoad.points[i])
+              ) {
+                modifyPoint.x = curveRoad.points[i].x;
+                modifyPoint.linkedPointIdX = curveRoad.points[i].vectorId;
+              }
             }
           }
-        }
-        //end部分找到了与y接近的其他点
-        if (Math.abs(position.y - endPoint.y) < Constant.minAdsorbPix) {
-          if (!modifyPoint.linkedPointIdY) {
-            modifyPoint.y = endPoint.y;
-            modifyPoint.linkedPointIdY = curveRoad.endId;
-          } else {
-            const linkedPointY = dataService.getCurvePoint(
-              modifyPoint.linkedPointIdY
-            );
-            if (
-              mathUtil.getDistance(position, linkedPointY) >
-              mathUtil.getDistance(position, endPoint)
-            ) {
-              modifyPoint.y = endPoint.y;
-              modifyPoint.linkedPointIdY = curveRoad.endId;
+          //start部分找到了与y接近的其他点
+          if (
+            Math.abs(position.y - curveRoad.points[i].y) < Constant.minAdsorbPix
+          ) {
+            if (!modifyPoint.linkedPointIdY) {
+              modifyPoint.y = curveRoad.points[i].y;
+              modifyPoint.linkedPointIdY = curveRoad.points[i].vectorId;
+            } else {
+              const linkedPointY = dataService.getCurvePoint(
+                modifyPoint.linkedPointIdY
+              );
+              if (
+                mathUtil.getDistance(position, linkedPointY) >
+                mathUtil.getDistance(position, curveRoad.points[i])
+              ) {
+                modifyPoint.y = curveRoad.points[i].y;
+                modifyPoint.linkedPointIdY = curveRoad.points[i].vectorId;
+              }
             }
           }
         }
       }
     }
-
-    const result = {
-      minPoint: min1,
-      minRoad: min2,
-      tagInfo: {},
+    return {
+      min1: min1,
+      min2: min2,
+      modifyPoint: modifyPoint,
+      _modifyPoint: _modifyPoint,
     };
-
-    if (_modifyPoint != null) {
-      result.modifyPoint = JSON.parse(JSON.stringify(_modifyPoint));
-    } else if (
-      modifyPoint.hasOwnProperty("x") &&
-      modifyPoint.hasOwnProperty("y")
-    ) {
-      result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
-    } else if (modifyPoint.hasOwnProperty("x")) {
-      result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
-      result.modifyPoint.x = modifyPoint.x;
-      result.modifyPoint.y = position.y;
-    } else if (modifyPoint.hasOwnProperty("y")) {
-      result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
-      result.modifyPoint.x = position.x;
-      result.modifyPoint.y = modifyPoint.y;
-    }
-
-    // const tags = dataService.getTags();
-    // for (const tagId in tags) {
-    //   const tag = dataService.getTag(tagId);
-    //   const location = tag.isContain(position);
-    //   if (location) {
-    //     result.tagInfo = {
-    //       tagId: tagId,
-    //       state: "all",
-    //     };
-    //     break;
-    //   }
-    // }
-    return result;
   }
 
   // position用来判断是否在墙的symbol上