|
@@ -0,0 +1,246 @@
|
|
|
|
+/*
|
|
|
|
+ * ********************************************************************************************************************
|
|
|
|
+ *
|
|
|
|
+ * :*$@@%$*: ;: ;; ;;
|
|
|
|
+ * :@@%! :!@@%: %! ;%%@@%$ =@@@@@@@%; @%@@@%%%%@@@@@
|
|
|
|
+ * :@%; :$= %%$$$%$$ ;$$ ;$@= !@$
|
|
|
|
+ * =@! %! @ $=;% !@@@%: !$$$$$$$$$$$$$$=
|
|
|
|
+ * =@* %! @ $= % %@= =%@! %=
|
|
|
|
+ * *$%%! @@= ;=$%%%$*: %! @ $= % =%%%%%%@$ *%: =%
|
|
|
|
+ * %@@!: !@@@%=$@@@@%! :*@@$: %! @ $= % $* ;@ @* :%*
|
|
|
|
+ * ;@@! ;!!!;: ;@%: =======@%========* @ $$ % $%*****$@ :@$=*********=@$
|
|
|
|
+ * $@* ;@@@%=!: *@*
|
|
|
|
+ * =@$ ;;;!=%@@@@=! =@!
|
|
|
|
+ * %@$: =@%: :*@@@* %@= Copyright (c) 2016-2019. 北京上格云技术有限公司
|
|
|
|
+ * ;%@@$=$@@%* *@@@$=%@@%;
|
|
|
|
+ * ::;:: ::;:: All rights reserved.
|
|
|
|
+ *
|
|
|
|
+ * ********************************************************************************************************************
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+import {
|
|
|
|
+ SColor,
|
|
|
|
+ SPainter,
|
|
|
|
+ SPath2D,
|
|
|
|
+ SPoint,
|
|
|
|
+ SPolygonUtil,
|
|
|
|
+ SRect,
|
|
|
|
+ STextAlign
|
|
|
|
+} from "@saga-web/draw/lib";
|
|
|
|
+import { Space } from "../../types/floor/Space";
|
|
|
|
+import { SMouseEvent } from "@saga-web/base/lib";
|
|
|
|
+import { ItemOrder } from "../..";
|
|
|
|
+import { ItemColor } from "../..";
|
|
|
|
+import { SGraphItem } from "@saga-web/graph/lib";
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 模型空间item
|
|
|
|
+ *
|
|
|
|
+ * @author 郝建龙
|
|
|
|
+ */
|
|
|
|
+export class SSpaceItem extends SGraphItem {
|
|
|
|
+ /** 空间所有数据 */
|
|
|
|
+ data: Space;
|
|
|
|
+ /** 空间轮廓线坐标list */
|
|
|
|
+ readonly pointArr: SPoint[][] = [];
|
|
|
|
+ /** X坐标最小值 */
|
|
|
|
+ minX = Number.MAX_SAFE_INTEGER;
|
|
|
|
+ /** X坐标最大值 */
|
|
|
|
+ maxX = Number.MIN_SAFE_INTEGER;
|
|
|
|
+ /** Y坐标最小值 */
|
|
|
|
+ minY = Number.MAX_SAFE_INTEGER;
|
|
|
|
+ /** Y坐标最大值 */
|
|
|
|
+ maxY = Number.MIN_SAFE_INTEGER;
|
|
|
|
+ /** path对象 */
|
|
|
|
+ private path = new SPath2D();
|
|
|
|
+ /** 高亮状态 */
|
|
|
|
+ private _highLightFlag: boolean = false;
|
|
|
|
+ get highLightFlag(): boolean {
|
|
|
|
+ return this._highLightFlag;
|
|
|
|
+ } // Get highLightFlag
|
|
|
|
+ set highLightFlag(value: boolean) {
|
|
|
|
+ this._highLightFlag = value;
|
|
|
|
+ this.update();
|
|
|
|
+ } // Set highLightFlag
|
|
|
|
+ /** 是否显示名字 */
|
|
|
|
+ private _showBaseName: boolean = false;
|
|
|
|
+ get showBaseName(): boolean {
|
|
|
|
+ return this._showBaseName;
|
|
|
|
+ } // Get showBaseName
|
|
|
|
+ set showBaseName(value: boolean) {
|
|
|
|
+ this._showBaseName = value;
|
|
|
|
+ this.update();
|
|
|
|
+ } // Set showBaseName
|
|
|
|
+ /** 是否名字大小 */
|
|
|
|
+ private _nameSize: number = 10;
|
|
|
|
+ get nameSize(): number {
|
|
|
|
+ return this._nameSize;
|
|
|
|
+ } // Get nameSize
|
|
|
|
+ set nameSize(value: number) {
|
|
|
|
+ this._nameSize = value;
|
|
|
|
+ this.update();
|
|
|
|
+ } // Set nameSize
|
|
|
|
+ /** 名字是否缩放 */
|
|
|
|
+ private _nameTransform: boolean = false;
|
|
|
|
+ get nameTransform(): boolean {
|
|
|
|
+ return this._nameTransform;
|
|
|
|
+ } // Get nameTransform
|
|
|
|
+ set nameTransform(value: boolean) {
|
|
|
|
+ this._nameTransform = value;
|
|
|
|
+ this.update();
|
|
|
|
+ } // Set nameTransform
|
|
|
|
+ /** 名字颜色 */
|
|
|
|
+ private _nameColor: string = "#000000";
|
|
|
|
+ get nameColor(): string {
|
|
|
|
+ return this._nameColor;
|
|
|
|
+ } // Get nameColor
|
|
|
|
+ set nameColor(value: string) {
|
|
|
|
+ this._nameColor = value;
|
|
|
|
+ this.update();
|
|
|
|
+ } // Set nameColor
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构造函数
|
|
|
|
+ *
|
|
|
|
+ * @param parent 指向父对象
|
|
|
|
+ * @param data 空间数据
|
|
|
|
+ */
|
|
|
|
+ constructor(parent: SGraphItem | null, data: Space) {
|
|
|
|
+ super(parent);
|
|
|
|
+ this.data = data;
|
|
|
|
+ this.zOrder = ItemOrder.spaceOrder;
|
|
|
|
+ let tempArr = this.data.OutLine;
|
|
|
|
+ this.name = data.Name || "";
|
|
|
|
+ if (tempArr && tempArr.length) {
|
|
|
|
+ this.minX = tempArr[0][0].X;
|
|
|
|
+ this.maxX = this.minX;
|
|
|
|
+ this.minY = -tempArr[0][0].Y;
|
|
|
|
+ this.maxY = this.minY;
|
|
|
|
+ this.pointArr = tempArr.map((t): SPoint[] => {
|
|
|
|
+ let temp = t.map(
|
|
|
|
+ (it): SPoint => {
|
|
|
|
+ let x = it.X,
|
|
|
|
+ y = -it.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(x, y);
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+ this.path.polygon(temp);
|
|
|
|
+ return temp;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ } // Constructor
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Item对象边界区域
|
|
|
|
+ *
|
|
|
|
+ * @return SRect
|
|
|
|
+ */
|
|
|
|
+ boundingRect(): SRect {
|
|
|
|
+ return new SRect(
|
|
|
|
+ this.minX,
|
|
|
|
+ this.minY,
|
|
|
|
+ this.maxX - this.minX,
|
|
|
|
+ this.maxY - this.minY
|
|
|
|
+ );
|
|
|
|
+ } // Function boundingRect()
|
|
|
|
+
|
|
|
|
+ // /**
|
|
|
|
+ // * 鼠标单击事件
|
|
|
|
+ // *
|
|
|
|
+ // * @param event 事件参数
|
|
|
|
+ // * @return boolean
|
|
|
|
+ // */
|
|
|
|
+ // onMouseDown(event: SMouseEvent): boolean {
|
|
|
|
+ // console.log("spaceDown");
|
|
|
|
+ // this.$emit("click", event);
|
|
|
|
+ // return true;
|
|
|
|
+ // } // Function onMouseDown()
|
|
|
|
+
|
|
|
|
+ // /**
|
|
|
|
+ // * 鼠标移动事件
|
|
|
|
+ // *
|
|
|
|
+ // * @param event 事件参数
|
|
|
|
+ // */
|
|
|
|
+ // onMouseMove(event: SMouseEvent): boolean {
|
|
|
|
+ // return false;
|
|
|
|
+ // } // Function onMouseMove()
|
|
|
|
+
|
|
|
|
+ // /**
|
|
|
|
+ // * 鼠标抬起事件
|
|
|
|
+ // *
|
|
|
|
+ // * @param event 事件参数
|
|
|
|
+ // * @return boolean
|
|
|
|
+ // */
|
|
|
|
+ // onMouseUp(event: SMouseEvent): boolean {
|
|
|
|
+ // console.log("spaceUp");
|
|
|
|
+ // return false;
|
|
|
|
+ // } // Function onClick()
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 判断点是否在区域内
|
|
|
|
+ *
|
|
|
|
+ * @param x
|
|
|
|
+ * @param y
|
|
|
|
+ */
|
|
|
|
+ contains(x: number, y: number): boolean {
|
|
|
|
+ let arr = this.pointArr;
|
|
|
|
+ if (arr.length < 1 || !SPolygonUtil.pointIn(x, y, arr[0])) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (let i = 1; i < arr.length; i++) {
|
|
|
|
+ if (SPolygonUtil.pointIn(x, y, arr[i])) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ } // Function contains()
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Item绘制操作
|
|
|
|
+ *
|
|
|
|
+ * @param painter painter对象
|
|
|
|
+ */
|
|
|
|
+ onDraw(painter: SPainter): void {
|
|
|
|
+ painter.pen.color = ItemColor.spaceBorderColor;
|
|
|
|
+ if (this.selected) {
|
|
|
|
+ painter.brush.color = ItemColor.selectColor;
|
|
|
|
+ } else if (this.highLightFlag) {
|
|
|
|
+ painter.brush.color = ItemColor.spaceHighColor;
|
|
|
|
+ } else {
|
|
|
|
+ painter.brush.color = ItemColor.spaceColor;
|
|
|
|
+ }
|
|
|
|
+ painter.pen.lineWidth = painter.toPx(1);
|
|
|
|
+ painter.drawPath(this.path);
|
|
|
|
+
|
|
|
|
+ if (this.showBaseName) {
|
|
|
|
+ if (this.name && this.name != "null") {
|
|
|
|
+ painter.brush.color = new SColor(this.nameColor);
|
|
|
|
+ if (this.nameTransform) {
|
|
|
|
+ painter.font.size = this.nameSize;
|
|
|
|
+ } else {
|
|
|
|
+ painter.font.size = painter.toPx(this.nameSize);
|
|
|
|
+ }
|
|
|
|
+ // painter.font.size = 500;
|
|
|
|
+ painter.font.textAlign = STextAlign.Center;
|
|
|
|
+ painter.drawText(
|
|
|
|
+ this.name,
|
|
|
|
+ this.data.Location.Points[0].X,
|
|
|
|
+ -this.data.Location.Points[0].Y
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } // Function onDraw()
|
|
|
|
+} // Class SSpaceItem
|