FloorScene.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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 { SGraphScene, SImageItem } from "@saga-web/graph/lib";
  21. // @ts-ignore
  22. import pako from "pako";
  23. import { FloorData } from "./types/FloorData";
  24. import { Space } from "./types/Space";
  25. import { Column } from "./types/Column";
  26. import { Wall } from "./types/Wall";
  27. import { VirtualWall } from "./types/VirtualWall";
  28. import { Door } from "./types/Door";
  29. import { Casement } from "./types/Casement";
  30. import Axios from "axios";
  31. import { SpaceItem } from "./items/SpaceItem";
  32. import { WallItem } from "./items/WallItem";
  33. import { ColumnItem } from "./items/ColumnItem";
  34. import { VirtualWallItem } from "./items/VirtualWallItem";
  35. import { DoorItem } from "./items/DoorItem";
  36. import { WindowItem } from "./items/WindowItem";
  37. import { SImageShowType } from "./enums/SImageShowType";
  38. /**
  39. * 楼层场景
  40. *
  41. * @author 郝建龙
  42. */
  43. export class FloorScene extends SGraphScene {
  44. /** item数据 */
  45. data: FloorData | null = null;
  46. /** json数据 */
  47. json: string | null = null;
  48. /** 是否显示空间 */
  49. private _isShowSpace: boolean = true;
  50. get isShowSpace(): boolean {
  51. return this._isShowSpace;
  52. } // Get isShowSpace
  53. set isShowSpace(v: boolean) {
  54. if (this._isShowSpace === v) {
  55. return;
  56. }
  57. this._isShowSpace = v;
  58. this.spaceList.map(
  59. (t: SpaceItem): SpaceItem => {
  60. t.visible = this._isShowSpace;
  61. return t;
  62. }
  63. );
  64. } // Set isShowSpace
  65. /** 是否显示柱子 */
  66. private _isShowColumn: boolean = true;
  67. get isShowColumn(): boolean {
  68. return this._isShowColumn;
  69. } // Get isShowColumn
  70. set isShowColumn(v: boolean) {
  71. if (this._isShowColumn === v) {
  72. return;
  73. }
  74. this._isShowColumn = v;
  75. this.columnList.map(
  76. (t: ColumnItem): ColumnItem => {
  77. t.visible = this._isShowColumn;
  78. return t;
  79. }
  80. );
  81. } // Set isShowColumn
  82. /** 是否展示墙体 */
  83. private _isShowWall: boolean = true;
  84. get isShowWall(): boolean {
  85. return this._isShowWall;
  86. } // Get isShowWall
  87. set isShowWall(v: boolean) {
  88. if (this._isShowWall === v) {
  89. return;
  90. }
  91. this._isShowWall = v;
  92. this.wallList.map(
  93. (t: WallItem): WallItem => {
  94. t.visible = this._isShowWall;
  95. return t;
  96. }
  97. );
  98. } // Set isShowWall
  99. /** 是否展示虚拟墙 */
  100. _isShowVirtualWall: boolean = true;
  101. get isShowVirtualWall(): boolean {
  102. return this._isShowVirtualWall;
  103. } // Get isShowVirtualWall
  104. set isShowVirtualWall(v: boolean) {
  105. if (this._isShowVirtualWall === v) {
  106. return;
  107. }
  108. this._isShowVirtualWall = v;
  109. this.virtualWallList.map(
  110. (t: VirtualWallItem): VirtualWallItem => {
  111. t.visible = this._isShowVirtualWall;
  112. return t;
  113. }
  114. );
  115. } // Set isShowVirtualWall
  116. /** 是否展示门 */
  117. _isShowDoor: boolean = true;
  118. get isShowDoor(): boolean {
  119. return this._isShowDoor;
  120. } // Get isShowDoor
  121. set isShowDoor(v: boolean) {
  122. if (this._isShowDoor === v) {
  123. return;
  124. }
  125. this._isShowDoor = v;
  126. this.doorList.map(
  127. (t: DoorItem): DoorItem => {
  128. t.visible = this._isShowDoor;
  129. return t;
  130. }
  131. );
  132. } // Set isShowDoor
  133. /** 是否展示窗户 */
  134. _isShowWindow: boolean = true;
  135. get isShowWindow(): boolean {
  136. return this._isShowWindow;
  137. } // Get isShowWindow
  138. set isShowWindow(v: boolean) {
  139. if (this._isShowWindow === v) {
  140. return;
  141. }
  142. this._isShowWindow = v;
  143. this.casementList.map(
  144. (t: WindowItem): WindowItem => {
  145. t.visible = this._isShowWindow;
  146. return t;
  147. }
  148. );
  149. } // Set isShowWindow
  150. /** 空间是否可选 */
  151. _isSpaceSelectable: boolean = true;
  152. get isSpaceSelectable(): boolean {
  153. return this._isSpaceSelectable;
  154. } // Get isSpaceSelectable
  155. set isSpaceSelectable(v: boolean) {
  156. if (this._isSpaceSelectable === v) {
  157. return;
  158. }
  159. this._isSpaceSelectable = v;
  160. this.spaceList.map(
  161. (t: SpaceItem): SpaceItem => {
  162. t.selectable = this._isSpaceSelectable;
  163. return t;
  164. }
  165. );
  166. } // Set isSpaceSelectable
  167. /** 墙list */
  168. wallList: WallItem[] = [];
  169. /** 柱子list */
  170. columnList: ColumnItem[] = [];
  171. /** 门list */
  172. doorList: DoorItem[] = [];
  173. /** 窗list */
  174. casementList: WindowItem[] = [];
  175. /** 虚拟墙list */
  176. virtualWallList: VirtualWallItem[] = [];
  177. /** 空间list */
  178. spaceList: SpaceItem[] = [];
  179. /** 底图为图片 */
  180. imgList: SImageItem[] = [];
  181. /**
  182. * 构造函数
  183. *
  184. */
  185. constructor() {
  186. super();
  187. } // Constructor()
  188. /**
  189. * 获取底图压缩文件
  190. *
  191. * @param url 请求数据文件路径
  192. */
  193. loadUrl(url: string): Promise<void> {
  194. let that = this;
  195. return new Promise((resolve, reject): void => {
  196. Axios({
  197. method: "get",
  198. url: url,
  199. data: {},
  200. responseType: "blob"
  201. })
  202. .then((res: any) => {
  203. let blob = res.data;
  204. this.unzip(blob)
  205. .then((jsonData: any) => {
  206. that.addBaseMapItem(jsonData);
  207. resolve(jsonData);
  208. })
  209. .catch((error: any) => {
  210. console.log(error);
  211. });
  212. })
  213. .catch((res: any) => {
  214. console.log(res);
  215. });
  216. });
  217. } // Function loadUrl()
  218. /**
  219. * 获取底图压缩文件
  220. *
  221. * @param url 请求数据文件路径
  222. * @param _fn 回调
  223. */
  224. loadImg(url: string, _fn: Function): void {
  225. const imgItem = new SImageItem(null, url);
  226. imgItem.showType = SImageShowType.AutoFit;
  227. imgItem.connect("imgLoadOver", this, () => {
  228. _fn(imgItem);
  229. });
  230. this.addItem(imgItem);
  231. this.imgList.push(imgItem);
  232. } // Function loadImg()
  233. /**
  234. * 解压数据
  235. *
  236. * @param blob 文件
  237. */
  238. private unzip(blob: any): any {
  239. let reader = new FileReader();
  240. reader.readAsBinaryString(blob);
  241. let that = this;
  242. return new Promise(resolve => {
  243. reader.onload = (readerEvt: any) => {
  244. let binaryString = readerEvt.target.result;
  245. //解压数据
  246. let base64Data = btoa(binaryString);
  247. let unGzipData = that.unzipBase64(base64Data);
  248. try {
  249. that.data = unGzipData.entityList
  250. ? unGzipData.entityList[0].Elements
  251. : unGzipData.EntityList[0].Elements;
  252. this.json = JSON.stringify(unGzipData);
  253. resolve(that.data);
  254. } catch (e) {
  255. console.log(e);
  256. console.log(unGzipData);
  257. resolve("error");
  258. }
  259. };
  260. });
  261. } // Function unzip()
  262. /**
  263. * 获取楼层未压缩数据
  264. *
  265. * @param url 请求路径
  266. */
  267. getFloorData(url: string, data: { ModelId: string }): Promise<any> {
  268. let that = this;
  269. return new Promise((resolve, reject) => {
  270. Axios({
  271. method: "post",
  272. url: url,
  273. data: data
  274. })
  275. .then((res: any) => {
  276. if (res.data.Result == "success") {
  277. this.json = JSON.stringify(res);
  278. let floordata = res.data.EntityList[0].Elements;
  279. that.data = floordata;
  280. that.addBaseMapItem(floordata);
  281. }
  282. resolve(res.data);
  283. })
  284. .catch((err: any) => {
  285. console.log(err);
  286. });
  287. });
  288. } // Function getFloorData()
  289. /**
  290. * 增添所有底图item;
  291. *
  292. * @param data itemList对象
  293. */
  294. private addBaseMapItem(data: FloorData): void {
  295. if (data.Walls) {
  296. data.Walls.forEach((t: Wall): void => {
  297. this.addWall(t);
  298. });
  299. }
  300. if (data.Columns) {
  301. data.Columns.forEach((t: Column): void => {
  302. this.addColumn(t);
  303. });
  304. }
  305. if (data.Windows) {
  306. data.Windows.forEach((t: Casement): void => {
  307. this.addCasement(t);
  308. });
  309. }
  310. if (data.VirtualWalls) {
  311. data.VirtualWalls.forEach((t: VirtualWall): void => {
  312. this.addVirtualWall(t);
  313. });
  314. }
  315. if (data.Doors) {
  316. data.Doors.forEach((t: Door): void => {
  317. this.addDoor(t);
  318. });
  319. }
  320. if (data.Spaces) {
  321. data.Spaces.forEach((t: Space): void => {
  322. this.addSpace(t);
  323. });
  324. }
  325. } // Function addBaseMapItem()
  326. /**
  327. * 添加空间到scene 中
  328. *
  329. * @param space 空间item
  330. */
  331. addSpace(space: Space): void {
  332. let item = new SpaceItem(null, space);
  333. item.visible = this.isShowSpace;
  334. item.selectable = this.isSpaceSelectable;
  335. this.spaceList.push(item);
  336. this.addItem(item);
  337. } // Function addSpace()
  338. /**
  339. * 添加柱子到scene 中
  340. *
  341. * @param column 柱子item
  342. */
  343. addColumn(column: Column): void {
  344. let item = new ColumnItem(null, column);
  345. item.visible = this.isShowColumn;
  346. this.columnList.push(item);
  347. this.addItem(item);
  348. } // Function addColumn()
  349. /**
  350. * 添加墙到scene 中
  351. *
  352. * @param wall 墙item
  353. */
  354. addWall(wall: Wall): void {
  355. let item = new WallItem(null, wall);
  356. item.visible = this.isShowWall;
  357. this.wallList.push(item);
  358. this.addItem(item);
  359. } // Function addWall()
  360. /**
  361. * 添加所有虚拟墙到scene中
  362. *
  363. * @param virtualWall 虚拟墙item
  364. */
  365. addVirtualWall(virtualWall: VirtualWall): void {
  366. let item = new VirtualWallItem(null, virtualWall);
  367. item.visible = this.isShowVirtualWall;
  368. this.virtualWallList.push(item);
  369. this.addItem(item);
  370. } // Function addVirtualWall()
  371. /**
  372. * 添加门到scene 中
  373. *
  374. * @param door
  375. */
  376. addDoor(door: Door): void {
  377. let item = new DoorItem(null, door);
  378. item.visible = this.isShowDoor;
  379. this.doorList.push(item);
  380. this.addItem(item);
  381. } // Function addDoor()
  382. /**
  383. * 添加窗户到scene 中
  384. *
  385. * @param casement
  386. */
  387. addCasement(casement: Casement): void {
  388. let item = new WindowItem(null, casement);
  389. item.visible = this.isShowWindow;
  390. this.casementList.push(item);
  391. this.addItem(item);
  392. } // Function addCasement()
  393. /**
  394. * 解压文件
  395. *
  396. * @param b64Data base64数据
  397. */
  398. private unzipBase64(b64Data: any) {
  399. let strData = atob(b64Data);
  400. let charData = strData.split("").map(x => {
  401. return x.charCodeAt(0);
  402. });
  403. let binData = new Uint8Array(charData);
  404. let data = pako.inflate(binData, { to: "string" });
  405. return eval("(" + data + ")");
  406. } // Function unzipBase64()
  407. /**
  408. * 压缩文件
  409. *
  410. * @param str 被压缩的数据
  411. */
  412. private zip(str: any) {
  413. //escape(str) --->压缩前编码,防止中午乱码
  414. let binaryString = pako.gzip(escape(str), { to: "string" });
  415. return binaryString;
  416. } // Function zip()
  417. /**
  418. * 获取选中空间的列表
  419. *
  420. * @return 被选中的空间列表
  421. */
  422. getSelectedSpaces(): SpaceItem[] {
  423. let arr: SpaceItem[] = [];
  424. this.spaceList.forEach((sp): void => {
  425. if (sp.selected) {
  426. arr.push(sp);
  427. }
  428. });
  429. return arr;
  430. } // Function getSelectedSpaces()
  431. /**
  432. * 清除选中的空间
  433. *
  434. */
  435. clearSpaceSelection(): void {
  436. this.spaceList.map(
  437. (sp): SpaceItem => {
  438. sp.selected = false;
  439. return sp;
  440. }
  441. );
  442. } // Function clearSelectedSpaces()
  443. } // Class FloorScene