xushiting 2 năm trước cách đây
mục cha
commit
d0df403ba5

+ 28 - 0
src/graphic/Controls/AddSVG.js

@@ -0,0 +1,28 @@
+import { mathUtil } from "../Util/MathUtil";
+import { svgService } from "../Service/SVGService";
+
+export default class AddSVG {
+  constructor() {
+    this.newSVG = null;
+    this.center = null;
+  }
+
+  setCenter(value) {
+    this.center = {};
+    mathUtil.clonePoint(this.center, value);
+  }
+
+  buildSVG(center) {
+    this.newSVG = svgService.create(center);
+    listenLayer.clear();
+    this.clear();
+  }
+
+  clear() {
+    this.newSVG = null;
+    this.center = null;
+  }
+}
+
+const addSVG = new AddSVG();
+export { addSVG };

+ 34 - 0
src/graphic/Controls/AddText.js

@@ -0,0 +1,34 @@
+import { mathUtil } from "../Util/MathUtil";
+import { textService } from "../Service/TextService";
+
+export default class AddText {
+  constructor() {
+    this.newText = null;
+    this.center = null;
+    this.value = null;
+  }
+
+  setCenter(value) {
+    this.center = {};
+    mathUtil.clonePoint(this.center, value);
+  }
+
+  setValue(value) {
+    this.value = value;
+  }
+
+  buildText(center) {
+    this.newText = textService.create(center);
+    listenLayer.clear();
+    this.clear();
+  }
+
+  clear() {
+    this.newText = null;
+    this.center = null;
+    this.value = null;
+  }
+}
+
+const addText = new AddText();
+export { addText };

+ 13 - 0
src/graphic/Controls/MoveSVG.js

@@ -0,0 +1,13 @@
+import { dataService } from "../Service/DataService";
+
+export default class MoveSVG {
+  constructor() {}
+
+  moveFullSVG(position, svgId) {
+    let svg = dataService.getSVG(svgId);
+    mathUtil.clonePoint(svg.center, position);
+  }
+}
+
+const moveSVG = new MoveSVG();
+export { moveSVG };

+ 22 - 0
src/graphic/Geometry/SVG.js

@@ -0,0 +1,22 @@
+import VectorType from "../enum/VectorType.js";
+import Geometry from "./Geometry.js";
+import { mathUtil } from "../Util/MathUtil.js";
+import { coordinate } from "../Coordinate.js";
+import Constant from "../Constant.js";
+
+export default class SVG extends Geometry {
+  constructor(center, vectorId) {
+    super();
+    this.center = center;
+    this.name = null;
+    this.geoType = VectorType.SVG;
+    this.setId(vectorId);
+  }
+
+  setCenter(center) {
+    this.center = {
+      x: center.x,
+      y: center.y,
+    };
+  }
+}

+ 41 - 37
src/graphic/Layer.js

@@ -7,9 +7,12 @@ import { historyService } from "./Service/HistoryService";
 import UIControl from "./Controls/UIControl";
 // import { moveRectangle } from "./Controls/MoveRectangle";
 import { moveText } from "./Controls/MoveText";
+import { moveSVG } from "./Controls/MoveSVG";
 import { addRoad } from "./Controls/AddRoad";
 import { addLine } from "./Controls/AddLine";
 import { addCircle } from "./Controls/AddCircle";
+import { addText } from "./Controls/AddText";
+import { addSVG } from "./Controls/AddSVG";
 import { moveRoad } from "./Controls/MoveRoad";
 import { coordinate } from "./Coordinate";
 import Render from "./Renderer/Render";
@@ -125,6 +128,24 @@ export default class Layer {
         stateService.setEventName(LayerEvents.AddingCircle);
         addCircle.setCenter(position);
         break;
+      case LayerEvents.AddText:
+        stateService.setEventName(LayerEvents.MoveText);
+        addText.buildText();
+        stateService.setSelectItem(
+          addText.newText.vectorId,
+          VectorType.Text,
+          SelectState.Select
+        );
+        break;
+      case LayerEvents.AddSVG:
+        stateService.setEventName(LayerEvents.MoveSVG);
+        addSVG.buildSVG();
+        stateService.setSelectItem(
+          addSVG.newSVG.vectorId,
+          VectorType.SVG,
+          SelectState.Select
+        );
+        break;
     }
     stateService.setDraggingItem(selectItem);
     // 清除上一个状态
