Преглед изворни кода

修改fittoview 底图跑偏问题;增加计算业务空间差集算法;优化代码;配合引擎touch事件;发布新版本2.0.489

haojianlong пре 5 година
родитељ
комит
aace76a3a2

+ 4 - 4
package-lock.json

@@ -1,6 +1,6 @@
 {
     "name": "@saga-web/cad-engine",
-    "version": "2.0.416",
+    "version": "2.0.487",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
@@ -30,9 +30,9 @@
             "integrity": "sha512-V5Xgh02IFmRgM0/7Hkm34RFS/VHepK7786LefuJLyuRh0B48DNJSPrkBAgad5Rl5VM76c8hSQikiS/fyuy7nDQ=="
         },
         "@saga-web/draw": {
-            "version": "2.1.61",
-            "resolved": "http://dev.dp.sagacloud.cn:8082/repository/npm-saga/@saga-web/draw/-/draw-2.1.61.tgz",
-            "integrity": "sha512-xjAtaQEBrjSwNKMT3gFY7kgZLvQfyMYyMaNKlXPdkPdC63+7X+wDIp1oTRKgTqHCiCp3u6Jx0KBFVzGZShAyDw==",
+            "version": "2.1.71",
+            "resolved": "http://dev.dp.sagacloud.cn:8082/repository/npm-saga/@saga-web/draw/-/draw-2.1.71.tgz",
+            "integrity": "sha512-Dtn/TVaj/PiA95Yr0cyR9+KKqTa1nOsYYJxekm0XN9ETMForfZgib4y4exRwLhOEq7HwjKR/q+SCtCLRnDTvVQ==",
             "requires": {
                 "@saga-web/base": "^2.1.9"
             }

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
     "name": "@saga-web/cad-engine",
-    "version": "2.0.446",
+    "version": "2.0.489",
     "description": "上格云 CAD图形引擎。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -32,7 +32,7 @@
     },
     "dependencies": {
         "@saga-web/base": "2.1.9",
-        "@saga-web/draw": "2.1.61",
+        "@saga-web/draw": "2.1.71",
         "@saga-web/graphy": "2.1.34",
         "axios": "^0.18.0",
         "pako": "^1.0.10",

+ 173 - 100
src/DivideFloorScene.ts

@@ -30,7 +30,9 @@ import { MinDis } from "./types/MinDis";
 import { PointToLine } from "./types/PointToLine";
 import { RectSelectItem } from "./items/RectSelectItem";
 // @ts-ignore
-import { intersect, difference } from "polybooljs";
+import { combine, difference, intersect } from "polybooljs";
+// @ts-ignore
+import { polygon, segments, selectUnion } from "polybooljs";
 import { ShadeItem } from "./items/ShadeItem";
 import { Point } from "./types/Point";
 import { LikeSpaceItem } from "./items/LikeSpaceItem";
@@ -77,13 +79,15 @@ export class DivideFloorScene extends FloorScene {
             return;
         }
         this._isZoneSelectable = v;
-        this.zoneList.map((t: ZoneItem) => {
-            t.selectable = this._isZoneSelectable;
-            if (!t.selectable) {
-                t.selected = false;
+        this.zoneList.map(
+            (t: ZoneItem): ZoneItem => {
+                t.selectable = this._isZoneSelectable;
+                if (!t.selectable) {
+                    t.selected = false;
+                }
+                return t;
             }
-            return t;
-        });
+        );
     } // Set isZoneSelectable
 
     /** 是否开启吸附  */
@@ -122,10 +126,12 @@ export class DivideFloorScene extends FloorScene {
      */
     addSceneMark(data: SPoint[]): void {
         if (data.length) {
-            let outline = data.map(t => {
-                t.y = -t.y;
-                return t;
-            });
+            let outline = data.map(
+                (t: SPoint): SPoint => {
+                    t.y = -t.y;
+                    return t;
+                }
+            );
             let sceneMark = new SceneMarkItem(null, outline);
             this.addItem(sceneMark);
             this.sceneMark = sceneMark;
@@ -165,7 +171,7 @@ export class DivideFloorScene extends FloorScene {
      */
     addAllShade(data: SPoint[][]): void {
         if (data.length) {
-            data.map(t => {
+            data.forEach((t): void => {
                 this.addShade(t);
             });
         }
@@ -177,10 +183,12 @@ export class DivideFloorScene extends FloorScene {
      * @param   data    遮罩数据
      */
     addShade(data: SPoint[]): void {
-        let outLine = data.map(t => {
-            t.y = -t.y;
-            return t;
-        });
+        let outLine = data.map(
+            (t: SPoint): SPoint => {
+                t.y = -t.y;
+                return t;
+            }
+        );
         let item = new ShadeItem(null, outLine);
         this.shadeList.push(item);
         this.addItem(item);
@@ -193,7 +201,7 @@ export class DivideFloorScene extends FloorScene {
      */
     addAllLikeSpace(data: Point[][][]): void {
         if (data.length) {
-            data.map(t => {
+            data.forEach((t): void => {
                 this.addLikeSpace(t);
             });
         }
@@ -218,7 +226,7 @@ export class DivideFloorScene extends FloorScene {
      */
     clearLikeSpaces(): void {
         if (this.likeSpaceList.length) {
-            this.likeSpaceList.map(t => {
+            this.likeSpaceList.forEach((t): void => {
                 this.removeItem(t);
             });
             this.likeSpaceList = [];
@@ -230,7 +238,7 @@ export class DivideFloorScene extends FloorScene {
      */
     getSelectedLikeSpace(): LikeSpaceItem[] {
         let arr: LikeSpaceItem[] = [];
-        this.likeSpaceList.map(t => {
+        this.likeSpaceList.forEach((t): void => {
             if (t.selected) {
                 arr.push(t);
             }
@@ -367,11 +375,11 @@ export class DivideFloorScene extends FloorScene {
      * @param   _this   接收者
      * @param   fn      处理函数
      */
-    click(_this: any, fn: Function): void {
-        this.spaceList.map(t => {
+    click(_this: FloorScene, fn: Function): void {
+        this.spaceList.forEach((t): void => {
             t.connect("click", _this, fn);
         });
-        this.zoneList.map(t => {
+        this.zoneList.forEach((t): void => {
             t.connect("click", _this, fn);
         });
     } // Function click()
@@ -382,7 +390,7 @@ export class DivideFloorScene extends FloorScene {
      *  @param  zone   业务空间list
      */
     addZoneList(zone: Zone[]): void {
-        zone.map(t => {
+        zone.forEach((t): void => {
             this.addZone(t);
         });
     } // Function addZoneList()
@@ -400,25 +408,16 @@ export class DivideFloorScene extends FloorScene {
     } // Function addZone()
 
     /**
-     *  清空选中的空间
-     *
-     */
-    clearSpaceSelection(): void {
-        this.spaceList.map(t => {
-            t.selected = false;
-            return t;
-        });
-    } // Function clearSpaceSelection()
-
-    /**
      *  清空选中的业务空间
      *
      */
     clearZoneSelection(): void {
-        this.zoneList.map(t => {
-            t.selected = false;
-            return t;
-        });
+        this.zoneList.map(
+            (t): ZoneItem => {
+                t.selected = false;
+                return t;
+            }
+        );
     } // Function clearZoneSelection()
 
     /**
@@ -426,7 +425,7 @@ export class DivideFloorScene extends FloorScene {
      */
     removeAllZone(): void {
         if (this.zoneList.length) {
-            this.zoneList.map(t => {
+            this.zoneList.forEach((t): void => {
                 this.removeItem(t);
             });
             this.zoneList = [];
@@ -438,7 +437,7 @@ export class DivideFloorScene extends FloorScene {
      */
     getSelectedZone(): ZoneItem[] {
         let arr: ZoneItem[] = [];
-        this.zoneList.map(t => {
+        this.zoneList.forEach((t): void => {
             if (t.selected) {
                 arr.push(t);
             }
@@ -511,7 +510,7 @@ export class DivideFloorScene extends FloorScene {
     absorbSpacePoint(event: SMouseEvent, absorbLen: number): MinDis {
         let minPointDis = Number.MAX_SAFE_INTEGER;
         let Point;
-        this.spaceList.map(space => {
+        this.spaceList.map((space): void => {
             if (
                 DivideFloorScene.isPointInAbsorbArea(
                     new SPoint(event.x, event.y),
@@ -521,7 +520,7 @@ export class DivideFloorScene extends FloorScene {
                     space.maxY
                 )
             ) {
-                space.data.OutLine.map(item => {
+                space.data.OutLine.forEach((item): void => {
                     let minDis = SMathUtil.getMinDisPoint(
                         new SPoint(event.x, event.y),
                         item
@@ -537,11 +536,10 @@ export class DivideFloorScene extends FloorScene {
                 });
             }
         });
-        let minPoint = {
+        return {
             MinDis: minPointDis,
             Point: Point
         };
-        return minPoint;
     } // Function absorbSpacePoint()
 
     /**
@@ -554,7 +552,7 @@ export class DivideFloorScene extends FloorScene {
     absorbSpaceLine(event: SMouseEvent, absorbLen: number): PointToLine {
         let minPointDis = Number.MAX_SAFE_INTEGER;
         let Point, Line;
-        this.spaceList.map(space => {
+        this.spaceList.forEach((space): void => {
             if (
                 DivideFloorScene.isPointInAbsorbArea(
                     new SPoint(event.x, event.y),
@@ -564,7 +562,7 @@ export class DivideFloorScene extends FloorScene {
                     space.maxY
                 )
             ) {
-                space.data.OutLine.map(item => {
+                space.data.OutLine.forEach((item): void => {
                     let minDisLine = SMathUtil.getMinDisLine(
                         new SPoint(event.x, event.y),
                         item
@@ -581,12 +579,11 @@ export class DivideFloorScene extends FloorScene {
                 });
             }
         });
-        let minPointLine = {
+        return {
             MinDis: minPointDis,
             Point: Point,
             Line: Line
         };
-        return minPointLine;
     } // Function absorbSpaceLine()
 
     /**
@@ -629,10 +626,12 @@ export class DivideFloorScene extends FloorScene {
     absorbShadePoint(event: SMouseEvent, absorbLen: number): MinDis {
         let minPointDis = Number.MAX_SAFE_INTEGER;
         let Point;
-        this.shadeList.map(shade => {
-            let PointArr = shade.outLine.map(item => {
-                return { X: item.x, Y: -item.y, Z: 0 };
-            });
+        this.shadeList.forEach((shade): void => {
+            let PointArr = shade.outLine.map(
+                (item): Point => {
+                    return { X: item.x, Y: -item.y, Z: 0 };
+                }
+            );
             let minDis = SMathUtil.getMinDisPoint(
                 new SPoint(event.x, event.y),
                 PointArr
@@ -646,11 +645,10 @@ export class DivideFloorScene extends FloorScene {
                 Point = minDis.Point;
             }
         });
-        let minPoint = {
+        return {
             MinDis: minPointDis,
             Point: Point
         };
-        return minPoint;
     } // Function absorbSpacePoint()
 
     /**
@@ -663,10 +661,12 @@ export class DivideFloorScene extends FloorScene {
     absorbShadeLine(event: SMouseEvent, absorbLen: number): PointToLine {
         let minPointDis = Number.MAX_SAFE_INTEGER;
         let Point, Line;
-        this.shadeList.map(shade => {
-            let PointArr = shade.outLine.map(item => {
-                return { X: item.x, Y: -item.y, Z: 0 };
-            });
+        this.shadeList.map((shade): void => {
+            let PointArr = shade.outLine.map(
+                (item): Point => {
+                    return { X: item.x, Y: -item.y, Z: 0 };
+                }
+            );
             let minDisLine = SMathUtil.getMinDisLine(
                 new SPoint(event.x, event.y),
                 PointArr
@@ -681,12 +681,11 @@ export class DivideFloorScene extends FloorScene {
                 Line = minDisLine.Line;
             }
         });
-        let minPointLine = {
+        return {
             MinDis: minPointDis,
             Point: Point,
             Line: Line
         };
-        return minPointLine;
     } // Function absorbSpaceLine()
 
     /**
@@ -711,20 +710,19 @@ export class DivideFloorScene extends FloorScene {
             );
         }
         if (poly2.regions.length) {
-            this.spaceList.map(t => {
+            this.spaceList.forEach((t): void => {
                 if (t.selected) {
                     let poly1 = {
                         regions: [],
                         inverted: false
                     };
                     // @ts-ignore
-                    poly1.regions = t.pointArr.map(item => {
+                    poly1.regions = t.pointArr.map((item): number[][] => {
                         return SMathUtil.transferToArray(item);
                     });
-                    console.log(poly1);
                     let intersectObj = intersect(poly1, poly2);
                     if (intersectObj.regions.length) {
-                        intersectObj.regions.map((t: number[][]) => {
+                        intersectObj.regions.map((t: number[][]): void => {
                             arr.push(SMathUtil.transferToSPoint(t));
                         });
                     }
@@ -766,7 +764,6 @@ export class DivideFloorScene extends FloorScene {
                     poly1.regions = t.pointArr.map((item): number[][] => {
                         return SMathUtil.transferToArray(item);
                     });
-                    console.log(poly1);
                     let intersectObj = intersect(poly1, poly2);
                     if (intersectObj.regions.length) {
                         intersectObj.regions.map((t: number[][]): void => {
@@ -803,11 +800,11 @@ export class DivideFloorScene extends FloorScene {
                     inverted: false
                 };
                 // @ts-ignore
-                poly1.regions = t.pointArr.map(item => {
+                poly1.regions = t.pointArr.map((item): number[][] => {
                     return SMathUtil.transferToArray(item);
                 });
                 let intersectObj = intersect(poly1, poly2);
-                t.selected = intersectObj.regions.length ? true : false;
+                t.selected = !!intersectObj.regions.length;
             });
         }
     } // Function groupSelectSpace()
@@ -860,7 +857,7 @@ export class DivideFloorScene extends FloorScene {
                         inverted: false
                     };
                     // @ts-ignore
-                    poly1.regions = t.pointArr.map(item => {
+                    poly1.regions = t.pointArr.map((item): number[][] => {
                         return SMathUtil.transferToArray(item);
                     });
                     let intersectObj = intersect(poly1, poly2);
@@ -871,7 +868,7 @@ export class DivideFloorScene extends FloorScene {
                         // @ts-ignore
                         Obj[key] = outlineList.map(t => {
                             let arr = [t.Outer];
-                            t.Inner.map(inner => {
+                            t.Inner.forEach((inner): void => {
                                 arr.push(inner);
                             });
                             return arr;
@@ -922,41 +919,117 @@ export class DivideFloorScene extends FloorScene {
 
     /**
      * 选中的空间与所有业务空间的差集
+     *
+     * @param   flag    是否进行下一步交集预算,返回数据格式不同
      */
-    getZoneDifference(): SPoint[][] {
-        let arr: SPoint[][] = [];
-        if (this.zoneList.length) {
-            const poly1: Poly = {
-                regions: [],
-                inverted: false
-            };
-            this.zoneList.forEach((t): void => {
-                t.pointArr.forEach((item): void => {
-                    item.forEach((po): void => {
-                        let point = SMathUtil.transferToArray(po);
-                        poly1.regions.push(point);
-                    });
+    getZoneDifference(flag: boolean = false) {
+        const obj = {};
+        let poly1: Poly = {
+            regions: [],
+            inverted: false
+        };
+        const poly2: Poly = {
+            regions: [],
+            inverted: false
+        };
+        let list: Poly[] = [];
+        this.zoneList.forEach((t): void => {
+            let rect1 = t.boundingRect();
+            t.pointArr.forEach((item): void => {
+                let polygons: Poly = {
+                    regions: [],
+                    inverted: false
+                };
+                item.forEach((po): void => {
+                    let point = SMathUtil.transferToArray(po);
+                    polygons.regions.push(point);
                 });
-            });
-            const poly2: Poly = {
-                regions: [],
-                inverted: false
-            };
-            this.spaceList.forEach((t): void => {
-                if (t.selected) {
-                    poly2.regions = t.pointArr.map((item): number[][] => {
-                        return SMathUtil.transferToArray(item);
-                    });
-                    const diffObj: Poly = difference(poly2, poly1);
-                    if (diffObj.regions.length) {
-                        diffObj.regions.forEach((t: number[][]): void => {
-                            arr.push(SMathUtil.transferToSPoint(t));
-                        });
+                this.spaceList.forEach((space): void => {
+                    if (space.selected) {
+                        let rect2 = space.boundingRect();
+                        if (SMathUtil.rectIntersection(rect1, rect2)) {
+                            list.push(polygons);
+                        }
                     }
-                    console.log(arr);
-                }
+                });
             });
+        });
+        if (list.length) {
+            let seg1 = segments(list[0]);
+            for (let i = 1; i < list.length; i++) {
+                let seg2 = segments(list[i]);
+                let comb = combine(seg1, seg2);
+                seg1 = selectUnion(comb);
+            }
+            poly1 = polygon(seg1);
         }
-        return arr;
+        console.log(poly1);
+        this.spaceList.forEach((t): void => {
+            if (t.selected) {
+                let key: string = t.data.SourceId;
+                poly2.regions = t.pointArr.map((item): number[][] => {
+                    return SMathUtil.transferToArray(item);
+                });
+                const diffObj: Poly = difference(poly2, poly1);
+                if (diffObj.regions.length) {
+                    if (flag) {
+                        // @ts-ignore
+                        obj[key] = diffObj;
+                    } else {
+                        // @ts-ignore
+                        obj[key] = diffObj.regions.map(
+                            (po: number[][]): SPoint[] => {
+                                return SMathUtil.transferToSPoint(po);
+                            }
+                        );
+                    }
+                } else {
+                    // @ts-ignore
+                    obj[key] = flag ? { regions: [], inverted: false } : [];
+                }
+            }
+        });
+        return obj;
     } // getZoneIntersect()
+
+    /**
+     * 获取传入的区域与划分的区域
+     *
+     * @param   poly    多边形or多边形集合,由空间sourceId对应
+     * */
+    getPloyIntersect(poly: { ([propName]: string): Poly } | Poly) {
+        const poly1: Poly = {
+            regions: [],
+            inverted: false
+        };
+        if (this.cutItem) {
+            poly1.regions.push(SMathUtil.transferToArray(this.cutItem.outLine));
+        } else if (this.sceneMark) {
+            poly1.regions.push(
+                SMathUtil.transferToArray(this.sceneMark.outLine)
+            );
+        }
+        // @ts-ignore
+        if (poly.regions) {
+            return polygon(segments(intersect(poly, poly1)));
+        } else {
+            const obj = {};
+            for (let key in poly) {
+                // @ts-ignore
+                obj[key] = [];
+                // @ts-ignore
+                if (poly[key].regions && poly[key].regions.length) {
+                    // @ts-ignore
+                    let interObj: Poly = intersect(poly[key], poly1);
+                    interObj = polygon(segments(interObj));
+                    interObj.regions.forEach((t): void => {
+                        let outline = SMathUtil.transferToSPoint(t);
+                        // @ts-ignore
+                        obj[key].push(outline);
+                    });
+                }
+            }
+            return obj;
+        }
+    } // Function getPloyIntersect()
 } // Class DivideFloorScene

+ 1 - 1
src/FloorScene.ts

@@ -438,7 +438,7 @@ export class FloorScene extends SGraphyScene {
      *  清除选中的空间
      *
      */
-    clearSelectedSpaces(): void {
+    clearSpaceSelection(): void {
         this.spaceList.map(
             (sp): SpaceItem => {
                 sp.selected = false;

+ 6 - 1
src/FloorView.ts

@@ -19,7 +19,12 @@
  */
 
 import { SGraphyView } from "@saga-web/graphy/lib";
-import { SMouseButton, SMouseEvent, SNetUtil } from "@saga-web/base/lib";
+import {
+    SMouseButton,
+    SMouseEvent,
+    SNetUtil,
+    STouchState
+} from "@saga-web/base/lib";
 import { SPoint } from "@saga-web/draw/lib";
 
 /**

+ 4 - 4
src/items/ColumnItem.ts

@@ -33,13 +33,13 @@ export class ColumnItem extends SGraphyItem {
     /** 柱子数据    */
     data: Column;
     /** X坐标最小值  */
-    private minX = 0;
+    private minX = Number.MAX_SAFE_INTEGER;
     /** X坐标最大值  */
-    private maxX = 0;
+    private maxX = Number.MIN_SAFE_INTEGER;
     /** Y坐标最小值  */
-    private minY = 0;
+    private minY = Number.MAX_SAFE_INTEGER;
     /** Y坐标最大值  */
-    private maxY = 0;
+    private maxY = Number.MIN_SAFE_INTEGER;
     /** 柱子轮廓线坐标list  */
     private readonly pointArr: SPoint[][] = [];
 

+ 45 - 9
src/items/DoorItem.ts

@@ -21,7 +21,7 @@
 import { Door } from "../types/Door";
 import { Opt } from "../types/Opt";
 import { SGraphyItem } from "@saga-web/graphy/lib";
-import { SPainter, SPoint } from "@saga-web/draw/lib";
+import { SPainter, SPoint, SRect } from "@saga-web/draw/lib";
 import { SMathUtil } from "../utils/SMathUtil";
 import { ItemOrder } from "../types/ItemOrder";
 
@@ -43,6 +43,14 @@ export class DoorItem extends SGraphyItem {
     private readonly p: SPoint = new SPoint(0, 0);
     /** 旋转起始角度,结束角度+Math.PI/2 */
     private readonly startAng: number = -Math.PI / 2;
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
 
     /**
      * 构造函数
@@ -57,6 +65,20 @@ export class DoorItem extends SGraphyItem {
         if (this.data.OutLine.length) {
             this.pointArr = this.data.OutLine[0].map(
                 (t): SPoint => {
+                    let x = t.X,
+                        y = -t.Y;
+                    if (x < this.minX) {
+                        this.minX = x;
+                    }
+                    if (y < this.minY) {
+                        this.minY = y;
+                    }
+                    if (x > this.maxX) {
+                        this.maxX = x;
+                    }
+                    if (y > this.maxY) {
+                        this.maxY = y;
+                    }
                     return new SPoint(t.X, -t.Y);
                 }
             );
@@ -98,6 +120,20 @@ export class DoorItem extends SGraphyItem {
     } // Constructor
 
     /**
+     * Item对象边界区域
+     *
+     * @return SRect
+     */
+    boundingRect(): SRect {
+        return new SRect(
+            this.minX,
+            this.minY,
+            this.maxX - this.minX,
+            this.maxY - this.minY
+        );
+    } // Function boundingRect()
+
+    /**
      * Item绘制操作
      *
      * @param   painter       painter对象
@@ -110,13 +146,13 @@ export class DoorItem extends SGraphyItem {
         painter.drawLine(0, 0, this.r, 0);
         painter.pen.lineDash = [50, 100];
         painter.pen.lineWidth = 50;
-        painter.drawArc(
-            -this.r,
-            -this.r,
-            this.r * 2,
-            this.r * 2,
-            this.startAng,
-            this.startAng + Math.PI / 2
-        );
+        // painter.drawArc(
+        //     -this.r,
+        //     -this.r,
+        //     this.r * 2,
+        //     this.r * 2,
+        //     this.startAng,
+        //     this.startAng + Math.PI / 2
+        // );
     } // Function onDraw()
 } // Class DoorItem

+ 1 - 1
src/items/SceneMarkItem.ts

@@ -123,7 +123,7 @@ export class SceneMarkItem extends SGraphyItem {
                 );
                 // @ts-ignore
                 let scale = this.parent.scene.view.scale;
-                if (le * scale < 10) {
+                if (le * scale < 30) {
                     this.lastPoint.x = this.outLine[0].x;
                     this.lastPoint.y = this.outLine[0].y;
                 }

+ 23 - 0
src/items/ShadeItem.ts

@@ -29,6 +29,7 @@ import {
 } from "@saga-web/draw/lib";
 import { SMouseEvent } from "@saga-web/base/lib";
 import { ItemOrder } from "../types/ItemOrder";
+import { SMathUtil } from "../utils/SMathUtil";
 
 /**
  * 遮罩item
@@ -85,6 +86,14 @@ export class ShadeItem extends SGraphyItem {
      */
     onMouseDown(event: SMouseEvent): boolean {
         if (!this.closeFlag && event.buttons == 1) {
+            if (
+                this.lastPoint.x == this.outLine[0].x &&
+                this.lastPoint.y == this.outLine[0].y &&
+                this.outLine.length >= 3
+            ) {
+                this.createMask();
+                return true;
+            }
             let p = new SPoint(event.x, event.y);
             this.lastPoint.x = p.x;
             this.lastPoint.y = p.y;
@@ -102,6 +111,20 @@ export class ShadeItem extends SGraphyItem {
     onMouseMove(event: SMouseEvent): boolean {
         if (!this.closeFlag) {
             this.lastPoint = new SPoint(event.x, event.y);
+            if (this.outLine.length >= 3) {
+                let le = SMathUtil.pointDistance(
+                    this.lastPoint.x,
+                    this.lastPoint.y,
+                    this.outLine[0].x,
+                    this.outLine[0].y
+                );
+                // @ts-ignore
+                let scale = this.parent.scene.view.scale;
+                if (le * scale < 30) {
+                    this.lastPoint.x = this.outLine[0].x;
+                    this.lastPoint.y = this.outLine[0].y;
+                }
+            }
         }
         return true;
     } // Function onMouseMove()

+ 4 - 4
src/items/SpaceItem.ts

@@ -44,13 +44,13 @@ export class SpaceItem extends SGraphyItem {
     /** 空间轮廓线坐标list  */
     readonly pointArr: SPoint[][] = [];
     /** X坐标最小值  */
-    minX = 0;
+    minX = Number.MAX_SAFE_INTEGER;
     /** X坐标最大值  */
-    maxX = 0;
+    maxX = Number.MIN_SAFE_INTEGER;
     /** Y坐标最小值  */
-    minY = 0;
+    minY = Number.MAX_SAFE_INTEGER;
     /** Y坐标最大值  */
-    maxY = 0;
+    maxY = Number.MIN_SAFE_INTEGER;
     /** path对象      */
     private path = new SPath2D();
     /** 高亮状态    */

+ 4 - 4
src/items/VirtualWallItem.ts

@@ -33,13 +33,13 @@ export class VirtualWallItem extends SGraphyItem {
     /** 虚拟墙数据   */
     data: VirtualWall;
     /** X坐标最小值  */
-    private minX = 0;
+    private minX = Number.MAX_SAFE_INTEGER;
     /** X坐标最大值  */
-    private maxX = 0;
+    private maxX = Number.MIN_SAFE_INTEGER;
     /** Y坐标最小值  */
-    private minY = 0;
+    private minY = Number.MAX_SAFE_INTEGER;
     /** Y坐标最大值  */
-    private maxY = 0;
+    private maxY = Number.MIN_SAFE_INTEGER;
     /** 虚拟墙轮廓线坐标list  */
     private readonly pointArr: SPoint[][] = [];
 

+ 4 - 4
src/items/WallItem.ts

@@ -33,13 +33,13 @@ export class WallItem extends SGraphyItem {
     /** 墙数据 */
     data: Wall;
     /** X坐标最小值  */
-    private minX = 0;
+    private minX = Number.MAX_SAFE_INTEGER;
     /** X坐标最大值  */
-    private maxX = 0;
+    private maxX = Number.MIN_SAFE_INTEGER;
     /** Y坐标最小值  */
-    private minY = 0;
+    private minY = Number.MAX_SAFE_INTEGER;
     /** Y坐标最大值  */
-    private maxY = 0;
+    private maxY = Number.MIN_SAFE_INTEGER;
     /** 墙轮廓线坐标list  */
     private readonly pointArr: SPoint[][] = [];
 

+ 22 - 0
src/items/WindowItem.ts

@@ -34,6 +34,14 @@ export class WindowItem extends SGraphyItem {
     data: Casement;
     /** 窗户轮廓线坐标list  */
     private readonly pointArr: SPoint[] = [];
+    /** X坐标最小值  */
+    private minX = Number.MAX_SAFE_INTEGER;
+    /** X坐标最大值  */
+    private maxX = Number.MIN_SAFE_INTEGER;
+    /** Y坐标最小值  */
+    private minY = Number.MAX_SAFE_INTEGER;
+    /** Y坐标最大值  */
+    private maxY = Number.MIN_SAFE_INTEGER;
 
     /**
      * 构造函数
@@ -48,6 +56,20 @@ export class WindowItem extends SGraphyItem {
         if (this.data.OutLine.length) {
             this.pointArr = this.data.OutLine[0].map(
                 (t): SPoint => {
+                    let x = t.X,
+                        y = -t.Y;
+                    if (x < this.minX) {
+                        this.minX = x;
+                    }
+                    if (y < this.minY) {
+                        this.minY = y;
+                    }
+                    if (x > this.maxX) {
+                        this.maxX = x;
+                    }
+                    if (y > this.maxY) {
+                        this.maxY = y;
+                    }
                     return new SPoint(t.X, -t.Y);
                 }
             );

+ 4 - 4
src/items/ZoneItem.ts

@@ -44,13 +44,13 @@ export class ZoneItem extends SGraphyItem {
     /** 空间轮廓线坐标list  */
     readonly pointArr: SPoint[][][] = [];
     /** X坐标最小值  */
-    private minX = 0;
+    private minX = Number.MAX_SAFE_INTEGER;
     /** X坐标最大值  */
-    private maxX = 0;
+    private maxX = Number.MIN_SAFE_INTEGER;
     /** Y坐标最小值  */
-    private minY = 0;
+    private minY = Number.MAX_SAFE_INTEGER;
     /** Y坐标最大值  */
-    private maxY = 0;
+    private maxY = Number.MIN_SAFE_INTEGER;
     /** path    */
     private pathList: SPath2D[] = [];
     /** 点击位置坐标  */

+ 26 - 19
src/utils/SMathUtil.ts

@@ -30,9 +30,11 @@ export class SMathUtil {
     /**
      * 计算点到点距离
      *
-     * @param   p1  第一个点
-     * @param   p2  第二个点
      * @return  距离
+     * @param x1
+     * @param y1
+     * @param x2
+     * @param y2
      */
     static pointDistance(
         x1: number,
@@ -206,10 +208,9 @@ export class SMathUtil {
      * @return Arr number[][]
      */
     static transferToArray(SP: SPoint[]): number[][] {
-        let Arr = SP.map(t => {
+        return SP.map((t): number[] => {
             return [t.x, t.y];
         });
-        return Arr;
     } // Function transferToArray()
 
     /**
@@ -219,10 +220,11 @@ export class SMathUtil {
      * @return  SP  SPoint[]
      */
     static transferToSPoint(arr: number[][]): SPoint[] {
-        let Arr = arr.map(t => {
-            return new SPoint(t[0], t[1]);
-        });
-        return Arr;
+        return arr.map(
+            (t): SPoint => {
+                return new SPoint(t[0], t[1]);
+            }
+        );
     } // Function transferToSPoint()
 
     /**
@@ -239,9 +241,11 @@ export class SMathUtil {
                 Outer: [],
                 Inner: []
             };
-            outline.Outer = array[0].map(t => {
-                return new SPoint(t[0], t[1]);
-            });
+            outline.Outer = array[0].map(
+                (t): SPoint => {
+                    return new SPoint(t[0], t[1]);
+                }
+            );
             outlineList.push(outline);
         } else {
             // 多条的时候,最后一条未外轮廓,倒序遍历与之相交的为内轮廓,不相交为另外的外轮廓
@@ -279,14 +283,17 @@ export class SMathUtil {
                     Outer: [],
                     Inner: []
                 };
-                outline.Outer = array[indexArr[i + 1]].map(t => {
-                    return new SPoint(t[0], t[1]);
-                });
-                outline.Inner = axArr.map(t => {
-                    let temp = t.map(item => {
-                        return new SPoint(item[0], item[1]);
-                    });
-                    return temp;
+                outline.Outer = array[indexArr[i + 1]].map(
+                    (t): SPoint => {
+                        return new SPoint(t[0], t[1]);
+                    }
+                );
+                outline.Inner = axArr.map((t): SPoint[] => {
+                    return t.map(
+                        (item): SPoint => {
+                            return new SPoint(item[0], item[1]);
+                        }
+                    );
                 });
                 outlineList.push(outline);
             }