|
@@ -19,12 +19,16 @@
|
|
|
*/
|
|
|
|
|
|
import { FloorScene } from "./FloorScene";
|
|
|
-import { SPoint } from "@saga-web/draw/lib";
|
|
|
+import { SPoint, SRect } from "@saga-web/draw/lib";
|
|
|
import { SceneMarkItem } from "./items/SceneMarkItem";
|
|
|
import { ZoneItem } from "./items/ZoneItem";
|
|
|
import { Zone } from "./types/Zone";
|
|
|
import { SMouseEvent } from "@saga-web/base/lib";
|
|
|
import { SGraphyItem } from "@saga-web/graphy/lib";
|
|
|
+import { HighlightItem } from "./items/HighlightItem";
|
|
|
+import { SMathUtil } from "./utils/SMathUtil";
|
|
|
+import { MinDis } from "./types/MinDis";
|
|
|
+import { PointToLine } from "./types/PointToLine";
|
|
|
|
|
|
/**
|
|
|
* 划分业务空间
|
|
@@ -65,6 +69,17 @@ export class DivideFloorScene extends FloorScene {
|
|
|
});
|
|
|
} // Set isZoneSelectable
|
|
|
|
|
|
+ /** 高亮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
|
|
|
+
|
|
|
/**
|
|
|
* 构造函数
|
|
|
*
|
|
@@ -72,6 +87,7 @@ export class DivideFloorScene extends FloorScene {
|
|
|
*/
|
|
|
constructor() {
|
|
|
super();
|
|
|
+ this.addItem(this.hightLight);
|
|
|
} // Constructor
|
|
|
|
|
|
/**
|
|
@@ -221,4 +237,147 @@ export class DivideFloorScene extends FloorScene {
|
|
|
});
|
|
|
zoneitem.visible = false;
|
|
|
} // Function changeSelectZone
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 吸附空间
|
|
|
+ *
|
|
|
+ * @param 鼠标事件对象
|
|
|
+ */
|
|
|
+ onMouseMove(event: SMouseEvent): boolean {
|
|
|
+ this.hightLight.visible = false;
|
|
|
+ this.absorbSpace(event);
|
|
|
+ return false;
|
|
|
+ } // Function onMouseMove
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 吸附空间
|
|
|
+ *
|
|
|
+ * @param 鼠标事件对象
|
|
|
+ */
|
|
|
+ absorbSpace(event: SMouseEvent): void {
|
|
|
+ let P = this.absorbPoint(event);
|
|
|
+ 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) {
|
|
|
+ this.hightLight.distance = L.MinDis;
|
|
|
+ this.hightLight.line = L.Line;
|
|
|
+ this.hightLight.visible = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // Function absorbSpace
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 点是否在吸附区域内
|
|
|
+ *
|
|
|
+ * @param p 要判断的点
|
|
|
+ * @param minX 空间区域
|
|
|
+ * @param minY 空间区域
|
|
|
+ * @param maxX 空间区域
|
|
|
+ * @param maxY 空间区域
|
|
|
+ */
|
|
|
+ isPointInAbsorbArea(
|
|
|
+ p: SPoint,
|
|
|
+ minX: number,
|
|
|
+ maxX: number,
|
|
|
+ minY: number,
|
|
|
+ maxY: number
|
|
|
+ ): boolean {
|
|
|
+ let rect = new SRect(
|
|
|
+ minX - 1000,
|
|
|
+ minY - 1000,
|
|
|
+ maxX - minX + 200,
|
|
|
+ maxY - minY + 2000
|
|
|
+ );
|
|
|
+ return rect.contains(p.x, p.y);
|
|
|
+ } // Function isPointInAbsorbArea
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 吸附点
|
|
|
+ *
|
|
|
+ * @param 鼠标事件对象
|
|
|
+ * @return 吸附的点
|
|
|
+ */
|
|
|
+ absorbPoint(event: SMouseEvent): MinDis {
|
|
|
+ let minPointDis = Number.MAX_SAFE_INTEGER;
|
|
|
+ let Point;
|
|
|
+ this.spaceList.map(space => {
|
|
|
+ if (
|
|
|
+ this.isPointInAbsorbArea(
|
|
|
+ new SPoint(event.x, event.y),
|
|
|
+ space.minX,
|
|
|
+ space.maxX,
|
|
|
+ space.minY,
|
|
|
+ space.maxY
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ space.data.OutLine.map(item => {
|
|
|
+ let minDis = SMathUtil.getMinDisPoint(
|
|
|
+ new SPoint(event.x, event.y),
|
|
|
+ item
|
|
|
+ );
|
|
|
+ if (
|
|
|
+ minDis &&
|
|
|
+ minDis.MinDis < 2500 &&
|
|
|
+ minDis.MinDis < minPointDis
|
|
|
+ ) {
|
|
|
+ minPointDis = minDis.MinDis;
|
|
|
+ Point = minDis.Point;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let minPoint = {
|
|
|
+ MinDis: minPointDis,
|
|
|
+ Point: Point
|
|
|
+ };
|
|
|
+ return minPoint;
|
|
|
+ } // Function absorbPoint
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 吸附点
|
|
|
+ *
|
|
|
+ * @param 鼠标事件对象
|
|
|
+ * @return 吸附的线
|
|
|
+ */
|
|
|
+ absorbLine(event: SMouseEvent): PointToLine {
|
|
|
+ let minPointDis = Number.MAX_SAFE_INTEGER;
|
|
|
+ let Point, Line;
|
|
|
+ this.spaceList.map(space => {
|
|
|
+ if (
|
|
|
+ this.isPointInAbsorbArea(
|
|
|
+ new SPoint(event.x, event.y),
|
|
|
+ space.minX,
|
|
|
+ space.maxX,
|
|
|
+ space.minY,
|
|
|
+ space.maxY
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ space.data.OutLine.map(item => {
|
|
|
+ let minDisLine = SMathUtil.getMinDisLine(
|
|
|
+ new SPoint(event.x, event.y),
|
|
|
+ item
|
|
|
+ );
|
|
|
+ if (
|
|
|
+ minDisLine &&
|
|
|
+ minDisLine.MinDis < 2500 &&
|
|
|
+ minDisLine.MinDis < minPointDis
|
|
|
+ ) {
|
|
|
+ minPointDis = minDisLine.MinDis;
|
|
|
+ Point = minDisLine.Point;
|
|
|
+ Line = minDisLine.Line;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let minPointLine = {
|
|
|
+ MinDis: minPointDis,
|
|
|
+ Point: Point,
|
|
|
+ Line: Line
|
|
|
+ };
|
|
|
+ return minPointLine;
|
|
|
+ } // Function absorbLine
|
|
|
} // Class DivideFloorScene
|