|
@@ -24,45 +24,22 @@
|
|
|
* *********************************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
-import {
|
|
|
- SColor,
|
|
|
- SPainter,
|
|
|
- SPath,
|
|
|
- SPoint,
|
|
|
- SPolygonUtil,
|
|
|
- SRect
|
|
|
-} from "@persagy-web/draw";
|
|
|
+import { SColor, SPainter, SPoint, SRect } from "@persagy-web/draw";
|
|
|
import { SMouseEvent } from "@persagy-web/base";
|
|
|
import { Zone } from "../../types/floor/Zone";
|
|
|
import { ItemColor, ItemOrder, Transparency } from "../..";
|
|
|
-import { SGraphItem } from "@persagy-web/graph";
|
|
|
+import { Point, SGraphAreaGroupItem, SGraphItem } from "@persagy-web/graph";
|
|
|
|
|
|
/**
|
|
|
* 业务空间item
|
|
|
*
|
|
|
* @author 郝建龙
|
|
|
*/
|
|
|
-export class SZoneItem extends SGraphItem {
|
|
|
+export class SZoneItem extends SGraphAreaGroupItem {
|
|
|
/** 空间所有数据 */
|
|
|
data: Zone;
|
|
|
- /** 空间轮廓线坐标list */
|
|
|
- readonly pointArr: SPoint[][][] = [];
|
|
|
- /** X坐标最小值 */
|
|
|
- private minX = Number.MAX_SAFE_INTEGER;
|
|
|
- /** X坐标最大值 */
|
|
|
- private maxX = Number.MIN_SAFE_INTEGER;
|
|
|
- /** Y坐标最小值 */
|
|
|
- private minY = Number.MAX_SAFE_INTEGER;
|
|
|
- /** Y坐标最大值 */
|
|
|
- private maxY = Number.MIN_SAFE_INTEGER;
|
|
|
- /** path */
|
|
|
- private pathList: SPath[] = [];
|
|
|
/** 点击位置坐标 */
|
|
|
private clickPoint: SPoint | undefined;
|
|
|
- /** 选中时的颜色 */
|
|
|
- private selectColor: SColor = ItemColor.selectColor;
|
|
|
- /** 不可选时的颜色 */
|
|
|
- private unselectColor: SColor = ItemColor.zoneUnselectColor;
|
|
|
/** 高亮状态 */
|
|
|
private _highLightFlag: boolean = false;
|
|
|
get highLightFlag(): boolean {
|
|
@@ -90,10 +67,6 @@ export class SZoneItem extends SGraphItem {
|
|
|
this._isInfected = value;
|
|
|
this.update();
|
|
|
} // Set isInfected
|
|
|
- /** 受影响的业务空间填充颜色 */
|
|
|
- private infectedColor: SColor = ItemColor.zoneInfectedColor;
|
|
|
- /** 受影响的业务空间边框颜色 */
|
|
|
- private infectedBorder: SColor = ItemColor.zoneInfectedBorder;
|
|
|
|
|
|
/**
|
|
|
* 构造函数
|
|
@@ -102,69 +75,58 @@ export class SZoneItem extends SGraphItem {
|
|
|
* @param data 空间数据
|
|
|
*/
|
|
|
constructor(parent: SGraphItem | null, data: Zone) {
|
|
|
- super(parent);
|
|
|
+ super(parent, {
|
|
|
+ Outline: data.OutLine.map((t): Point[][] => {
|
|
|
+ return t.map((it): Point[] => {
|
|
|
+ return it.map(
|
|
|
+ (item): Point => {
|
|
|
+ item.Y = -item.Y;
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+ );
|
|
|
+ });
|
|
|
+ }),
|
|
|
+ Style: {
|
|
|
+ Default: {
|
|
|
+ Stroke: "#00000000",
|
|
|
+ Fill: "#ffee2280",
|
|
|
+ LineWidth: 1,
|
|
|
+ Effect: {}
|
|
|
+ },
|
|
|
+ Selected: {
|
|
|
+ Stroke: "#00000000",
|
|
|
+ Fill: "#1abc9c",
|
|
|
+ LineWidth: 1,
|
|
|
+ Effect: {}
|
|
|
+ },
|
|
|
+ Highlight: {
|
|
|
+ Stroke: "#00000000",
|
|
|
+ Fill: data.Color || "#fbb029",
|
|
|
+ LineWidth: 1,
|
|
|
+ Effect: {}
|
|
|
+ },
|
|
|
+ Unselect: {
|
|
|
+ Stroke: "#00000000",
|
|
|
+ Fill: "#cecece",
|
|
|
+ LineWidth: 1,
|
|
|
+ Effect: {}
|
|
|
+ },
|
|
|
+ Infected: {
|
|
|
+ Stroke: "#00000000",
|
|
|
+ Fill: "#ff0000",
|
|
|
+ LineWidth: 1,
|
|
|
+ Effect: {}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
this.data = data;
|
|
|
this.zOrder = ItemOrder.zoneOrder;
|
|
|
this.highLightFlag = data.HighLightFlag || false;
|
|
|
this.transparency = data.Transparency || 20;
|
|
|
this.isInfected = data.Infected || false;
|
|
|
- if (
|
|
|
- this.data.OutLine.length &&
|
|
|
- this.data.OutLine[0] &&
|
|
|
- this.data.OutLine[0].length
|
|
|
- ) {
|
|
|
- let tempArr = this.data.OutLine;
|
|
|
- this.minX = tempArr[0][0][0].X;
|
|
|
- this.maxX = this.minX;
|
|
|
- this.minY = -tempArr[0][0][0].Y;
|
|
|
- this.maxY = this.minY;
|
|
|
- // 处理轮廓点数组,同时计算最大最小值
|
|
|
- this.pointArr = tempArr.map((t): SPoint[][] => {
|
|
|
- let sPath = new SPath();
|
|
|
- let tempArr = t.map((it): SPoint[] => {
|
|
|
- let array = it.map(
|
|
|
- (item): SPoint => {
|
|
|
- let x = item.X,
|
|
|
- y = -item.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);
|
|
|
- }
|
|
|
- );
|
|
|
- sPath.polygon(array);
|
|
|
- return array;
|
|
|
- });
|
|
|
- this.pathList.push(sPath);
|
|
|
- return tempArr;
|
|
|
- });
|
|
|
- }
|
|
|
} // 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 事件参数
|
|
@@ -190,64 +152,41 @@ export class SZoneItem extends SGraphItem {
|
|
|
} // Function onMouseUp()
|
|
|
|
|
|
/**
|
|
|
- * 判断点是否在区域内
|
|
|
+ * 绘制前设置绘制样式
|
|
|
*
|
|
|
- * @param x
|
|
|
- * @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])) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (arr.length == 1) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- let flag = false;
|
|
|
- for (let i = 1; i < arr.length; i++) {
|
|
|
- if (SPolygonUtil.pointIn(x, y, arr[i])) {
|
|
|
- flag = true;
|
|
|
- break;
|
|
|
+ * */
|
|
|
+ setStyle(): string {
|
|
|
+ let status = "Default";
|
|
|
+ if (this.style) {
|
|
|
+ if (!this.selectable) {
|
|
|
+ status = "Unselect";
|
|
|
+ } else {
|
|
|
+ if (this.selected) {
|
|
|
+ status = "Selected";
|
|
|
+ } else if (this.highLightFlag) {
|
|
|
+ status = "Highlight";
|
|
|
+ } else if (this.isInfected) {
|
|
|
+ status = "Infected";
|
|
|
+ } else {
|
|
|
+ status = "Default";
|
|
|
+ if (this.data.Color) {
|
|
|
+ this.style.Default.Fill = `${this.data.Color}${
|
|
|
+ Transparency[this.transparency]
|
|
|
+ }`;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- if (flag) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- return true;
|
|
|
}
|
|
|
- return false;
|
|
|
- } // Function contains()
|
|
|
+ return status;
|
|
|
+ } // Function setStyle()
|
|
|
|
|
|
/**
|
|
|
* Item绘制操作
|
|
|
*
|
|
|
* @param painter painter对象
|
|
|
- * @param rect 绘制区域
|
|
|
*/
|
|
|
- onDraw(painter: SPainter, rect?: SRect): void {
|
|
|
- painter.pen.color = SColor.Transparent;
|
|
|
- if (!this.selectable) {
|
|
|
- painter.brush.color = this.unselectColor;
|
|
|
- } else {
|
|
|
- if (this.selected) {
|
|
|
- painter.brush.color = this.selectColor;
|
|
|
- } else if (this.highLightFlag) {
|
|
|
- painter.brush.color = new SColor(this.data.Color);
|
|
|
- } else if (this.isInfected) {
|
|
|
- painter.brush.color = this.infectedColor;
|
|
|
- // painter.pen.color = this.infectedBorder;
|
|
|
- } else {
|
|
|
- painter.brush.color = new SColor(
|
|
|
- `${this.data.Color}${Transparency[this.transparency]}`
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
- painter.pen.lineWidth = painter.toPx(1);
|
|
|
- this.pathList.forEach((t): void => {
|
|
|
- painter.drawPath(t);
|
|
|
- });
|
|
|
+ onDraw(painter: SPainter): void {
|
|
|
+ super.onDraw(painter);
|
|
|
painter.brush.color = SColor.Black;
|
|
|
painter.font.size = painter.toPx(10);
|
|
|
if (this.clickPoint) {
|