Ver código fonte

命令修改

haojianlong 4 anos atrás
pai
commit
880c9bef6d

+ 5 - 1
persagy-web-base/README.md

@@ -3,7 +3,11 @@
 事件传递基类及命令基类
 
 ### 版本日志
-
+    
+    |
+    |
+    |
+    |-- 2.2.2 增加命令栈命令列表变化时抛出事件
     |
     |
     |

+ 1 - 1
persagy-web-base/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@persagy-web/base",
-    "version": "2.2.1",
+    "version": "2.2.2",
     "description": "博锐尚格Web基础库。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",

+ 4 - 0
persagy-web-base/src/undo/SUndoStack.ts

@@ -42,6 +42,10 @@ export class SUndoStack extends SObject {
     get index(): number {
         return this._index;
     }
+    set index(v: number) {
+        this._index = v;
+        this.$emit("cmdListChange");
+    }
 
     /** 命令栈是否为空 */
     get isEmpty(): boolean {

+ 2 - 2
persagy-web-big-edit/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@persagy-web/big-edit",
-    "version": "2.2.40",
+    "version": "2.2.41",
     "description": "博锐尚格二维图形编辑器。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -40,7 +40,7 @@
         "typescript": "^3.5.3"
     },
     "dependencies": {
-        "@persagy-web/edit": "2.2.33",
+        "@persagy-web/edit": "2.2.34",
         "@types/uuid": "^8.0.0",
         "crypto-js": "^4.0.0",
         "axios": "^0.20.0"

+ 2 - 2
persagy-web-big/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@persagy-web/big",
-    "version": "2.2.60",
+    "version": "2.2.61",
     "description": "博锐尚格建筑信息化库",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -41,7 +41,7 @@
         "typescript": "^3.9.3"
     },
     "dependencies": {
-        "@persagy-web/graph": "2.2.51",
+        "@persagy-web/graph": "2.2.52",
         "axios": "^0.18.0",
         "pako": "^1.0.10",
         "crypto-js": "^4.0.0",

+ 2 - 2
persagy-web-draw/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@persagy-web/draw",
-    "version": "2.2.16",
+    "version": "2.2.17",
     "description": "博锐尚格绘制引擎。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -35,7 +35,7 @@
         "typescript": "^3.5.3"
     },
     "dependencies": {
-        "@persagy-web/base": "2.2.1"
+        "@persagy-web/base": "2.2.2"
     },
     "jest": {
         "setupFiles": [

+ 2 - 2
persagy-web-edit/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@persagy-web/edit",
-    "version": "2.2.33",
+    "version": "2.2.34",
     "description": "博锐尚格二维图形编辑器。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -40,7 +40,7 @@
         "typescript": "^3.5.3"
     },
     "dependencies": {
-        "@persagy-web/big": "2.2.60",
+        "@persagy-web/big": "2.2.61",
         "@types/uuid": "^8.0.0"
     }
 }

+ 3 - 0
persagy-web-graph/README.md

@@ -6,6 +6,9 @@
     无特殊说明单版本为跟随依赖版本升级
     |
     |
+    |-- 2.2.52 选择器批量移动及撤销重做
+    |
+    |
     |-- 2.2.47 属性修改命令 zorder 特殊处理需要多传参数
     |
     |

+ 2 - 2
persagy-web-graph/package.json

@@ -1,6 +1,6 @@
 {
     "name": "@persagy-web/graph",
-    "version": "2.2.51",
+    "version": "2.2.52",
     "description": "博锐尚格二维图形引擎。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -40,7 +40,7 @@
         "typescript": "^3.5.3"
     },
     "dependencies": {
-        "@persagy-web/draw": "2.2.16",
+        "@persagy-web/draw": "2.2.17",
         "@types/uuid": "^8.0.0"
     }
 }

+ 17 - 0
persagy-web-graph/src/SGraphItem.ts

