Procházet zdrojové kódy

修改轮廓 场景中grabitem使用方式

haojianlong před 5 roky
rodič
revize
6d681bfd2c

+ 4 - 4
package-lock.json

@@ -1,6 +1,6 @@
 {
     "name": "cad-engine",
-    "version": "2.0.211",
+    "version": "2.0.219",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
@@ -38,9 +38,9 @@
             }
         },
         "@sybotan-web/graphy": {
-            "version": "2.1.18",
-            "resolved": "http://dev.dp.sagacloud.cn:8082/repository/npm-saga/@sybotan-web/graphy/-/graphy-2.1.18.tgz",
-            "integrity": "sha512-MGvjb593kmjkXTx2zM1z+zlj5j6Ca6ph+rNXWikDB28ZcwzyR54/v0kXlS9AbAbafSuLagpCUDk/81rttRJc6w==",
+            "version": "2.1.27",
+            "resolved": "http://dev.dp.sagacloud.cn:8082/repository/npm-saga/@sybotan-web/graphy/-/graphy-2.1.27.tgz",
+            "integrity": "sha512-QShbvWqLL3I4a8r0RVBIcpodXYJOrHh0vkzqPcLO70YSCR2ZBkNN6rFcN6G1fLNMjhobL9XJkoLlfgymIiU7Sw==",
             "requires": {
                 "@sybotan-web/base": "^2.1.5",
                 "@sybotan-web/draw": "^2.1.56"

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
     "name": "cad-engine",
-    "version": "2.0.211",
+    "version": "2.0.250",
     "description": "上格云 CAD图形引擎。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",
@@ -33,7 +33,7 @@
     "dependencies": {
         "@sybotan-web/base": "2.1.5",
         "@sybotan-web/draw": "2.1.56",
-        "@sybotan-web/graphy": "2.1.18",
+        "@sybotan-web/graphy": "2.1.27",
         "axios": "^0.18.0",
         "pako": "^1.0.10"
     }

+ 74 - 8
src/DivideFloorScene.ts

@@ -19,11 +19,12 @@
  */
 
 import { FloorScene } from "./FloorScene";
-import { SColor, SPoint, SRect } from "@sybotan-web/draw/lib";
+import { SPoint } from "@sybotan-web/draw/lib";
 import { SceneMarkItem } from "./items/SceneMarkItem";
 import { ZoneItem } from "./items/ZoneItem";
 import { Zone } from "./types/Zone";
 import { SMouseEvent } from "@sybotan-web/base/lib";
+import { SGraphyItem } from "@sybotan-web/graphy/lib";
 
 /**
  * 划分业务空间
@@ -43,8 +44,25 @@ export class DivideFloorScene extends FloorScene {
         this._isMarking = v;
     } // Set isMarking
 
+    /** 蒙版item  */
+    sceneMark: SGraphyItem | null = null;
     /** 业务空间list   */
     zoneList: ZoneItem[] = [];
+    /** 业务空间是否可选  */
+    _isZoneSelectable: boolean = true;
+    get isZoneSelectable(): boolean {
+        return this._isZoneSelectable;
+    } // Get isSpaceSelectable
+    set isZoneSelectable(v: boolean) {
+        if (this._isZoneSelectable === v) {
+            return;
+        }
+        this._isZoneSelectable = v;
+        this.zoneList.map((t: ZoneItem) => {
+            t.selectable = this._isZoneSelectable;
+            return t;
+        });
+    } // Set isZoneSelectable
 
     /**
      * 构造函数
@@ -64,7 +82,7 @@ export class DivideFloorScene extends FloorScene {
         if (data.length) {
             let sceneMark = new SceneMarkItem(null, data);
             this.addItem(sceneMark);
-            this.grabItem = sceneMark;
+            this.sceneMark = sceneMark;
         }
     } // Function addSceneMark
 
@@ -73,27 +91,29 @@ export class DivideFloorScene extends FloorScene {
      *
      */
     clearSceneMark(): void {
-        if (this.grabItem) {
-            this.removeItem(this.grabItem);
+        if (this.sceneMark) {
             this.grabItem = null;
+            this.removeItem(this.sceneMark);
+            this.sceneMark = null;
             this.isMarking = false;
         }
     } // Function clearSceneMark()
 
     /**
-     * 点击事件
+     * 鼠标按下事件
      *
      * @param   event   保存事件参数
      * @return  boolean
      */
     onMouseDown(event: SMouseEvent): boolean {
         if (this.isMarking && event.buttons == 1) {
-            if (this.grabItem) {
-                this.grabItem.onMouseDown(event);
+            if (this.sceneMark) {
+                this.sceneMark.onMouseDown(event);
             } else {
                 let point = new SPoint(event.x, event.y);
                 let sceneMark = new SceneMarkItem(null, point);
                 this.addItem(sceneMark);
+                this.sceneMark = sceneMark;
                 this.grabItem = sceneMark;
             }
         } else {
@@ -102,6 +122,16 @@ export class DivideFloorScene extends FloorScene {
         return false;
     } // Function onMouseDown()
 
+    /**
+     * 鼠标抬起事件
+     *
+     * @param   event   保存事件参数
+     * @return  boolean
+     */
+    onMouseUp(event: SMouseEvent): boolean {
+        return false;
+    } // Function onMouseUp()
+
     /***
      * 键盘按下事件
      *
@@ -150,8 +180,44 @@ export class DivideFloorScene extends FloorScene {
      */
     addZone(zone: Zone): void {
         let item = new ZoneItem(null, zone);
-        item.zOrder = 3;
+        item.zOrder = 10;
+        item.selectable = this.isZoneSelectable;
         this.zoneList.push(item);
         this.addItem(item);
     } // Function addZone
+
+    /**
+     *  设置空间是否可选
+     *
+     */
+    setSpaceSelectable(selectable: boolean): void {
+        this.spaceList.map(sp => {
+            sp.selectable = selectable;
+            return sp;
+        });
+    } // Function setSpaceSelectable
+
+    /**
+     *  设置业务空间是否可选
+     *
+     */
+    setZoneSelectable(selectable: boolean): void {
+        this.zoneList.map(zone => {
+            zone.selectable = selectable;
+            return zone;
+        });
+    } // Function setZoneSelectable
+
+    /**
+     *  切换业务空间
+     *
+     */
+    changeSelectZone(zoneitem: ZoneItem): void {
+        this.zoneList.map(zone => {
+            zone.selected = false;
+            zone.unselectFlag = true;
+            return zone;
+        });
+        zoneitem.visible = false;
+    } // Function changeSelectZone
 } // Class DivideFloorScene

+ 20 - 3
src/FloorScene.ts

@@ -18,7 +18,7 @@
  * ********************************************************************************************************************
  */
 
-import { SGraphyClockItem, SGraphyScene } from "@sybotan-web/graphy/lib";
+import { SGraphyScene } from "@sybotan-web/graphy/lib";
 // @ts-ignore
 import pako from "pako";
 import { FloorData } from "./types/FloorData";
@@ -140,6 +140,22 @@ export class FloorScene extends SGraphyScene {
         });
     } // Set isShowWindow
 
+    /** 空间是否可选  */
+    _isSpaceSelectable: boolean = true;
+    get isSpaceSelectable(): boolean {
+        return this._isSpaceSelectable;
+    } // Get isSpaceSelectable
+    set isSpaceSelectable(v: boolean) {
+        if (this._isSpaceSelectable === v) {
+            return;
+        }
+        this._isSpaceSelectable = v;
+        this.spaceList.map((t: SpaceItem) => {
+            t.selectable = this._isSpaceSelectable;
+            return t;
+        });
+    } // Set isSpaceSelectable
+
     /** 墙list   */
     wallList: WallItem[] = [];
     /** 柱子list   */
@@ -271,6 +287,7 @@ export class FloorScene extends SGraphyScene {
         let item = new SpaceItem(null, space);
         item.zOrder = 2;
         item.visible = this.isShowSpace;
+        item.selectable = this.isSpaceSelectable;
         this.spaceList.push(item);
         this.addItem(item);
     } // Function addSpace
@@ -397,7 +414,7 @@ export class FloorScene extends SGraphyScene {
     getSelectedSpaces(): SpaceItem[] {
         let arr: SpaceItem[] = [];
         this.spaceList.map(sp => {
-            if (sp.selectable) {
+            if (sp.selected) {
                 arr.push(sp);
             }
         });
@@ -410,7 +427,7 @@ export class FloorScene extends SGraphyScene {
      */
     clearSelectedSpaces(): void {
         this.spaceList.map(sp => {
-            sp.selectable = false;
+            sp.selected = false;
             return sp;
         });
     } // Function clearSelectedSpaces

+ 1 - 0
src/items/ColumnItem.ts

@@ -42,6 +42,7 @@ export class ColumnItem extends SGraphyItem {
     /** 柱子轮廓线坐标list  */
     private readonly pointArr: SPoint[][] = [];
 
+
     /**
      * 构造函数
      *

+ 6 - 1
src/items/SceneMarkItem.ts

@@ -21,6 +21,7 @@
 import { SGraphyItem } from "@sybotan-web/graphy/lib";
 import {
     SColor,
+    SLineCapStyle,
     SPainter,
     SPath2D,
     SPoint,
@@ -125,6 +126,9 @@ export class SceneMarkItem extends SGraphyItem {
      */
     createMask(): void {
         this.closeFlag = true;
+        if (this.scene) {
+            this.scene.grabItem = null;
+        }
         this.mask = new SPath2D();
         this.mask.moveTo(Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);
         this.mask.lineTo(Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);
@@ -147,13 +151,14 @@ export class SceneMarkItem extends SGraphyItem {
      * @param   rect          绘制区域
      */
     onDraw(painter: SPainter, rect?: SRect): void {
+        painter.pen.lineCapStyle = SLineCapStyle.Square;
         if (this.closeFlag) {
             painter.pen.color = SColor.Transparent;
             painter.brush.color = Opt.sceneMarkColor;
             painter.drawPath(this.mask);
         } else {
             painter.pen.color = new SColor("#ff0000");
-            painter.pen.lineWidth = painter.toPx(5);
+            painter.pen.lineWidth = painter.toPx(3);
             painter.drawPolyline(this.outLine);
             painter.drawLine(
                 this.outLine[this.outLine.length - 1],

+ 20 - 16
src/items/SpaceItem.ts

@@ -29,7 +29,7 @@ import {
 } from "@sybotan-web/draw/lib";
 import { Space } from "../types/Space";
 import { Opt } from "../types/Opt";
-import {SMouseEvent} from "@sybotan-web/base/lib";
+import { SMouseEvent } from "@sybotan-web/base/lib";
 
 /**
  * 模型空间item
@@ -113,8 +113,10 @@ export class SpaceItem extends SGraphyItem {
      * @return	boolean
      */
     onClick(event: SMouseEvent): boolean {
-        this.selectable = !this.selectable;
-        this.$emit("click", event);
+        if (this.selectable) {
+            this.selected = !this.selected;
+            this.$emit("click", event);
+        }
         return true;
     } // Function onClick()
 
@@ -145,19 +147,21 @@ export class SpaceItem extends SGraphyItem {
      * @param   rect          绘制区域
      */
     onDraw(painter: SPainter, rect?: SRect): void {
-        painter.pen.color = SColor.Transparent;
-        painter.brush.color = this.selectable
-            ? this.selectColor
-            : Opt.spaceColor;
-        painter.pen.lineWidth = 200;
-        painter.drawPath(this.path);
+        if (this.visible) {
+            painter.pen.color = SColor.Transparent;
+            painter.brush.color = this.selected
+                ? this.selectColor
+                : Opt.spaceColor;
+            painter.pen.lineWidth = 200;
+            painter.drawPath(this.path);
 
-        painter.brush.color = SColor.Black;
-        painter.font.size = painter.toPx(10);
-        painter.drawText(
-            this.data.Name,
-            this.data.Location.Points[0].X,
-            -this.data.Location.Points[0].Y
-        );
+            painter.brush.color = SColor.Black;
+            painter.font.size = painter.toPx(10);
+            painter.drawText(
+                this.data.Name,
+                this.data.Location.Points[0].X,
+                -this.data.Location.Points[0].Y
+            );
+        }
     } // Function onDraw()
 } // Class SpaceItem

+ 34 - 8
src/items/ZoneItem.ts

@@ -27,7 +27,6 @@ import {
     SPolygonUtil,
     SRect
 } from "@sybotan-web/draw/lib";
-import { Opt } from "../types/Opt";
 import { Zone } from "../types/Zone";
 import { SMouseEvent } from "@sybotan-web/base/lib";
 
@@ -39,6 +38,8 @@ import { SMouseEvent } from "@sybotan-web/base/lib";
 export class ZoneItem extends SGraphyItem {
     /** 空间所有数据  */
     data: Zone;
+    /** 不可选标志  */
+    unselectFlag = false;
     /** 空间轮廓线坐标list  */
     private readonly pointArr: SPoint[][][] = [];
     /** X坐标最小值  */
@@ -51,6 +52,12 @@ export class ZoneItem extends SGraphyItem {
     private maxY = 0;
     /** path    */
     private pathList: SPath2D[] = [];
+    /** location中心list*/
+    private clickPoint: SPoint | undefined;
+    /** 选中时的颜色  */
+    private selectColor = new SColor("#1abc9c");
+    /** 不可选时的颜色  */
+    private unselectColor = new SColor("#cecece");
 
     /**
      * 构造函数
@@ -114,12 +121,15 @@ export class ZoneItem extends SGraphyItem {
     /**
      * 鼠标单击事件
      *
-     * @param	event         事件参数
-     * @return	boolean
+     * @param   event   事件参数
+     * @return  boolean
      */
     onClick(event: SMouseEvent): boolean {
-        this.selectable = !this.selectable;
-        this.$emit("click", event);
+        if (!this.unselectFlag && this.selectable) {
+            this.selected = !this.selected;
+            this.clickPoint = new SPoint(event.x, event.y);
+            this.$emit("click", event);
+        }
         return true;
     } // Function onClick()
 
@@ -130,6 +140,7 @@ export class ZoneItem extends SGraphyItem {
      * @param y
      */
     contains(x: number, y: number): boolean {
+        // return true;
         for (let j = 0; j < this.pointArr.length; j++) {
             let arr = this.pointArr[j];
             if (arr.length < 1 || !SPolygonUtil.pointIn(x, y, arr[0])) {
@@ -156,15 +167,30 @@ export class ZoneItem extends SGraphyItem {
     /**
      * Item绘制操作
      *
-     * @param   painter       painter对象
-     * @param   rect          绘制区域
+     * @param   painter painter对象
+     * @param   rect    绘制区域
      */
     onDraw(painter: SPainter, rect?: SRect): void {
         painter.pen.color = SColor.Transparent;
-        painter.brush.color = this.data.Color;
+        if (this.unselectFlag) {
+            painter.brush.color = this.unselectColor;
+        } else {
+            painter.brush.color = this.selected
+                ? this.selectColor
+                : this.data.Color;
+        }
         painter.pen.lineWidth = 200;
         this.pathList.map(t => {
             painter.drawPath(t);
         });
+        painter.brush.color = SColor.Black;
+        painter.font.size = painter.toPx(10);
+        if (this.clickPoint) {
+            painter.drawText(
+                this.data.RoomLocalName,
+                this.clickPoint.x,
+                this.clickPoint.y
+            );
+        }
     } // Function onDraw()
 } // Class ZoneItem

+ 1 - 1
src/types/Opt.ts

@@ -27,7 +27,7 @@ import { SColor } from "@sybotan-web/draw/lib";
  */
 export class Opt {
     /** 墙颜色 */
-    static wallColor = new SColor("#FF0000");
+    static wallColor = new SColor("#2b2b2b");
     /** 柱子颜色 */
     static columnColor = SColor.Black;
     /** 虚拟墙颜色 */