Bladeren bron

鼠标吸附版本发布,及与蒙版绘制不冲突,修改注释

haojianlong 5 jaren geleden
bovenliggende
commit
7b654a96cc
3 gewijzigde bestanden met toevoegingen van 40 en 26 verwijderingen
  1. 1 1
      package.json
  2. 32 18
      src/DivideFloorScene.ts
  3. 7 7
      src/items/HighlightItem.ts

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
     "name": "@saga-web/cad-engine",
-    "version": "2.0.328",
+    "version": "2.0.335",
     "description": "上格云 CAD图形引擎。",
     "main": "lib/index.js",
     "types": "lib/index.d.js",

+ 32 - 18
src/DivideFloorScene.ts

@@ -71,15 +71,14 @@ export class DivideFloorScene extends FloorScene {
 
     /** 高亮item  */
     hightLight: HighlightItem = new HighlightItem(null, new SPoint(), 0);
-    /** 吸附距离   */
-    private _absorbLen: number = 1;
-    get absorbLen(): number {
-        return this._absorbLen;
-    } // Get absorbLen
-    set absorbLen(v: number) {
-        this._absorbLen = v;
-    } // Set absorbLen
-
+    /** 是否开启吸附  */
+    private _isAbsorbing: boolean = false;
+    get isAbsorbing(): boolean {
+        return this._isAbsorbing;
+    } // Get isAbsorbing
+    set isAbsorbing(v: boolean) {
+        this._isAbsorbing = v;
+    } // Set isAbsorbing
     /**
      * 构造函数
      *
@@ -124,6 +123,11 @@ export class DivideFloorScene extends FloorScene {
      */
     onMouseDown(event: SMouseEvent): boolean {
         if (this.isMarking && event.buttons == 1) {
+            // 判断是否开启吸附,并且有吸附的点
+            if (this.isAbsorbing && this.hightLight.visible) {
+                event.x = this.hightLight.point.x;
+                event.y = this.hightLight.point.y;
+            }
             if (this.sceneMark) {
                 this.sceneMark.onMouseDown(event);
             } else {
@@ -244,8 +248,11 @@ export class DivideFloorScene extends FloorScene {
      *  @param  鼠标事件对象
      */
     onMouseMove(event: SMouseEvent): boolean {
+        super.onMouseMove(event);
         this.hightLight.visible = false;
-        this.absorbSpace(event);
+        if (this.isAbsorbing) {
+            this.absorbSpace(event);
+        }
         return false;
     } // Function onMouseMove
 
@@ -255,15 +262,20 @@ export class DivideFloorScene extends FloorScene {
      *  @param  鼠标事件对象
      */
     absorbSpace(event: SMouseEvent): void {
-        let P = this.absorbPoint(event);
+        let absorbLen = 1000;
+        if (this.view) {
+            absorbLen = 10 / this.view.scale;
+        }
+        let P = this.absorbPoint(event, absorbLen);
         if (P.Point) {
             this.hightLight.distance = P.MinDis;
             this.hightLight.point = new SPoint(P.Point.X, -P.Point.Y);
             this.hightLight.visible = true;
         } else {
-            let L = this.absorbLine(event);
-            if (L.Line) {
+            let L = this.absorbLine(event, absorbLen);
+            if (L.Line && L.Point) {
                 this.hightLight.distance = L.MinDis;
+                this.hightLight.point = L.Point;
                 this.hightLight.line = L.Line;
                 this.hightLight.visible = true;
             }
@@ -299,9 +311,10 @@ export class DivideFloorScene extends FloorScene {
      *  吸附点
      *
      *  @param  鼠标事件对象
+     *  @param  吸附距离
      *  @return 吸附的点
      */
-    absorbPoint(event: SMouseEvent): MinDis {
+    absorbPoint(event: SMouseEvent, absorbLen: number): MinDis {
         let minPointDis = Number.MAX_SAFE_INTEGER;
         let Point;
         this.spaceList.map(space => {
@@ -321,7 +334,7 @@ export class DivideFloorScene extends FloorScene {
                     );
                     if (
                         minDis &&
-                        minDis.MinDis < 2500 &&
+                        minDis.MinDis < absorbLen &&
                         minDis.MinDis < minPointDis
                     ) {
                         minPointDis = minDis.MinDis;
@@ -338,12 +351,13 @@ export class DivideFloorScene extends FloorScene {
     } // Function absorbPoint
 
     /**
-     *  吸附
+     *  吸附线
      *
      *  @param  鼠标事件对象
+     *  @param  吸附距离
      *  @return 吸附的线
      */
-    absorbLine(event: SMouseEvent): PointToLine {
+    absorbLine(event: SMouseEvent, absorbLen: number): PointToLine {
         let minPointDis = Number.MAX_SAFE_INTEGER;
         let Point, Line;
         this.spaceList.map(space => {
@@ -363,7 +377,7 @@ export class DivideFloorScene extends FloorScene {
                     );
                     if (
                         minDisLine &&
-                        minDisLine.MinDis < 2500 &&
+                        minDisLine.MinDis < absorbLen &&
                         minDisLine.MinDis < minPointDis
                     ) {
                         minPointDis = minDisLine.MinDis;

+ 7 - 7
src/items/HighlightItem.ts

@@ -32,7 +32,7 @@ export class HighlightItem extends SGraphyItem {
     /** 对象类型   */
     private type: number = 1;
 
-    /** 点对象数据   */
+    /** 点对象数据-当吸附的为线时,此点为垂线与线段的交点   */
     _point: SPoint = new SPoint();
     get point(): SPoint {
         return this._point;
@@ -81,13 +81,13 @@ export class HighlightItem extends SGraphyItem {
      * @param   painter       painter对象
      */
     onDraw(painter: SPainter): void {
-        painter.pen.lineWidth = painter.toPx(5);
-        painter.pen.color = new SColor("#409EFF");
-        if (this.type == 1) {
-            painter.drawCircle(this.point.x, this.point.y, painter.toPx(10));
-        } else if (this.type == 2) {
-            painter.pen.lineWidth = painter.toPx(10);
+        if (this.type == 2) {
+            painter.pen.color = new SColor("#409EFF");
+            painter.pen.lineWidth = painter.toPx(6);
             painter.drawLine(this.line);
         }
+        painter.pen.color = SColor.Transparent;
+        painter.brush.color = new SColor("#efff00");
+        painter.drawCircle(this.point.x, this.point.y, painter.toPx(5));
     } // Function onDraw()
 } // Class HighlightItem