@@ -216,6 +216,9 @@ export class SGraphItem extends SObject {
     /** 保存上一次的 grabItem */
     private _lastGrab: SGraphItem | null = null;
 
+    /** 临时存储旧的位置坐标 */
+    _oldPos: SPoint | null = null;
+
     /** 外层自定义数据 */
     protected _data: any | null = null;
     set data(d: any) {
@@ -557,6 +560,10 @@ export class SGraphItem extends SObject {
             );
             this.moveTo(this.pos.x + mp.x, this.pos.y + mp.y);
             this.$emit("onMove", old, this.pos);
+            // 刚开始移动存储旧的坐标
+            if (!this._oldPos) {
+                this._oldPos = old;
+            }
         }
 
         // 处理 hover
@@ -610,8 +617,18 @@ export class SGraphItem extends SObject {
         // 处于移动态
         if (this._isMoving) {
             this._isMoving = false;
+            // 旧的坐标存在抛出事件
+            if (this._oldPos) {
+                this.$emit(
+                    "moveEnd",
+                    new SPoint(this._oldPos),
+                    new SPoint(this.pos)
+                );
+                this._oldPos = null;
+            }
             this.releaseItem();
         }
+        // 场景存在
         if (this.scene) {
             this.scene.grabItem = this._lastGrab;
         }

+ 17 - 3
persagy-web-graph/src/SGraphSelectContainer.ts

@@ -1031,6 +1031,9 @@ export class SGraphSelectContainer extends SGraphItem {
                         event.y - this._mouseDownPos.y
                     );
                     this.itemList.forEach((t): void => {
+                        if (!t._oldPos) {
+                            t._oldPos = new SPoint(t.pos.x, t.pos.y);
+                        }
                         t.moveTo(t.x + mp.x, t.y + mp.y);
                     });
                 }
@@ -1059,10 +1062,21 @@ export class SGraphSelectContainer extends SGraphItem {
      */
     onMouseUp(event: SMouseEvent): boolean {
         this.curIndex = -1;
+        if (this._isMoving) {
+            const list: SGraphItem[] = [];
+            const oldPList = this.itemList.map(t => {
+                list.push(t);
+                if (t._oldPos) {
+                    return new SPoint(t._oldPos);
+                }
+            });
+            const newPList = this.itemList.map(t => new SPoint(t.pos));
+            this.itemList.forEach((t): void => {
+                t._oldPos = null;
+            });
+            this.$emit("groupMove", list, oldPList, newPList);
+        }
         super.onMouseUp(event);
-        // this.itemList.forEach(t => {
-        //     t.moveToOrigin(t.x, t.y);
-        // });
         return true;
     }
 

+ 117 - 0
persagy-web-graph/src/commands/SGraphGroupMoveCommand.ts

@@ -0,0 +1,117 @@
+/*
+ * *********************************************************************************************************************
+ *
+ *          !!
+ *        .F88X
+ *        X8888Y
+ *      .}888888N;
+ *        i888888N;        .:!              .I$WI:
+ *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
+ *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
+ *            +888888N;  .8888888Y                                  "&&8Y.}8,
+ *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
+ *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
+ *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
+ *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
+ *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
+ *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
+ *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
+ *      .:R888888I
+ *      .&888888I                                          Copyright (c) 2009-2021.  博锐尚格科技股份有限公司
+ *        ~8888'
+ *        .!88~                                                                     All rights reserved.
+ *
+ * *********************************************************************************************************************
+ */
+
+import { SGraphCommand } from "./SGraphCommand";
+import { SUndoCommand } from "@persagy-web/base";
+import { SGraphScene } from "../SGraphScene";
+import { SGraphItem } from "../SGraphItem";
+import { SPoint } from "@persagy-web/draw";
+
+export default class SGraphGroupMoveCommand extends SGraphCommand {
+    /** 命令名称 */
+    readonly command: string;
+    /** 执行命令的 item 的列表 */
+    item: SGraphItem[];
+    /** 移动前位置 */
+    old: SPoint[];
+    /** 移动后位置 */
+    pos: SPoint[];
+
+    /**
+     * 构造函数
+     *
+     * @param scene     当前场景
+     * @param itemList  item 对象列表
+     * @param old       移动前位置
+     * @param pos       移动后位置
+     */
+    constructor(
+        scene: SGraphScene,
+        itemList: SGraphItem[],
+        old: SPoint[],
+        pos: SPoint[]
+    ) {
+        super(scene);
+        this.item = itemList;
+        this.old = old;
+        this.pos = pos;
+        this.command = "SGraphGroupMoveCommand";
+        this.desc = `移动对象列表=${JSON.stringify(itemList.map(t => t.id))}`;
+    }
+
+    /**
+     * 合并命令
+     *
+     * @param command   指定命令
+     * @return 是否已执行合并命令
+     */
+    mergeWith(command: SUndoCommand): boolean {
+        return false;
+    }
+
+    /**
+     * 重做
+     */
+    redo(): void {
+        if (
+            this.item.length > 0 &&
+            this.item.length == this.old.length &&
+            this.old.length == this.pos.length
+        ) {
+            this.item.forEach((t, i): void => {
+                t.pos = new SPoint(this.pos[i]);
+            });
+            this.item[0].update();
+        }
+    }
+
+    /**
+     * 撤销
+     */
+    undo(): void {
+        if (
+            this.item.length > 0 &&
+            this.item.length == this.old.length &&
+            this.old.length == this.pos.length
+        ) {
+            this.item.forEach((t, i) => {
+                t.pos = new SPoint(this.old[i]);
+            });
+            this.item[0].update();
+        }
+    }
+
+    /**
+     * 命令细节描述
+     *
+     * @return 将当前命令转为字符串
+     */
+    toString(): string {
+        return `oldPos=${JSON.stringify(this.old)};\nnewPos=${JSON.stringify(
+            this.pos
+        )}`;
+    }
+}

+ 4 - 4
persagy-web-graph/src/commands/SGraphMoveCommand.ts

@@ -75,10 +75,10 @@ export class SGraphMoveCommand extends SGraphCommand {
      */
     mergeWith(command: SUndoCommand): boolean {
         // 命令相同且执行命令的对象相同
-        if (command instanceof SGraphMoveCommand && command.item == this.item) {
-            command.pos = this.pos;
-            return true;
-        }
+        // if (command instanceof SGraphMoveCommand && command.item == this.item) {
+        //     command.pos = this.pos;
+        //     return true;
+        // }
         return false;
     }
 

+ 3 - 1
persagy-web-graph/src/index.ts

@@ -61,6 +61,7 @@ import { SGraphSvg } from "./types/SGraphSvg";
 import { SGraphStyleItem } from "./items/SGraphStyleItem";
 import { SGraphCircleItem } from "./items/SGraphCircleItem";
 import { SGraphBaseCircle } from "./items/SGraphBaseCircle";
+import SGraphGroupMoveCommand from "./commands/SGraphGroupMoveCommand";
 
 export {
     SGraphItem,
@@ -97,5 +98,6 @@ export {
     SGraphLineItem,
     SGraphStyleItem,
     SGraphCircleItem,
-    SGraphBaseCircle
+    SGraphBaseCircle,
+    SGraphGroupMoveCommand
 };