|
@@ -0,0 +1,265 @@
|
|
|
+/*
|
|
|
+ * ********************************************************************************************************************
|
|
|
+ *
|
|
|
+ * :*$@@%$*: ;: ;; ;;
|
|
|
+ * :@@%! :!@@%: %! ;%%@@%$ =@@@@@@@%; @%@@@%%%%@@@@@
|
|
|
+ * :@%; :$= %%$$$%$$ ;$$ ;$@= !@$
|
|
|
+ * =@! %! @ $=;% !@@@%: !$$$$$$$$$$$$$$=
|
|
|
+ * =@* %! @ $= % %@= =%@! %=
|
|
|
+ * *$%%! @@= ;=$%%%$*: %! @ $= % =%%%%%%@$ *%: =%
|
|
|
+ * %@@!: !@@@%=$@@@@%! :*@@$: %! @ $= % $* ;@ @* :%*
|
|
|
+ * ;@@! ;!!!;: ;@%: =======@%========* @ $$ % $%*****$@ :@$=*********=@$
|
|
|
+ * $@* ;@@@%=!: *@*
|
|
|
+ * =@$ ;;;!=%@@@@=! =@!
|
|
|
+ * %@$: =@%: :*@@@* %@= Copyright (c) 2016-2019. 北京上格云技术有限公司
|
|
|
+ * ;%@@$=$@@%* *@@@$=%@@%;
|
|
|
+ * ::;:: ::;:: All rights reserved.
|
|
|
+ *
|
|
|
+ * ********************************************************************************************************************
|
|
|
+ */
|
|
|
+
|
|
|
+import { SGraphyItem, SMouseEvent } from "@sybotan-web/graphy/lib";
|
|
|
+import { SColor, SPainter, SPoint, SRect } from "@sybotan-web/draw/lib";
|
|
|
+
|
|
|
+class PolygonItemInterface {
|
|
|
+ parent: SGraphyItem | undefined;
|
|
|
+ space: any;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 窗户item
|
|
|
+ *
|
|
|
+ * @author 郝建龙
|
|
|
+ */
|
|
|
+export class WindowItem extends SGraphyItem {
|
|
|
+ /** 点坐标list */
|
|
|
+ pointArr: SPoint[];
|
|
|
+ /** 填充色 */
|
|
|
+ fillColor: SColor = new SColor("#F2F6FC");
|
|
|
+ /** 边框色 */
|
|
|
+ color: SColor = SColor.Black;
|
|
|
+ /** 边框宽度 */
|
|
|
+ width: number = 200;
|
|
|
+ /** 空间id */
|
|
|
+ id: string;
|
|
|
+ /** 中心坐标 */
|
|
|
+ centerOfGravityPoint: { x: number; y: number };
|
|
|
+ /** 空间名称 */
|
|
|
+ initName: null | string | undefined;
|
|
|
+ /** 绘制文案 */
|
|
|
+ viewText: string = "";
|
|
|
+ /** 需要缓存的边框颜色 */
|
|
|
+ cacheColor: SColor = SColor.Black;
|
|
|
+ /** 需要缓存的填充色 */
|
|
|
+ cacheFillColor: SColor = new SColor("#F2F6FC");
|
|
|
+ /** 需要缓存的边框宽度 */
|
|
|
+ cacheWidth: number = 100;
|
|
|
+ /** 是否激活 */
|
|
|
+ actived: boolean = false;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构造函数
|
|
|
+ *
|
|
|
+ * @param pointArr 点坐标list
|
|
|
+ * @param width 边框的宽度
|
|
|
+ * @param color 边框的颜色
|
|
|
+ * @param fillColor 多边形填充的颜色
|
|
|
+ * @param businessId 空间id
|
|
|
+ * @param businessName 空间名称
|
|
|
+ * @param centerOfGravityPoint 中心点
|
|
|
+ * @param isBusiness 状态
|
|
|
+ * @param parent
|
|
|
+ */
|
|
|
+ constructor(PolygonItemData: PolygonItemInterface) {
|
|
|
+ super(PolygonItemData.parent);
|
|
|
+ // 修改绘制路径格式
|
|
|
+ let newSpacePaths: SPoint[] = PolygonItemData.space.Paths[0].map(
|
|
|
+ (item: SPoint) => {
|
|
|
+ return new SPoint(item.x, item.y);
|
|
|
+ }
|
|
|
+ );
|
|
|
+ this.pointArr = newSpacePaths;
|
|
|
+ // 填充色
|
|
|
+ this.fillColor = PolygonItemData.space.fillColor
|
|
|
+ ? PolygonItemData.space.fillColor
|
|
|
+ : new SColor("#F2F6FC");
|
|
|
+ // 边框色
|
|
|
+ this.color = PolygonItemData.space.color
|
|
|
+ ? PolygonItemData.space.color
|
|
|
+ : SColor.Black;
|
|
|
+ //边框宽度
|
|
|
+ this.width = PolygonItemData.space.width
|
|
|
+ ? PolygonItemData.space.width
|
|
|
+ : 100;
|
|
|
+ //中心点
|
|
|
+ this.centerOfGravityPoint = {
|
|
|
+ x: PolygonItemData.space.LocationPoint.X,
|
|
|
+ y: -PolygonItemData.space.LocationPoint.Y
|
|
|
+ };
|
|
|
+ this.initName = PolygonItemData.space.Name;
|
|
|
+ this.id = PolygonItemData.space.id;
|
|
|
+ this.viewText = PolygonItemData.space.Name;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Item对象边界区域
|
|
|
+ *
|
|
|
+ * @return SRect
|
|
|
+ */
|
|
|
+ boundingRect(): SRect {
|
|
|
+ let minX = this.pointArr[0].x;
|
|
|
+ let maxX = minX;
|
|
|
+ let minY = this.pointArr[0].y;
|
|
|
+ let maxY = minY;
|
|
|
+ for (let i = 1; i < this.pointArr.length; i++) {
|
|
|
+ if (this.pointArr[i].x < minX) {
|
|
|
+ minX = this.pointArr[i].x;
|
|
|
+ }
|
|
|
+ if (this.pointArr[i].y < minY) {
|
|
|
+ minY = this.pointArr[i].y;
|
|
|
+ }
|
|
|
+ if (this.pointArr[i].x > maxX) {
|
|
|
+ maxX = this.pointArr[i].x;
|
|
|
+ }
|
|
|
+ if (this.pointArr[i].y > maxY) {
|
|
|
+ maxY = this.pointArr[i].y;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new SRect(minX, minY, maxX - minX, maxY - minY);
|
|
|
+ } // Function boundingRect()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断点是否在区域内
|
|
|
+ *
|
|
|
+ * @param x
|
|
|
+ * @param y
|
|
|
+ */
|
|
|
+ contains(x: number, y: number): boolean {
|
|
|
+ let nCross = 0,
|
|
|
+ point = [x, y],
|
|
|
+ APoints = this.pointArr,
|
|
|
+ length = APoints.length,
|
|
|
+ p1,
|
|
|
+ p2,
|
|
|
+ i,
|
|
|
+ xinters;
|
|
|
+ p1 = APoints[0];
|
|
|
+ for (i = 1; i <= length; i++) {
|
|
|
+ p2 = APoints[i % length];
|
|
|
+ if (
|
|
|
+ point[0] > Math.min(p1.x, p2.x) &&
|
|
|
+ point[0] <= Math.max(p1.x, p2.x)
|
|
|
+ ) {
|
|
|
+ if (point[1] <= Math.max(p1.y, p2.y)) {
|
|
|
+ if (p1.x != p2.x) {
|
|
|
+ //计算位置信息
|
|
|
+ xinters =
|
|
|
+ ((point[0] - p1.x) * (p2.y - p1.y)) /
|
|
|
+ (p2.x - p1.x) +
|
|
|
+ p1.y;
|
|
|
+ if (p1.y == p2.y || point[1] <= xinters) {
|
|
|
+ nCross++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ p1 = p2;
|
|
|
+ }
|
|
|
+ return nCross % 2 === 1;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param text 修改的文字
|
|
|
+ * @param centerOfGravityPoint 文字的坐标
|
|
|
+ */
|
|
|
+ addText(text: string, centerOfGravityPoint?: { x: number; y: number }) {
|
|
|
+ this.viewText = text;
|
|
|
+ if (centerOfGravityPoint) {
|
|
|
+ this.centerOfGravityPoint = centerOfGravityPoint;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * Item绘制操作
|
|
|
+ *
|
|
|
+ * @param painter painter对象
|
|
|
+ * @param rect 绘制区域
|
|
|
+ */
|
|
|
+ onDraw(painter: SPainter, rect?: SRect): void {
|
|
|
+ if (this.pointArr.length) {
|
|
|
+ painter.pen.color = this.color;
|
|
|
+ painter.brush.color = this.fillColor;
|
|
|
+ painter.pen.lineWidth = this.width;
|
|
|
+ painter.drawPolygon(this.pointArr);
|
|
|
+ // let text = ''
|
|
|
+ // if (this.businessName || this.businessId) {
|
|
|
+ // text = '👇 ' + this.businessName
|
|
|
+ // } else {
|
|
|
+ // text = '⬇️ ' + this.initName
|
|
|
+ // }
|
|
|
+ painter.font.size = this.scale * 200;
|
|
|
+ painter.brush.color = SColor.Black;
|
|
|
+ // painter.drawText(text,this.centerOfGravityPoint.x,this.centerOfGravityPoint.y)
|
|
|
+ painter.drawText(
|
|
|
+ this.viewText,
|
|
|
+ this.centerOfGravityPoint.x,
|
|
|
+ this.centerOfGravityPoint.y
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鼠标单击事件
|
|
|
+ *
|
|
|
+ * @param event 保存事件参数
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ onClick(event: SMouseEvent): boolean {
|
|
|
+ this.$emit("click", event);
|
|
|
+ return true;
|
|
|
+ } // Function onClick()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鼠标双击事件
|
|
|
+ *
|
|
|
+ * @param event 保存事件参数
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ onDoubleClick(event: SMouseEvent): boolean {
|
|
|
+ this.$emit("doubleClick", event);
|
|
|
+ return true;
|
|
|
+ } // Function onDoubleClick()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鼠标按下事件
|
|
|
+ *
|
|
|
+ * @param event 保存事件参数
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ onMouseDown(event: SMouseEvent): boolean {
|
|
|
+ this.$emit("mouseDown", event);
|
|
|
+ return true;
|
|
|
+ } // Function onMouseDown()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鼠标移动事件
|
|
|
+ *
|
|
|
+ * @param event 保存事件参数
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ onMouseMove(event: SMouseEvent): boolean {
|
|
|
+ this.$emit("mouseMove", event);
|
|
|
+ return true;
|
|
|
+ } // Function onMouseMove()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 释放鼠标事件
|
|
|
+ *
|
|
|
+ * @param event 保存事件参数
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ onMouseUp(event: SMouseEvent): boolean {
|
|
|
+ this.$emit("mouseUp", event);
|
|
|
+ return true;
|
|
|
+ } // Function onMouseUp()
|
|
|
+} // Class WindowItem
|