RelationScene.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /*
  2. * ********************************************************************************************************************
  3. *
  4. * :*$@@%$*: ;: ;; ;;
  5. * :@@%! :!@@%: %! ;%%@@%$ =@@@@@@@%; @%@@@%%%%@@@@@
  6. * :@%; :$= %%$$$%$$ ;$$ ;$@= !@$
  7. * =@! %! @ $=;% !@@@%: !$$$$$$$$$$$$$$=
  8. * =@* %! @ $= % %@= =%@! %=
  9. * *$%%! @@= ;=$%%%$*: %! @ $= % =%%%%%%@$ *%: =%
  10. * %@@!: !@@@%=$@@@@%! :*@@$: %! @ $= % $* ;@ @* :%*
  11. * ;@@! ;!!!;: ;@%: =======@%========* @ $$ % $%*****$@ :@$=*********=@$
  12. * $@* ;@@@%=!: *@*
  13. * =@$ ;;;!=%@@@@=! =@!
  14. * %@$: =@%: :*@@@* %@= Copyright (c) 2016-2019. 北京上格云技术有限公司
  15. * ;%@@$=$@@%* *@@@$=%@@%;
  16. * ::;:: ::;:: All rights reserved.
  17. *
  18. * ********************************************************************************************************************
  19. */
  20. import { ZoneScene } from "./ZoneScene";
  21. import { RelationItem } from "./items/RelationItem";
  22. import { SMouseEvent } from "@saga-web/base/lib";
  23. import { SLine, SPoint } from "@saga-web/draw/lib";
  24. import { SMathUtil } from "./utils/SMathUtil";
  25. import { ZoneItem } from "./index";
  26. import { RelationPoint } from "./types/RelationPoint";
  27. /**
  28. * 空间关系图
  29. *
  30. * @author 郝建龙
  31. */
  32. export class RelationScene extends ZoneScene {
  33. /** 关系点位list */
  34. relationList: RelationItem[] = [];
  35. /** 创建关系点位标识 */
  36. private _createRelateFlag: boolean = false;
  37. /** 当前删除的item */
  38. private curRemoveItem: RelationItem | null = null;
  39. get createRelateFlag(): boolean {
  40. return this._createRelateFlag;
  41. } // Get createRelateFlag
  42. set createRelateFlag(value: boolean) {
  43. this._createRelateFlag = value;
  44. } // Set createRelateFlag
  45. /** 是否开启吸附 */
  46. private _isAbsorbing: boolean = false;
  47. get isAbsorbing(): boolean {
  48. return this._isAbsorbing;
  49. } // Get isAbsorbing
  50. set isAbsorbing(v: boolean) {
  51. this._isAbsorbing = v;
  52. } // Set isAbsorbing
  53. private _removeRelationFlag: boolean = false;
  54. get removeRelationFlag(): boolean {
  55. return this._removeRelationFlag;
  56. } // Get removeRelationFlag
  57. set removeRelationFlag(value: boolean) {
  58. this._removeRelationFlag = value;
  59. } // Set removeRelationFlag
  60. /** 当前关系item */
  61. curRelate: RelationItem | null = null;
  62. /** 当前业务空间 */
  63. curZone: ZoneItem | null = null;
  64. /**
  65. * 鼠标按下事件
  66. *
  67. * @param event 保存事件参数
  68. * @return boolean
  69. */
  70. onMouseDown(event: SMouseEvent): boolean {
  71. if (this.createRelateFlag && event.buttons == 1) {
  72. let zone = this.isInZone(event.x, event.y);
  73. if (!zone) {
  74. return false;
  75. }
  76. if (this.isAbsorbing) {
  77. event = this.absordPoint(event);
  78. }
  79. if (this.curRelate) {
  80. // @ts-ignore
  81. this.curRelate.endZone = zone.data.RoomID;
  82. this.curRelate.onMouseDown(event);
  83. } else {
  84. let p = new SPoint(event.x, event.y);
  85. let rela = new RelationItem(null, p);
  86. // @ts-ignore
  87. rela.startZone = zone.data.RoomID;
  88. this.relationList.push(rela);
  89. this.curRelate = rela;
  90. this.addItem(rela);
  91. }
  92. } else if (this.removeRelationFlag && event.buttons == 1) {
  93. this.removeSingleRelation(event);
  94. } else {
  95. super.onMouseDown(event);
  96. }
  97. return false;
  98. } // Function onMouseDown()
  99. /**
  100. * 鼠标抬起事件
  101. *
  102. * @param event 保存事件参数
  103. * @return boolean
  104. */
  105. onMouseUp(event: SMouseEvent): boolean {
  106. super.onMouseUp(event);
  107. return false;
  108. } // Function onMouseUp()
  109. /**
  110. * 鼠标移动事件
  111. *
  112. * @param event 鼠标事件对象
  113. */
  114. onMouseMove(event: SMouseEvent): boolean {
  115. if (this.isAbsorbing) {
  116. event = this.absordPoint(event);
  117. }
  118. if (this.curRelate) {
  119. this.curRelate.onMouseMove(event);
  120. return false;
  121. } else {
  122. super.onMouseMove(event);
  123. }
  124. return false;
  125. } // Function onMouseMove()
  126. /** */
  127. isInZone(x: number, y: number): ZoneItem | boolean {
  128. for (let i = 0; i < this.zoneList.length; i++) {
  129. if (this.zoneList[i].contains(x, y)) {
  130. return this.zoneList[i];
  131. }
  132. }
  133. return false;
  134. }
  135. /***
  136. * 注册鼠标点击事件
  137. *
  138. * @param _this 接收者
  139. * @param fn 处理函数
  140. */
  141. click(_this: RelationScene, fn: Function): void {
  142. this.zoneList.forEach((t): void => {
  143. t.connect("click", _this, fn);
  144. });
  145. } // Function click()
  146. /** 吸附 */
  147. absordPoint(event: SMouseEvent): SMouseEvent {
  148. let len = 20;
  149. if (this.view) {
  150. len = 20 / this.view.scale;
  151. }
  152. for (let i = 0; i < this.relationList.length; i++) {
  153. for (let j = 0; j < this.relationList[i].outLine.length; j++) {
  154. let p1 = this.relationList[i].outLine[j];
  155. let minDis = SMathUtil.pointDistance(
  156. event.x,
  157. event.y,
  158. p1.x,
  159. p1.y
  160. );
  161. if (minDis < len) {
  162. len = minDis;
  163. event.x = p1.x;
  164. event.y = p1.y;
  165. return event;
  166. }
  167. }
  168. }
  169. return event;
  170. } // Function absordPoint()
  171. /** 删除关系 */
  172. removeSingleRelation(event: SMouseEvent) {
  173. let len = 20;
  174. if (this.view) {
  175. len = 20 / this.view.scale;
  176. }
  177. let point = new SPoint(event.x, event.y);
  178. this.curRemoveItem = null;
  179. for (let i = 0; i < this.relationList.length; i++) {
  180. let curItem = this.relationList[i];
  181. let dis = SMathUtil.pointToLine(
  182. point,
  183. new SLine(curItem.startPoint, curItem.lastPoint)
  184. );
  185. if (dis.MinDis < len) {
  186. this.curRemoveItem = curItem;
  187. this.removeItem(curItem);
  188. this.relationList.splice(i, 1);
  189. break;
  190. }
  191. }
  192. console.log(this.curRemoveItem);
  193. } // Function reRelationItem()
  194. /** 清除所有关系点位 */
  195. removeAllRelation() {
  196. this.relationList.forEach((t: RelationItem): void => {
  197. this.removeItem(t);
  198. });
  199. this.relationList = [];
  200. } // Function removeAllRelation()
  201. /** 添加所有关系点位 */
  202. addAllRelaPoint(relations: RelationPoint[]) {
  203. relations.forEach((t: RelationPoint): void => {
  204. this.addRelaPoint(t);
  205. });
  206. } // Function addAllRelaPoint()
  207. /** 添加关系点位*/
  208. addRelaPoint(r: RelationPoint) {
  209. let item = new RelationItem(null, r);
  210. this.relationList.push(item);
  211. this.addItem(item);
  212. }
  213. } // Class RelationScene