@@ -455,26 +476,16 @@ export default class Layer {
         }
         needAutoRedraw = true;
         break;
-      case LayerEvents.AddText:
+      case LayerEvents.MoveText:
         needAutoRedraw = true;
-        if (draggingItem == null) {
-          const text = textService.create(position);
-          if (text.vectorId) {
-            stateService.setSelectItem(
-              text.vectorId,
-              VectorType.Text,
-              SelectState.Select
-            );
-            stateService.setDraggingItem(stateService.selectItem);
-          }
-        } else {
+        if (draggingItem != null) {
           moveText.moveFullText(position, draggingItem.vectorId);
         }
         break;
-      case LayerEvents.MoveText:
+      case LayerEvents.MoveSVG:
         needAutoRedraw = true;
         if (draggingItem != null) {
-          moveText.moveFullText(position, draggingItem.vectorId);
+          moveSVG.moveFullSVG(position, draggingItem.vectorId);
         }
         break;
     }
@@ -602,9 +613,16 @@ export default class Layer {
         this.history.save();
         elementService.hideAll();
         break;
-      // case LayerEvents.AddCurveRoad:
-      //   addRoad.setNewRoadPoint("start", position);
-      //   break;
+      case LayerEvents.MoveText:
+        needAutoRedraw = true;
+        this.history.save();
+        elementService.hideAll();
+        break;
+      case LayerEvents.MoveSVG:
+        needAutoRedraw = true;
+        this.history.save();
+        elementService.hideAll();
+        break;
       case LayerEvents.AddingCurveRoad:
         needAutoRedraw = true;
         if (addRoad.canAdd) {
@@ -637,13 +655,6 @@ export default class Layer {
         needAutoRedraw = true;
         this.history.save();
         break;
-      case LayerEvents.MoveText:
-        needAutoRedraw = true;
-        if (focusItem != null && focusItem.type == VectorType.Text) {
-          this.uiControl.currentUI = focusItem.type;
-        }
-        this.history.save();
-        break;
     }
 
     this.setEventName("mouseUp");
@@ -875,25 +886,18 @@ export default class Layer {
           stateService.setEventName(LayerEvents.MoveCurveLine);
         } else if (selectItem.type == VectorType.Circle) {
           stateService.setEventName(LayerEvents.MoveCircle);
+        } else if (selectItem.type == VectorType.Text) {
+          stateService.setEventName(LayerEvents.MoveText);
+        } else if (selectItem.type == VectorType.SVG) {
+          stateService.setEventName(LayerEvents.MoveSVG);
         }
       }
     } else if (eventType == "mouseUp") {
-      if (eventName == LayerEvents.AddText) {
-        //可连续添加
-        //stateService.clearEventName()
-      }
-      // else if (eventName == LayerEvents.AddRoad) {
-      //   stateService.setEventName(LayerEvents.AddingRoad);
-      // }
-      else if (eventName == LayerEvents.AddingRoad) {
+      if (eventName == LayerEvents.AddingRoad) {
         stateService.setEventName(LayerEvents.AddRoad);
       } else if (eventName == LayerEvents.AddingLine) {
         stateService.setEventName(LayerEvents.AddLine);
-      }
-      // else if (eventName == LayerEvents.AddCurveRoad) {
-      //   stateService.setEventName(LayerEvents.AddingCurveRoad);
-      // }
-      else if (eventName == LayerEvents.AddingCurveRoad) {
+      } else if (eventName == LayerEvents.AddingCurveRoad) {
         stateService.setEventName(LayerEvents.AddCurveRoad);
       } else if (eventName == LayerEvents.AddLine) {
         stateService.setEventName(LayerEvents.AddingLine);

+ 44 - 2
src/graphic/ListenLayer.js

@@ -26,7 +26,8 @@ export default class ListenLayer {
           exceptRoadIds,
           exceptCurveRoadPointId,
           exceptCurveRoadId,
-          exceptCrossControlPointId
+          exceptCrossControlPointId,
+          exceptTextId,
   }  
    * @returns 
    */
@@ -72,7 +73,10 @@ export default class ListenLayer {
       position,
       exceptVectorIds.exceptCrossControlPointId
     );
-
+    selectInfo.textInfo = this.isSelectText(
+      position,
+      exceptVectorIds.exceptTextId
+    );
     this.setModifyPoint(position, selectInfo);
     flag = this.updateSelectItem();
     return flag;
@@ -671,6 +675,33 @@ export default class ListenLayer {
     return crossControlPointInfo;
   }
 
+  isSelectText(position, exceptTextId) {
+    let textInfo = {
+      textId: null,
+      type: null,
+      distance: null,
+    };
+    const texts = dataService.getTexts();
+    for (const textId in texts) {
+      if (textId == exceptTextId) {
+        continue;
+      }
+      const text = dataService.getText(textId);
+      const distance = mathUtil.getDistance(position, text.center);
+      if (distance < Constant.minAdsorbPix) {
+        textInfo = {
+          textId: textId,
+          type: VectorType.Text,
+          distance: distance,
+          x: text.center.x,
+          y: text.center.y,
+        };
+      }
+    }
+
+    return textInfo;
+  }
+
   /**
     * 
     * @param info:{ 
@@ -770,6 +801,11 @@ export default class ListenLayer {
         info.controlPointInfo.crossControlPointId;
       this.modifyPoint.x = info.controlPointInfo.x;
       this.modifyPoint.y = info.controlPointInfo.y;
+    } else if (info && info.textInfo.textId) {
+      this.modifyPoint = {};
+      this.modifyPoint.textId = info.textInfo.textId;
+      this.modifyPoint.x = info.textInfo.center.x;
+      this.modifyPoint.y = info.textInfo.center.y;
     } else if (
       info &&
       (info.roadEdgeInfo.edgeId || info.curveRoadEdgeInfo.curveEdgeId)
@@ -899,6 +935,12 @@ export default class ListenLayer {
         VectorType.ControlPoint,
         SelectState.Select
       );
+    } else if (this.modifyPoint.textId) {
+      stateService.setSelectItem(
+        this.modifyPoint.textId,
+        VectorType.Text,
+        SelectState.Select
+      );
     } else if (this.modifyPoint.linkedEdgeId) {
       stateService.setSelectItem(
         this.modifyPoint.linkedEdgeId,

+ 17 - 0
src/graphic/Service/DataService.js

@@ -466,6 +466,23 @@ export class DataService {
     return this.vectorData.texts;
   }
 
+  //
+  addSVG(SVG) {
+    this.vectorData.SVGs[SVG.vectorId] = SVG;
+  }
+
+  getSVG(SVGId) {
+    return this.vectorData.SVGs[SVGId];
+  }
+
+  deleteSVG(SVGId) {
+    delete this.vectorData.SVGs[SVGId];
+  }
+
+  getSVGs() {
+    return this.vectorData.SVGs;
+  }
+
   clear() {
     this.vectorData = {};
   }

+ 16 - 0
src/graphic/Service/SVGService.js

@@ -0,0 +1,16 @@
+import SVG from "../Geometry/SVG.js";
+import { dataService } from "./DataService.js";
+import { mathUtil } from "../Util/MathUtil.js";
+
+export default class SVGService {
+  constructor() {}
+
+  create(position, svgId) {
+    let svg = new SVG(position, svgId);
+    dataService.addSVG(svg);
+    return svg;
+  }
+}
+
+const svgService = new SVGService();
+export { svgService };

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

@@ -26,9 +26,13 @@ const LayerEvents = {
 
   MoveCurveLine: "moveCurveLine",
   MoveLine: "moveLine",
+
   AddText: "addText",
   MoveText: "moveText",
 
+  AddSVG: "addSVG",
+  MoveSVG: "moveSVG",
+
   Img: "Img",
   MoveMeasureArrow: "moveMeasureArrow",
 };

+ 1 - 0
src/graphic/enum/VectorType.js

@@ -14,6 +14,7 @@ const VectorType = {
   CurveRoadEdge: "CurveRoadEdge",
   CurveRoadPoint: "CurveRoadPoint",
   Text: "Text",
+  SVG: "SVG",
   BackgroundImg: "BackgroundImg",
 };
 export default VectorType;