UIControl.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. import { coordinate } from "../Coordinate.js";
  2. import LayerEvents from "../enum/LayerEvents.js";
  3. import UIEvents from "../enum/UIEvents.js";
  4. import VectorType from "../enum/VectorType.js";
  5. import { stateService } from "../Service/StateService.js";
  6. import { floorplanService } from "../Service/FloorplanService.js";
  7. import { historyService } from "../Service/HistoryService.js";
  8. import { elementService } from "../Service/ElementService";
  9. import { mathUtil } from "../MathUtil.js";
  10. import { wallService } from "../Service/WallService.js";
  11. import { tagService } from "../Service/TagService.js";
  12. import { tableService } from "../Service/TableService.js";
  13. import Constant from "../Constant";
  14. import { addWall } from "../Controls/AddWall";
  15. import { floorplanData } from "../FloorplanData.js";
  16. import { signService } from "../Service/SignService.js";
  17. import { customImageService } from "../Service/CustomImageService.js";
  18. import mitt from "mitt";
  19. import { history } from "../History/History.js";
  20. import { iconService } from "../Service/IconService.js";
  21. export default class UIControl {
  22. constructor(layer) {
  23. this.layer = layer;
  24. this.bus = mitt();
  25. this.selectUI = null;
  26. this.appendData = null;
  27. // this.bus.emit('')
  28. }
  29. //点击左侧栏后,更新事件
  30. updateEventNameForSelectUI() {
  31. elementService.hideAll();
  32. //正在添加tag的时候,需要先删除
  33. const eventName = stateService.getEventName();
  34. // if (eventName == LayerEvents.AddTag) {
  35. // let item = stateService.getDraggingItem()
  36. // if (item && item.type == VectorType.Tag) {
  37. // floorplanService.deleteTag(item.vectorId)
  38. // }
  39. // }
  40. // stateService.clearItems()
  41. if (this.selectUI == UIEvents.Wall) {
  42. stateService.setEventName(LayerEvents.AddWall);
  43. } else if (this.selectUI == UIEvents.Table) {
  44. stateService.setEventName(LayerEvents.AddTable);
  45. } else if (this.selectUI == UIEvents.Rectangle) {
  46. stateService.setEventName(LayerEvents.AddRectangle);
  47. } else if (this.selectUI == UIEvents.Circle) {
  48. stateService.setEventName(LayerEvents.AddCircle);
  49. } else if (this.selectUI == UIEvents.Arrow) {
  50. stateService.setEventName(LayerEvents.AddArrow);
  51. } else if (this.selectUI == UIEvents.Icon) {
  52. stateService.setEventName(LayerEvents.AddIcon);
  53. } else if (this.selectUI == UIEvents.Tag) {
  54. stateService.setEventName(LayerEvents.AddTag);
  55. } else if (
  56. this.selectUI == UIEvents.Cigaret ||
  57. this.selectUI == UIEvents.FirePoint ||
  58. this.selectUI == UIEvents.LeftFootPrint ||
  59. this.selectUI == UIEvents.RightFootPrint ||
  60. this.selectUI == UIEvents.LeftShoePrint ||
  61. this.selectUI == UIEvents.RightShoePrint ||
  62. this.selectUI == UIEvents.FingerPrint ||
  63. this.selectUI == UIEvents.DeadBody ||
  64. this.selectUI == UIEvents.BloodStain
  65. ) {
  66. stateService.setEventName(LayerEvents.AddSign);
  67. }
  68. }
  69. /**
  70. * @param {*} type 部件类型
  71. * @param {*} name 属性名称
  72. * @param {*} value 属性值
  73. */
  74. async setAttributes(type, name, value) {
  75. let item = stateService.getFocusItem();
  76. let flag = true;
  77. switch (name) {
  78. case "delete":
  79. this.deleteItem();
  80. break;
  81. case 'update':
  82. if(type == VectorType.Tag){
  83. const tag = floorplanService.getTag(item.vectorId)
  84. if(value.hasOwnProperty('version')){
  85. value.color&&tag.setColor(value.color)
  86. value.fontSize&&tag.setFontSize(value.fontSize)
  87. value.text&&tag.setValue(value.text)
  88. }
  89. else{
  90. tag.setValue(value)
  91. }
  92. }
  93. else if(type == VectorType.Arrow){
  94. const arrow = floorplanService.getArrow(item.vectorId)
  95. if(value.hasOwnProperty('version')){
  96. arrow.setColor(value.color)
  97. }
  98. }
  99. else if(type == VectorType.Wall){
  100. const wall = floorplanService.getWall(item.vectorId)
  101. if(value.hasOwnProperty('version')){
  102. wall.setColor(value.color)
  103. }
  104. }
  105. else if(type == VectorType.Rectangle){
  106. const rectangle = floorplanService.getRectangle(item.vectorId)
  107. if(value.hasOwnProperty('version')){
  108. rectangle.setColor(value.color)
  109. }
  110. }
  111. else if(type == VectorType.Circle){
  112. const circle = floorplanService.getCircle(item.vectorId)
  113. if(value.hasOwnProperty('version')){
  114. circle.setColor(value.color)
  115. }
  116. }
  117. else if(type == VectorType.Table){
  118. const table = floorplanService.getTable(item.vectorId)
  119. if(value.hasOwnProperty('version')){
  120. table.setValue(value.content)
  121. }
  122. else{
  123. table.setValue(value)
  124. }
  125. }
  126. else if(type == VectorType.Title){
  127. if(value.hasOwnProperty('version')){
  128. floorplanService.updateTitle(value.text);
  129. }
  130. else{
  131. floorplanService.updateTitle(value);
  132. }
  133. }
  134. else if(type == VectorType.BgImage){
  135. await floorplanService.updateBgImage(value);
  136. }
  137. else if(type == VectorType.Compass){
  138. if(value.hasOwnProperty('version')){
  139. floorplanService.updateCompass(value.rotate)
  140. flag = value.save
  141. }
  142. else{
  143. floorplanService.updateCompass(value)
  144. }
  145. }
  146. else if(type == VectorType.CustomImage){
  147. const customImage = floorplanService.getCustomImage(item.vectorId)
  148. if(value.hasOwnProperty('rotate')){
  149. customImage.setAngle(value.rotate)
  150. flag = value.save
  151. }
  152. else if(value.hasOwnProperty('scale')){
  153. customImage.setScale(value.scale)
  154. flag = value.save
  155. }
  156. else if(value.hasOwnProperty('ratio')){
  157. customImage.setRatio(floor.customImages[key].ratio)
  158. }
  159. }
  160. else if(signService.isSign(type)){
  161. const sign = floorplanService.getSign(item.vectorId)
  162. if(value.hasOwnProperty('rotate')){
  163. sign.setAngle(value.rotate)
  164. flag = value.save
  165. }
  166. else if(value.hasOwnProperty('scale')){
  167. sign.setScale(value.scale)
  168. flag = value.save
  169. }
  170. }
  171. break;
  172. case "upload":
  173. if(type == VectorType.CustomImage){
  174. customImageService.setCustomImageUrl(value.url);
  175. const customImage = await customImageService.createCustomImage({
  176. x:0,
  177. y:0
  178. })
  179. stateService.setEventName(LayerEvents.MoveCustomImage);
  180. let focusItem = {
  181. vectorId: customImage.vectorId,
  182. type: VectorType.CustomImage,
  183. };
  184. stateService.setFocusItem(focusItem);
  185. this.showAttributes(focusItem);
  186. }
  187. break;
  188. }
  189. history.save();
  190. //stateService.clearFocusItem();
  191. this.layer.renderer.autoRedraw();
  192. }
  193. showAttributes(item) {
  194. let type = item.type;
  195. let value = null;
  196. if(signService.isSign(type)){
  197. const sign = floorplanService.getSign(item.vectorId);
  198. if (!sign) {
  199. return;
  200. }
  201. value = {
  202. version:'2.0',
  203. type: type,
  204. rotate:sign.angle,
  205. scale:sign.scale
  206. };
  207. }
  208. else{
  209. switch (item.type) {
  210. case VectorType.Tag:
  211. const tag = floorplanService.getTag(item.vectorId);
  212. if (!tag) {
  213. return;
  214. }
  215. value = {
  216. version:'2.0',
  217. type: type,
  218. text:tag.value,
  219. color: tag.color,
  220. fontSize: tag.fontSize,
  221. };
  222. break;
  223. case VectorType.Table:
  224. const table = floorplanService.getTable(item.vectorId);
  225. if (!table) {
  226. return;
  227. }
  228. const cellIds = table.cells;
  229. let content = [];
  230. for (let i = 0; i < cellIds.length; ++i) {
  231. for (let j = 0; j < cellIds[i].length; ++j) {
  232. const cell = floorplanService.getCell(cellIds[i][j]);
  233. content.push({
  234. width: cell.width,
  235. height: cell.height,
  236. value: cell.value,
  237. colIndex: cell.colIndex,
  238. rowIndex: cell.rowIndex,
  239. });
  240. }
  241. }
  242. value = {
  243. version:'2.0',
  244. type: type,
  245. content: content,
  246. };
  247. break;
  248. case VectorType.Title:
  249. const title = floorplanService.getTitle();
  250. if (!title) {
  251. return;
  252. }
  253. value = {
  254. version:'2.0',
  255. type: type,
  256. text: title.value,
  257. };
  258. break;
  259. case VectorType.Compass:
  260. const compass = floorplanService.getCompass();
  261. if (!compass) {
  262. return;
  263. }
  264. value = compass.angle;
  265. break;
  266. case VectorType.CustomImage:
  267. const customImage = floorplanService.getCustomImage(item.vectorId);
  268. if (!customImage) {
  269. return;
  270. }
  271. value = {
  272. version:'2.0',
  273. type: type,
  274. url: customImage.url,
  275. rotate:customImage.angle,
  276. ratio:customImage.ratio,
  277. scale:customImage.scale
  278. };
  279. break;
  280. case VectorType.Circle:
  281. const circle = floorplanService.getCircle(item.vectorId);
  282. if (!circle) {
  283. return;
  284. }
  285. value = {
  286. version:'2.0',
  287. type: type,
  288. color: circle.color,
  289. };
  290. break;
  291. case VectorType.Rectangle:
  292. const rectangle = floorplanService.getRectangle(item.vectorId);
  293. if (!rectangle) {
  294. return;
  295. }
  296. value = {
  297. version:'2.0',
  298. type: type,
  299. color: rectangle.color,
  300. };
  301. break;
  302. case VectorType.Wall:
  303. const wall = floorplanService.getWall(item.vectorId);
  304. if (!wall) {
  305. return;
  306. }
  307. value = {
  308. version:'2.0',
  309. type: type,
  310. color: wall.color,
  311. };
  312. break;
  313. case VectorType.Arrow:
  314. const arrow = floorplanService.getArrow(item.vectorId);
  315. if (!arrow) {
  316. return;
  317. }
  318. value = {
  319. version:'2.0',
  320. type: type,
  321. color: arrow.color,
  322. };
  323. break;
  324. }
  325. }
  326. this.bus.emit("showAttribute", {
  327. type: type,
  328. value: value,
  329. });
  330. }
  331. clearUI() {
  332. this.selectUI = null;
  333. this.bus.emit("hideAttribute");
  334. this.bus.emit("hideUI");
  335. }
  336. deleteItem() {
  337. let item = stateService.getFocusItem();
  338. if (item) {
  339. if (item.type == VectorType.Wall) {
  340. floorplanService.deleteWall(item.vectorId);
  341. } else if (item.type == VectorType.Rectangle) {
  342. floorplanService.deleteRectangle(item.vectorId);
  343. } else if (item.type == VectorType.Circle) {
  344. floorplanService.deleteCircle(item.vectorId);
  345. } else if (item.type == VectorType.Arrow) {
  346. floorplanService.deleteArrow(item.vectorId);
  347. } else if (item.type == VectorType.Icon) {
  348. iconService.deleteIcon(item.vectorId);
  349. } else if (item.type == VectorType.Tag) {
  350. floorplanService.deleteTag(item.vectorId);
  351. } else if (item.type == VectorType.Table) {
  352. floorplanService.deleteTable(item.vectorId);
  353. } else if (signService.isSign(item.type)) {
  354. floorplanService.deleteSign(item.vectorId);
  355. } else if (item.type == VectorType.WallCorner) {
  356. wallService.deleteWallCorner(item.vectorId);
  357. } else if (item.type == VectorType.CustomImage) {
  358. floorplanService.deleteCustomImage(item.vectorId);
  359. }
  360. history.save();
  361. this.layer.renderer.autoRedraw();
  362. }
  363. }
  364. getSignTypeForUI() {
  365. if (this.selectUI == UIEvents.Cigaret) {
  366. return VectorType.Cigaret;
  367. } else if (this.selectUI == UIEvents.FirePoint) {
  368. return VectorType.FirePoint;
  369. } else if (this.selectUI == UIEvents.LeftFootPrint) {
  370. return VectorType.LeftFootPrint;
  371. } else if (this.selectUI == UIEvents.RightFootPrint) {
  372. return VectorType.RightFootPrint;
  373. } else if (this.selectUI == UIEvents.LeftShoePrint) {
  374. return VectorType.LeftShoePrint;
  375. } else if (this.selectUI == UIEvents.RightShoePrint) {
  376. return VectorType.RightShoePrint;
  377. } else if (this.selectUI == UIEvents.FingerPrint) {
  378. return VectorType.FingerPrint;
  379. } else if (this.selectUI == UIEvents.DeadBody) {
  380. return VectorType.DeadBody;
  381. } else if (this.selectUI == UIEvents.BloodStain) {
  382. return VectorType.BloodStain;
  383. }
  384. }
  385. exportJSON() {
  386. const json = {
  387. version: floorplanData.version,
  388. floors: floorplanData.floors,
  389. currentId: floorplanService.getCurrentId(),
  390. };
  391. return json;
  392. }
  393. downloadCadImg(canvas, filename) {
  394. // 图片导出为 png 格式
  395. var type = "png";
  396. var imgData = canvas.toDataURL(type, 1);
  397. let blobImg = this.base64ToBlob(imgData);
  398. return blobImg;
  399. // 加工image data,替换mime type
  400. //imgData = imgData.replace(this._fixType(type), 'image/octet-stream')
  401. // download
  402. //this.saveFile(imgData, filename)
  403. }
  404. saveFile(data, filename) {
  405. var save_link = document.createElementNS(
  406. "http://www.w3.org/1999/xhtml",
  407. "a"
  408. );
  409. save_link.href = data;
  410. save_link.download = filename;
  411. var event = document.createEvent("MouseEvents");
  412. event.initMouseEvent(
  413. "click",
  414. true,
  415. false,
  416. window,
  417. 0,
  418. 0,
  419. 0,
  420. 0,
  421. 0,
  422. false,
  423. false,
  424. false,
  425. false,
  426. 0,
  427. null
  428. );
  429. save_link.dispatchEvent(event);
  430. }
  431. _fixType(type) {
  432. type = type.toLowerCase().replace(/jpg/i, "jpeg");
  433. var r = type.match(/png|jpeg|bmp|gif/)[0];
  434. return "image/" + r;
  435. }
  436. base64ToBlob(base64) {
  437. let arr = base64.split(","),
  438. mime = arr[0].match(/:(.*?);/)[1],
  439. bstr = atob(arr[1]),
  440. n = bstr.length,
  441. u8arr = new Uint8Array(n);
  442. while (n--) {
  443. u8arr[n] = bstr.charCodeAt(n);
  444. }
  445. return new Blob([u8arr], { type: mime });
  446. }
  447. //截图
  448. menu_screenShot(fileName) {
  449. // this.menu_flex();
  450. // this.layer.stopAddVector()
  451. // setTimeout(function(){
  452. // this.downloadCadImg(this.layer.canvas,fileName)
  453. // }.bind(this),100)
  454. this.layer.stopAddVector();
  455. return this.downloadCadImg(this.layer.canvas, fileName);
  456. }
  457. menu_flex() {
  458. coordinate.reSet();
  459. this.layer.renderer.autoRedraw();
  460. }
  461. initTopTable(value) {
  462. let center = {
  463. x: 770,
  464. y: 200,
  465. };
  466. center = coordinate.getXYFromScreen(center);
  467. let table = tableService.createTable(center);
  468. table.setValue(value);
  469. this.layer.renderer.autoRedraw();
  470. }
  471. initDownTable(value) {
  472. let center = {
  473. x: 770,
  474. y: 520,
  475. };
  476. center = coordinate.getXYFromScreen(center);
  477. let table = tableService.createTable(center);
  478. table.setValue(value);
  479. this.layer.renderer.autoRedraw();
  480. }
  481. /******************************************************************************************************************************************************************/
  482. }