DivideFloorScene.ts 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  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 { FloorScene } from "./FloorScene";
  21. import { SPoint, SRect } from "@saga-web/draw/lib";
  22. import { SceneMarkItem } from "./items/SceneMarkItem";
  23. import { ZoneItem } from "./items/ZoneItem";
  24. import { Zone } from "./types/Zone";
  25. import { SMouseEvent } from "@saga-web/base/lib";
  26. import { HighlightItem } from "./items/HighlightItem";
  27. import { SMathUtil } from "./utils/SMathUtil";
  28. import { MinDis } from "./types/MinDis";
  29. import { PointToLine } from "./types/PointToLine";
  30. import { RectSelectItem } from "./items/RectSelectItem";
  31. // @ts-ignore
  32. import { intersect } from "polybooljs";
  33. import { ShadeItem } from "./items/ShadeItem";
  34. import { Point } from "./types/Point";
  35. import { LikeSpaceItem } from "./items/LikeSpaceItem";
  36. /**
  37. * 划分业务空间
  38. *
  39. * @author 郝建龙
  40. */
  41. export class DivideFloorScene extends FloorScene {
  42. /** 是否开启用户标记 */
  43. _isMarking: boolean = false;
  44. get isMarking(): boolean {
  45. return this._isMarking;
  46. } // Get isMarking
  47. set isMarking(v: boolean) {
  48. if (this._isMarking === v) {
  49. return;
  50. }
  51. this._isMarking = v;
  52. } // Set isMarking
  53. /** 蒙版item */
  54. sceneMark: SceneMarkItem | null = null;
  55. /** 业务空间list */
  56. zoneList: ZoneItem[] = [];
  57. /** 遮罩List */
  58. shadeList: ShadeItem[] = [];
  59. /** 划分item */
  60. cutItem: ShadeItem | null = null;
  61. /** 类空间itemList */
  62. likeSpaceList: LikeSpaceItem[] = [];
  63. /** 高亮item */
  64. highLight: HighlightItem = new HighlightItem(null);
  65. /** 是否开启切分 */
  66. isCutting: boolean = false;
  67. /** 业务空间是否可选 */
  68. _isZoneSelectable: boolean = true;
  69. get isZoneSelectable(): boolean {
  70. return this._isZoneSelectable;
  71. } // Get isZoneSelectable
  72. set isZoneSelectable(v: boolean) {
  73. if (this._isZoneSelectable === v) {
  74. return;
  75. }
  76. this._isZoneSelectable = v;
  77. this.zoneList.map((t: ZoneItem) => {
  78. t.selectable = this._isZoneSelectable;
  79. if (!t.selectable) {
  80. t.selected = false;
  81. }
  82. return t;
  83. });
  84. } // Set isZoneSelectable
  85. /** 是否开启吸附 */
  86. private _isAbsorbing: boolean = false;
  87. get isAbsorbing(): boolean {
  88. return this._isAbsorbing;
  89. } // Get isAbsorbing
  90. set isAbsorbing(v: boolean) {
  91. this._isAbsorbing = v;
  92. } // Set isAbsorbing
  93. /** 矩形选择区域 */
  94. rectSelectItem: RectSelectItem | null = null;
  95. /** 是否开启用户选择 */
  96. _isRectSelection: boolean = false;
  97. get isRectSelection(): boolean {
  98. return this._isRectSelection;
  99. } // Get isRectSelection
  100. set isRectSelection(v: boolean) {
  101. this._isRectSelection = v;
  102. } // Set isRectSelection
  103. /**
  104. * 构造函数
  105. *
  106. */
  107. constructor() {
  108. super();
  109. this.addItem(this.highLight);
  110. } // Constructor
  111. /**
  112. * 添加轮廓线
  113. *
  114. * @param data
  115. */
  116. addSceneMark(data: SPoint[]): void {
  117. if (data.length) {
  118. let outline = data.map(t => {
  119. t.y = -t.y;
  120. return t;
  121. });
  122. let sceneMark = new SceneMarkItem(null, outline);
  123. this.addItem(sceneMark);
  124. this.sceneMark = sceneMark;
  125. }
  126. } // Function addSceneMark()
  127. /**
  128. * 清除蒙版
  129. *
  130. */
  131. clearSceneMark(): void {
  132. if (this.sceneMark) {
  133. this.grabItem = null;
  134. this.removeItem(this.sceneMark);
  135. this.sceneMark = null;
  136. this.isMarking = false;
  137. }
  138. } // Function clearSceneMark()
  139. /**
  140. * 清除划分区域
  141. *
  142. */
  143. clearCut(): void {
  144. if (this.cutItem) {
  145. this.grabItem = null;
  146. this.removeItem(this.cutItem);
  147. this.cutItem = null;
  148. this.isCutting = false;
  149. }
  150. } // Function clearCut()
  151. /**
  152. * 添加所有遮罩层
  153. *
  154. * @param data 遮罩数据
  155. */
  156. addAllShade(data: SPoint[][]): void {
  157. if (data.length) {
  158. data.map(t => {
  159. this.addShade(t);
  160. });
  161. }
  162. } // Function addAllShade()
  163. /**
  164. * 添加单个遮罩
  165. *
  166. * @param data 遮罩数据
  167. */
  168. addShade(data: SPoint[]): void {
  169. let outLine = data.map(t => {
  170. t.y = -t.y;
  171. return t;
  172. });
  173. let item = new ShadeItem(null, outLine);
  174. this.shadeList.push(item);
  175. this.addItem(item);
  176. } // Function addShade()
  177. /**
  178. * 添加所有类空间item
  179. *
  180. * @param data 所有数据
  181. */
  182. addAllLikeSpace(data: Point[][][]): void {
  183. if (data.length) {
  184. data.map(t => {
  185. this.addLikeSpace(t);
  186. });
  187. }
  188. } // Function addAllLikeSpace()
  189. /**
  190. * 添加单个类空间item
  191. *
  192. * @param data 单个类空间item数据
  193. */
  194. addLikeSpace(data: Point[][]): void {
  195. let item = new LikeSpaceItem(null, data);
  196. item.selectable = true;
  197. item.selected = true;
  198. this.likeSpaceList.push(item);
  199. this.addItem(item);
  200. } // Function addLikeSpace()
  201. /**
  202. * 清除所有类空间item
  203. *
  204. */
  205. clearLikeSpaces(): void {
  206. if (this.likeSpaceList.length) {
  207. this.likeSpaceList.map(t => {
  208. this.removeItem(t);
  209. });
  210. this.likeSpaceList = [];
  211. }
  212. } // Function clearLikeSpaces()
  213. /**
  214. * 获取选中的类空间
  215. */
  216. getSelectedLikeSpace(): LikeSpaceItem[] {
  217. let arr: LikeSpaceItem[] = [];
  218. this.likeSpaceList.map(t => {
  219. if (t.selected) {
  220. arr.push(t);
  221. }
  222. });
  223. return arr;
  224. } // Function getSelectedLikeSpace()
  225. /**
  226. * 鼠标按下事件
  227. *
  228. * @param event 保存事件参数
  229. * @return boolean
  230. */
  231. onMouseDown(event: SMouseEvent): boolean {
  232. if (event.buttons == 1) {
  233. if (this.isMarking) {
  234. // 判断是否开启吸附,并且有吸附的点
  235. if (this.isAbsorbing && this.highLight.visible) {
  236. event.x = this.highLight.point.x;
  237. event.y = this.highLight.point.y;
  238. }
  239. if (this.isPointInShade(event.x, event.y)) {
  240. return true;
  241. }
  242. if (this.sceneMark) {
  243. this.sceneMark.onMouseDown(event);
  244. } else {
  245. let point = new SPoint(event.x, event.y);
  246. let sceneMark = new SceneMarkItem(null, point);
  247. this.addItem(sceneMark);
  248. this.sceneMark = sceneMark;
  249. this.grabItem = sceneMark;
  250. }
  251. } else if (this.isCutting) {
  252. // 判断是否开启吸附,并且有吸附的点
  253. if (this.isAbsorbing && this.highLight.visible) {
  254. event.x = this.highLight.point.x;
  255. event.y = this.highLight.point.y;
  256. }
  257. if (
  258. this.sceneMark &&
  259. this.sceneMark.contains(event.x, event.y)
  260. ) {
  261. return true;
  262. }
  263. if (this.cutItem) {
  264. this.cutItem.onMouseDown(event);
  265. } else {
  266. let point = new SPoint(event.x, event.y);
  267. let cut = new ShadeItem(null, point);
  268. this.addItem(cut);
  269. this.cutItem = cut;
  270. this.grabItem = cut;
  271. }
  272. } else if (this.isRectSelection) {
  273. if (this.rectSelectItem) {
  274. this.isRectSelection = false;
  275. this.removeItem(this.rectSelectItem);
  276. this.rectSelectItem = null;
  277. } else {
  278. let point = new SPoint(event.x, event.y);
  279. let rect = new RectSelectItem(null, point);
  280. this.addItem(rect);
  281. this.rectSelectItem = rect;
  282. }
  283. } else {
  284. super.onMouseDown(event);
  285. }
  286. } else {
  287. super.onMouseDown(event);
  288. }
  289. return false;
  290. } // Function onMouseDown()
  291. /**
  292. * 鼠标抬起事件
  293. *
  294. * @param event 保存事件参数
  295. * @return boolean
  296. */
  297. onMouseUp(event: SMouseEvent): boolean {
  298. if (this.rectSelectItem) {
  299. this.isRectSelection = false;
  300. this.groupSelectSpace();
  301. this.removeItem(this.rectSelectItem);
  302. this.rectSelectItem = null;
  303. }
  304. return false;
  305. } // Function onMouseUp()
  306. /**
  307. * 吸附空间
  308. *
  309. * @param event 鼠标事件对象
  310. */
  311. onMouseMove(event: SMouseEvent): boolean {
  312. if (this.rectSelectItem) {
  313. this.rectSelectItem.onMouseMove(event);
  314. return false;
  315. }
  316. super.onMouseMove(event);
  317. this.highLight.visible = false;
  318. if (this.isAbsorbing) {
  319. if (!this.absorbShade(event)) {
  320. this.absorbSpace(event);
  321. }
  322. }
  323. return false;
  324. } // Function onMouseMove()
  325. /***
  326. * 键盘弹起事件
  327. *
  328. * @param event 保存事件参数
  329. */
  330. onKeyUp(event: KeyboardEvent): void {
  331. if (this.isMarking || this.isCutting) {
  332. if (this.grabItem) {
  333. this.grabItem.onKeyUp(event);
  334. }
  335. } else {
  336. super.onKeyUp(event);
  337. }
  338. } // Function onKeyUp()
  339. /***
  340. * 注册鼠标点击事件
  341. *
  342. * @param _this 接收者
  343. * @param fn 处理函数
  344. */
  345. click(_this: any, fn: Function): void {
  346. this.spaceList.map(t => {
  347. t.connect("click", _this, fn);
  348. });
  349. this.zoneList.map(t => {
  350. t.connect("click", _this, fn);
  351. });
  352. } // Function click()
  353. /**
  354. * 添加业务空间到scene 中
  355. *
  356. * @param zone 业务空间list
  357. */
  358. addZoneList(zone: Zone[]): void {
  359. zone.map(t => {
  360. this.addZone(t);
  361. });
  362. } // Function addZoneList()
  363. /**
  364. * 添加业务空间到scene 中
  365. *
  366. * @param zone 业务空间
  367. */
  368. addZone(zone: Zone): void {
  369. let item = new ZoneItem(null, zone);
  370. item.selectable = this.isZoneSelectable;
  371. this.zoneList.push(item);
  372. this.addItem(item);
  373. } // Function addZone()
  374. /**
  375. * 清空选中的空间
  376. *
  377. */
  378. clearSpaceSelection(): void {
  379. this.spaceList.map(t => {
  380. t.selected = false;
  381. return t;
  382. });
  383. } // Function clearSpaceSelection()
  384. /**
  385. * 清空选中的业务空间
  386. *
  387. */
  388. clearZoneSelection(): void {
  389. this.zoneList.map(t => {
  390. t.selected = false;
  391. return t;
  392. });
  393. } // Function clearZoneSelection()
  394. /**
  395. * 删除所有业务空间
  396. */
  397. removeAllZone(): void {
  398. if (this.zoneList.length) {
  399. this.zoneList.map(t => {
  400. this.removeItem(t);
  401. });
  402. this.zoneList = [];
  403. }
  404. } // Function removeAllZone()
  405. /**
  406. * 吸附空间
  407. *
  408. * @param event 鼠标事件对象
  409. * @return boolean 是否找到吸附的对象
  410. */
  411. absorbSpace(event: SMouseEvent): boolean {
  412. let absorbLen = 1000;
  413. if (this.view) {
  414. absorbLen = 10 / this.view.scale;
  415. }
  416. let P = this.absorbSpacePoint(event, absorbLen);
  417. if (P.Point) {
  418. this.highLight.distance = P.MinDis;
  419. this.highLight.point = new SPoint(P.Point.X, -P.Point.Y);
  420. this.highLight.visible = true;
  421. return true;
  422. } else {
  423. let L = this.absorbSpaceLine(event, absorbLen);
  424. if (L.Line && L.Point) {
  425. this.highLight.distance = L.MinDis;
  426. this.highLight.point = L.Point;
  427. this.highLight.line = L.Line;
  428. this.highLight.visible = true;
  429. return true;
  430. }
  431. return false;
  432. }
  433. } // Function absorbSpace()
  434. /**
  435. * 点是否在吸附区域内
  436. *
  437. * @param p 要判断的点
  438. * @param minX 空间区域
  439. * @param minY 空间区域
  440. * @param maxX 空间区域
  441. * @param maxY 空间区域
  442. */
  443. static isPointInAbsorbArea(
  444. p: SPoint,
  445. minX: number,
  446. maxX: number,
  447. minY: number,
  448. maxY: number
  449. ): boolean {
  450. let rect = new SRect(
  451. minX - 1000,
  452. minY - 1000,
  453. maxX - minX + 2000,
  454. maxY - minY + 2000
  455. );
  456. return rect.contains(p.x, p.y);
  457. } // Function isPointInAbsorbArea()
  458. /**
  459. * 吸附空间点
  460. *
  461. * @param event 鼠标事件对象
  462. * @param absorbLen 吸附距离
  463. * @return MinDis 吸附的点
  464. */
  465. absorbSpacePoint(event: SMouseEvent, absorbLen: number): MinDis {
  466. let minPointDis = Number.MAX_SAFE_INTEGER;
  467. let Point;
  468. this.spaceList.map(space => {
  469. if (
  470. DivideFloorScene.isPointInAbsorbArea(
  471. new SPoint(event.x, event.y),
  472. space.minX,
  473. space.maxX,
  474. space.minY,
  475. space.maxY
  476. )
  477. ) {
  478. space.data.OutLine.map(item => {
  479. let minDis = SMathUtil.getMinDisPoint(
  480. new SPoint(event.x, event.y),
  481. item
  482. );
  483. if (
  484. minDis &&
  485. minDis.MinDis < absorbLen &&
  486. minDis.MinDis < minPointDis
  487. ) {
  488. minPointDis = minDis.MinDis;
  489. Point = minDis.Point;
  490. }
  491. });
  492. }
  493. });
  494. let minPoint = {
  495. MinDis: minPointDis,
  496. Point: Point
  497. };
  498. return minPoint;
  499. } // Function absorbSpacePoint()
  500. /**
  501. * 吸附空间线
  502. *
  503. * @param event 鼠标事件对象
  504. * @param absorbLen 吸附距离
  505. * @return PointToLine 吸附的线
  506. */
  507. absorbSpaceLine(event: SMouseEvent, absorbLen: number): PointToLine {
  508. let minPointDis = Number.MAX_SAFE_INTEGER;
  509. let Point, Line;
  510. this.spaceList.map(space => {
  511. if (
  512. DivideFloorScene.isPointInAbsorbArea(
  513. new SPoint(event.x, event.y),
  514. space.minX,
  515. space.maxX,
  516. space.minY,
  517. space.maxY
  518. )
  519. ) {
  520. space.data.OutLine.map(item => {
  521. let minDisLine = SMathUtil.getMinDisLine(
  522. new SPoint(event.x, event.y),
  523. item
  524. );
  525. if (
  526. minDisLine &&
  527. minDisLine.MinDis < absorbLen &&
  528. minDisLine.MinDis < minPointDis
  529. ) {
  530. minPointDis = minDisLine.MinDis;
  531. Point = minDisLine.Point;
  532. Line = minDisLine.Line;
  533. }
  534. });
  535. }
  536. });
  537. let minPointLine = {
  538. MinDis: minPointDis,
  539. Point: Point,
  540. Line: Line
  541. };
  542. return minPointLine;
  543. } // Function absorbSpaceLine()
  544. /**
  545. * 吸附遮罩
  546. *
  547. * @param event 鼠标事件对象
  548. * @return boolean 是否找到吸附的对象
  549. */
  550. absorbShade(event: SMouseEvent): boolean {
  551. let absorbLen = 1000;
  552. if (this.view) {
  553. absorbLen = 10 / this.view.scale;
  554. }
  555. let P = this.absorbShadePoint(event, absorbLen);
  556. if (P.Point) {
  557. this.highLight.distance = P.MinDis;
  558. this.highLight.point = new SPoint(P.Point.X, -P.Point.Y);
  559. this.highLight.visible = true;
  560. return true;
  561. } else {
  562. let L = this.absorbShadeLine(event, absorbLen);
  563. if (L.Line && L.Point) {
  564. this.highLight.distance = L.MinDis;
  565. this.highLight.point = L.Point;
  566. this.highLight.line = L.Line;
  567. this.highLight.visible = true;
  568. return true;
  569. }
  570. return false;
  571. }
  572. } // Function absorbSpace()
  573. /**
  574. * 吸附遮罩点
  575. *
  576. * @param event 鼠标事件对象
  577. * @param absorbLen 吸附距离
  578. * @return MinDis 吸附的点
  579. */
  580. absorbShadePoint(event: SMouseEvent, absorbLen: number): MinDis {
  581. let minPointDis = Number.MAX_SAFE_INTEGER;
  582. let Point;
  583. this.shadeList.map(shade => {
  584. let PointArr = shade.outLine.map(item => {
  585. return { X: item.x, Y: -item.y, Z: 0 };
  586. });
  587. let minDis = SMathUtil.getMinDisPoint(
  588. new SPoint(event.x, event.y),
  589. PointArr
  590. );
  591. if (
  592. minDis &&
  593. minDis.MinDis < absorbLen &&
  594. minDis.MinDis < minPointDis
  595. ) {
  596. minPointDis = minDis.MinDis;
  597. Point = minDis.Point;
  598. }
  599. });
  600. let minPoint = {
  601. MinDis: minPointDis,
  602. Point: Point
  603. };
  604. return minPoint;
  605. } // Function absorbSpacePoint()
  606. /**
  607. * 吸附遮罩线
  608. *
  609. * @param event 鼠标事件对象
  610. * @param absorbLen 吸附距离
  611. * @return PointToLine 吸附的线
  612. */
  613. absorbShadeLine(event: SMouseEvent, absorbLen: number): PointToLine {
  614. let minPointDis = Number.MAX_SAFE_INTEGER;
  615. let Point, Line;
  616. this.shadeList.map(shade => {
  617. let PointArr = shade.outLine.map(item => {
  618. return { X: item.x, Y: -item.y, Z: 0 };
  619. });
  620. let minDisLine = SMathUtil.getMinDisLine(
  621. new SPoint(event.x, event.y),
  622. PointArr
  623. );
  624. if (
  625. minDisLine &&
  626. minDisLine.MinDis < absorbLen &&
  627. minDisLine.MinDis < minPointDis
  628. ) {
  629. minPointDis = minDisLine.MinDis;
  630. Point = minDisLine.Point;
  631. Line = minDisLine.Line;
  632. }
  633. });
  634. let minPointLine = {
  635. MinDis: minPointDis,
  636. Point: Point,
  637. Line: Line
  638. };
  639. return minPointLine;
  640. } // Function absorbSpaceLine()
  641. /**
  642. * 计算绘制区域与选中空间交集
  643. *
  644. */
  645. getIntersect(): SPoint[][] {
  646. let arr: SPoint[][] = [];
  647. let poly2 = {
  648. regions: [],
  649. inverted: false
  650. };
  651. if (this.cutItem) {
  652. poly2.regions.push(
  653. // @ts-ignore
  654. SMathUtil.transferToArray(this.cutItem.outLine)
  655. );
  656. } else if (this.sceneMark) {
  657. poly2.regions.push(
  658. // @ts-ignore
  659. SMathUtil.transferToArray(this.sceneMark.outLine)
  660. );
  661. }
  662. if (poly2.regions.length) {
  663. this.spaceList.map(t => {
  664. if (t.selected) {
  665. let poly1 = {
  666. regions: [],
  667. inverted: false
  668. };
  669. // @ts-ignore
  670. poly1.regions = t.pointArr.map(item => {
  671. return SMathUtil.transferToArray(item);
  672. });
  673. console.log(poly1);
  674. let intersectObj = intersect(poly1, poly2);
  675. if (intersectObj.regions.length) {
  676. intersectObj.regions.map((t: number[][]) => {
  677. arr.push(SMathUtil.transferToSPoint(t));
  678. });
  679. }
  680. }
  681. });
  682. }
  683. return arr;
  684. } // Function getIntersect()
  685. /**
  686. * 计算绘制区域与选中类空间交集
  687. *
  688. */
  689. getLikeIntersect(): SPoint[][] {
  690. let arr: SPoint[][] = [];
  691. let poly2 = {
  692. regions: [],
  693. inverted: false
  694. };
  695. if (this.cutItem) {
  696. poly2.regions.push(
  697. // @ts-ignore
  698. SMathUtil.transferToArray(this.cutItem.outLine)
  699. );
  700. } else if (this.sceneMark) {
  701. poly2.regions.push(
  702. // @ts-ignore
  703. SMathUtil.transferToArray(this.sceneMark.outLine)
  704. );
  705. }
  706. if (poly2.regions.length) {
  707. this.likeSpaceList.map(t => {
  708. if (t.selected) {
  709. let poly1 = {
  710. regions: [],
  711. inverted: false
  712. };
  713. // @ts-ignore
  714. poly1.regions = t.pointArr.map(item => {
  715. return SMathUtil.transferToArray(item);
  716. });
  717. console.log(poly1);
  718. let intersectObj = intersect(poly1, poly2);
  719. if (intersectObj.regions.length) {
  720. intersectObj.regions.map((t: number[][]) => {
  721. arr.push(SMathUtil.transferToSPoint(t));
  722. });
  723. }
  724. }
  725. });
  726. }
  727. return arr;
  728. } // Function getIntersect()
  729. /**
  730. * 框选区域,选中与之相交的空间
  731. *
  732. */
  733. groupSelectSpace(): void {
  734. if (this.rectSelectItem) {
  735. let item = this.rectSelectItem;
  736. let poly2 = {
  737. regions: [
  738. [
  739. [item.startPoint.x, item.startPoint.y],
  740. [item.startPoint.x, item.endPoint.y],
  741. [item.endPoint.x, item.endPoint.y],
  742. [item.endPoint.x, item.startPoint.y]
  743. ]
  744. ],
  745. inverted: false
  746. };
  747. this.spaceList.map(t => {
  748. let poly1 = {
  749. regions: [],
  750. inverted: false
  751. };
  752. // @ts-ignore
  753. poly1.regions = t.pointArr.map(item => {
  754. return SMathUtil.transferToArray(item);
  755. });
  756. let intersectObj = intersect(poly1, poly2);
  757. t.selected = intersectObj.regions.length ? true : false;
  758. });
  759. }
  760. } // Function groupSelectSpace()
  761. /**
  762. * 判断点是否在遮罩区域内
  763. *
  764. * @param x 点x坐标
  765. * @param y 点y坐标
  766. * @return boolean
  767. */
  768. isPointInShade(x: number, y: number): boolean {
  769. if (this.shadeList.length) {
  770. for (let i = 0; i < this.shadeList.length; i++) {
  771. if (this.shadeList[i].contains(x, y)) {
  772. return true;
  773. }
  774. }
  775. }
  776. return false;
  777. } // Function isPointInShade()
  778. } // Class DivideFloorScene