Kaynağa Gözat

添加判断内外轮廓工具

haojianlong 5 yıl önce
ebeveyn
işleme
43827fcfe7
5 değiştirilmiş dosya ile 160 ekleme ve 2 silme
  1. 1 1
      package.json
  2. 52 0
      src/DivideFloorScene.ts
  3. 1 1
      src/items/ZoneItem.ts
  4. 33 0
      src/types/Outline.ts
  5. 73 0
      src/utils/SMathUtil.ts

+ 1 - 1
package.json

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

+ 52 - 0
src/DivideFloorScene.ts

@@ -811,4 +811,56 @@ export class DivideFloorScene extends FloorScene {
         }
         return false;
     } // Function  isPointInShade()
+
+    /**
+     * 选中的空间与区域的交集
+     *
+     */
+    getIntersectInSpace() {
+        let Obj = {};
+        let poly2 = {
+            regions: [],
+            inverted: false
+        };
+        if (this.cutItem) {
+            poly2.regions.push(
+                // @ts-ignore
+                SMathUtil.transferToArray(this.cutItem.outLine)
+            );
+        } else if (this.sceneMark) {
+            poly2.regions.push(
+                // @ts-ignore
+                SMathUtil.transferToArray(this.sceneMark.outLine)
+            );
+        }
+        if (poly2.regions.length) {
+            this.spaceList.map(t => {
+                let key = t.data.SourceId;
+                if (t.selected) {
+                    let poly1 = {
+                        regions: [],
+                        inverted: false
+                    };
+                    // @ts-ignore
+                    poly1.regions = t.pointArr.map(item => {
+                        return SMathUtil.transferToArray(item);
+                    });
+                    console.log(poly1);
+                    let intersectObj = intersect(poly1, poly2);
+                    if (intersectObj.regions.length) {
+                        let arr: SPoint[][] = [];
+                        intersectObj.regions.map((it: number[][]) => {
+                            arr.push(SMathUtil.transferToSPoint(it));
+                        });
+                        // @ts-ignore
+                        Obj[key] = arr;
+                    } else {
+                        // @ts-ignore
+                        Obj[key] = [];
+                    }
+                }
+            });
+        }
+        return Obj;
+    } // Function getIntersectInSpace()
 } // Class DivideFloorScene

+ 1 - 1
src/items/ZoneItem.ts

@@ -193,7 +193,7 @@ export class ZoneItem extends SGraphyItem {
             } else if (this.highLightFlag) {
                 painter.brush.color = new SColor(this.data.Color);
             } else {
-                painter.brush.color = new SColor(`${this.data.Color}4d`);
+                painter.brush.color = new SColor(`${this.data.Color}80`);
             }
         }
         painter.pen.lineWidth = 200;

+ 33 - 0
src/types/Outline.ts

@@ -0,0 +1,33 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                      :*$@@%$*:                         ;:                ;;    ;;
+ *                    :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                   :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                   =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                   =@*                                  %!              @ $= % %@=   =%@!      %=
+ *              *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *            %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *          ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *          $@*   ;@@@%=!:                *@*
+ *          =@$    ;;;!=%@@@@=!           =@!
+ *           %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *            ;%@@$=$@@%*       *@@@$=%@@%;
+ *               ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+import { SPoint } from "@saga-web/draw/lib";
+
+/**
+ * 轮廓线接口
+ *
+ * @author  郝建龙
+ */
+export interface Outline {
+    /** 外轮廓 */
+    Outer: SPoint[];
+    /** 内轮廓 */
+    Inner: SPoint[][];
+} // Interface Outline

+ 73 - 0
src/utils/SMathUtil.ts

@@ -22,6 +22,9 @@ import { SLine, SPoint, SRect } from "@saga-web/draw/lib";
 import { MinDis } from "../types/MinDis";
 import { Point } from "../types/Point";
 import { PointToLine } from "../types/PointToLine";
+import { Outline } from "../types/Outline";
+// @ts-ignore
+import { intersect } from "polybooljs";
 
 export class SMathUtil {
     /**
@@ -221,4 +224,74 @@ export class SMathUtil {
         });
         return Arr;
     } // Function transferToSPoint()
+
+    /**
+     * 计算数组中每一项的交集,并返回外轮廓与内轮廓
+     *
+     */
+    static getIntersectInArray(array: number[][][]): Outline[] {
+        let outlineList: Outline[] = [];
+        if (!array.length) {
+            // 无数据不做处理
+        } else if (array.length == 1) {
+            // 只有一条则为外轮廓
+            let outline: Outline = {
+                Outer: [],
+                Inner: []
+            };
+            outline.Outer = array[0].map(t => {
+                return new SPoint(t[0], t[1]);
+            });
+            outlineList.push(outline);
+        } else {
+            // 多条的时候,最后一条未外轮廓,倒序遍历与之相交的为内轮廓,不相交为另外的外轮廓
+            let poly2 = {
+                regions: [],
+                inverted: false
+            };
+            // @ts-ignore
+            poly2.regions.push(array[array.length - 1]);
+            let indexArr: number[] = [array.length - 1];
+            for (let i = array.length - 2; i > 0; i--) {
+                let poly1 = {
+                    regions: [],
+                    inverted: false
+                };
+                // @ts-ignore
+                poly1.regions.push(array[i]);
+                let intersectObj = intersect(poly1, poly2);
+                console.log(intersectObj);
+                if (!intersectObj.regions.length) {
+                    indexArr.unshift(i);
+                    poly2.regions = [];
+                    // @ts-ignore
+                    poly2.regions.push(array[i]);
+                }
+            }
+            indexArr.unshift(0);
+            console.log(indexArr);
+            for (let i = 0; i < indexArr.length - 1; i++) {
+                let axArr = array.slice(
+                    i == 0 ? 0 : indexArr[i] + 1,
+                    indexArr[i + 1]
+                );
+                let outline: Outline = {
+                    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;
+                });
+                outlineList.push(outline);
+            }
+        }
+        console.log(outlineList);
+        return outlineList;
+    } // Function getIntersectInArray()
 } // Class SMathUtil