UIControl.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  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. switch (name) {
  77. case "delete":
  78. this.deleteItem();
  79. break;
  80. case 'update':
  81. if(type == VectorType.Tag){
  82. const tag = floorplanService.getTag(item.vectorId)
  83. if(value.hasOwnProperty('version')){
  84. value.color&&tag.setColor(value.color)
  85. value.fontSize&&tag.setFontSize(value.fontSize)
  86. value.text&&tag.setValue(value.text)
  87. }
  88. else{
  89. tag.setValue(value)
  90. }
  91. }
  92. else if(type == VectorType.Arrow){
  93. const arrow = floorplanService.getArrow(item.vectorId)
  94. if(value.hasOwnProperty('version')){
  95. arrow.setColor(value.color)
  96. }
  97. }
  98. else if(type == VectorType.Wall){
  99. const wall = floorplanService.getWall(item.vectorId)
  100. if(value.hasOwnProperty('version')){
  101. wall.setColor(value.color)
  102. }
  103. }
  104. else if(type == VectorType.Rectangle){
  105. const rectangle = floorplanService.getRectangle(item.vectorId)
  106. if(value.hasOwnProperty('version')){
  107. rectangle.setColor(value.color)
  108. }
  109. }
  110. else if(type == VectorType.Circle){
  111. const circle = floorplanService.getCircle(item.vectorId)
  112. if(value.hasOwnProperty('version')){
  113. circle.setColor(value.color)
  114. }
  115. }
  116. else if(type == VectorType.Table){
  117. const table = floorplanService.getTable(item.vectorId)
  118. if(value.hasOwnProperty('version')){
  119. table.setValue(value.content)
  120. }
  121. else{
  122. table.setValue(value)
  123. }
  124. }
  125. else if(type == VectorType.Title){
  126. if(value.hasOwnProperty('version')){
  127. floorplanService.updateTitle(value.text);
  128. }
  129. else{
  130. floorplanService.updateTitle(value);
  131. }
  132. }
  133. else if(type == VectorType.BgImage){
  134. await floorplanService.updateBgImage(value);
  135. }
  136. else if(type == VectorType.Compass){
  137. if(value.hasOwnProperty('version')){
  138. floorplanService.updateCompass(value.rotate)
  139. }
  140. else{
  141. floorplanService.updateCompass(value)
  142. }
  143. }
  144. else if(type == VectorType.CustomImage){
  145. const customImage = floorplanService.getCustomImage(item.vectorId)
  146. if(value.hasOwnProperty('rotate')){
  147. customImage.setAngle(value.rotate)
  148. }
  149. else if(value.hasOwnProperty('scale')){
  150. customImage.setScale(value.scale)
  151. }
  152. else if(value.hasOwnProperty('ratio')){
  153. customImage.setRatio(floor.customImages[key].ratio)
  154. }
  155. }
  156. else if(signService.isSign(type)){
  157. const sign = floorplanService.getSign(item.vectorId)
  158. if(value.hasOwnProperty('rotate')){
  159. sign.setAngle(value.rotate)
  160. }
  161. else if(value.hasOwnProperty('scale')){
  162. sign.setScale(value.scale)
  163. }
  164. }
  165. break;
  166. case "upload":
  167. if(type == VectorType.CustomImage){
  168. customImageService.setCustomImageUrl(value.url);
  169. const customImage = await customImageService.createCustomImage({
  170. x:0,
  171. y:0
  172. })
  173. stateService.setEventName(LayerEvents.MoveCustomImage);
  174. let focusItem = {
  175. vectorId: customImage.vectorId,
  176. type: VectorType.CustomImage,
  177. };
  178. stateService.setFocusItem(focusItem);
  179. this.showAttributes(focusItem);
  180. }
  181. break;
  182. }
  183. history.save();
  184. //stateService.clearFocusItem();
  185. this.layer.renderer.autoRedraw();
  186. }
  187. showAttributes(item) {
  188. let type = item.type;
  189. let value = null;
  190. if(signService.isSign(type)){
  191. const sign = floorplanService.getSign(item.vectorId);
  192. if (!sign) {
  193. return;
  194. }
  195. value = {
  196. version:'2.0',
  197. type: type,
  198. rotate:sign.angle,
  199. scale:sign.scale
  200. };
  201. }
  202. else{
  203. switch (item.type) {
  204. case VectorType.Tag:
  205. const tag = floorplanService.getTag(item.vectorId);
  206. if (!tag) {
  207. return;
  208. }
  209. value = {
  210. version:'2.0',
  211. type: type,
  212. text:tag.value,
  213. color: tag.color,
  214. fontSize: tag.fontSize,
  215. };
  216. break;
  217. case VectorType.Table:
  218. const table = floorplanService.getTable(item.vectorId);
  219. if (!table) {
  220. return;
  221. }
  222. const cellIds = table.cells;
  223. let content = [];
  224. for (let i = 0; i < cellIds.length; ++i) {
  225. for (let j = 0; j < cellIds[i].length; ++j) {
  226. const cell = floorplanService.getCell(cellIds[i][j]);
  227. content.push({
  228. width: cell.width,
  229. height: cell.height,
  230. value: cell.value,
  231. colIndex: cell.colIndex,
  232. rowIndex: cell.rowIndex,
  233. });
  234. }
  235. }
  236. value = {
  237. version:'2.0',
  238. type: type,
  239. content: content,
  240. };
  241. break;
  242. case VectorType.Title:
  243. const title = floorplanService.getTitle();
  244. if (!title) {
  245. return;
  246. }
  247. value = {
  248. version:'2.0',
  249. type: type,
  250. text: title.value,
  251. };
  252. break;
  253. case VectorType.Compass:
  254. const compass = floorplanService.getCompass();
  255. if (!compass) {
  256. return;
  257. }
  258. value = compass.angle;
  259. break;
  260. case VectorType.CustomImage:
  261. const customImage = floorplanService.getCustomImage(item.vectorId);
  262. if (!customImage) {
  263. return;
  264. }
  265. value = {
  266. version:'2.0',
  267. type: type,
  268. url: customImage.url,
  269. rotate:customImage.angle,
  270. ratio:customImage.ratio,
  271. scale:customImage.scale
  272. };
  273. break;
  274. case VectorType.Circle:
  275. const circle = floorplanService.getCircle(item.vectorId);
  276. if (!circle) {
  277. return;
  278. }
  279. value = {
  280. version:'2.0',
  281. type: type,
  282. color: circle.color,
  283. };
  284. break;
  285. case VectorType.Rectangle:
  286. const rectangle = floorplanService.getRectangle(item.vectorId);
  287. if (!rectangle) {
  288. return;
  289. }
  290. value = {
  291. version:'2.0',
  292. type: type,
  293. color: rectangle.color,
  294. };
  295. break;
  296. case VectorType.Wall:
  297. const wall = floorplanService.getWall(item.vectorId);
  298. if (!wall) {
  299. return;
  300. }
  301. value = {
  302. version:'2.0',
  303. type: type,
  304. color: wall.color,
  305. };
  306. break;
  307. case VectorType.Arrow:
  308. const arrow = floorplanService.getArrow(item.vectorId);
  309. if (!arrow) {
  310. return;
  311. }
  312. value = {
  313. version:'2.0',
  314. type: type,
  315. color: arrow.color,
  316. };
  317. break;
  318. }
  319. }
  320. this.bus.emit("showAttribute", {
  321. type: type,
  322. value: value,
  323. });
  324. }
  325. clearUI() {
  326. this.selectUI = null;
  327. this.bus.emit("hideAttribute");
  328. this.bus.emit("hideUI");
  329. }
  330. deleteItem() {
  331. let item = stateService.getFocusItem();
  332. if (item) {
  333. if (item.type == VectorType.Wall) {
  334. floorplanService.deleteWall(item.vectorId);
  335. } else if (item.type == VectorType.Rectangle) {
  336. floorplanService.deleteRectangle(item.vectorId);
  337. } else if (item.type == VectorType.Circle) {
  338. floorplanService.deleteCircle(item.vectorId);
  339. } else if (item.type == VectorType.Arrow) {
  340. floorplanService.deleteArrow(item.vectorId);
  341. } else if (item.type == VectorType.Icon) {
  342. iconService.deleteIcon(item.vectorId);
  343. } else if (item.type == VectorType.Tag) {
  344. floorplanService.deleteTag(item.vectorId);
  345. } else if (item.type == VectorType.Table) {
  346. floorplanService.deleteTable(item.vectorId);
  347. } else if (signService.isSign(item.type)) {
  348. floorplanService.deleteSign(item.vectorId);
  349. } else if (item.type == VectorType.WallCorner) {
  350. wallService.deleteWallCorner(item.vectorId);
  351. } else if (item.type == VectorType.CustomImage) {
  352. floorplanService.deleteCustomImage(item.vectorId);
  353. }
  354. history.save();
  355. this.layer.renderer.autoRedraw();
  356. }
  357. }
  358. getSignTypeForUI() {
  359. if (this.selectUI == UIEvents.Cigaret) {
  360. return VectorType.Cigaret;
  361. } else if (this.selectUI == UIEvents.FirePoint) {
  362. return VectorType.FirePoint;
  363. } else if (this.selectUI == UIEvents.LeftFootPrint) {
  364. return VectorType.LeftFootPrint;
  365. } else if (this.selectUI == UIEvents.RightFootPrint) {
  366. return VectorType.RightFootPrint;
  367. } else if (this.selectUI == UIEvents.LeftShoePrint) {
  368. return VectorType.LeftShoePrint;
  369. } else if (this.selectUI == UIEvents.RightShoePrint) {
  370. return VectorType.RightShoePrint;
  371. } else if (this.selectUI == UIEvents.FingerPrint) {
  372. return VectorType.FingerPrint;
  373. } else if (this.selectUI == UIEvents.DeadBody) {
  374. return VectorType.DeadBody;
  375. } else if (this.selectUI == UIEvents.BloodStain) {
  376. return VectorType.BloodStain;
  377. }
  378. }
  379. exportJSON() {
  380. const json = {
  381. version: floorplanData.version,
  382. floors: floorplanData.floors,
  383. currentId: floorplanService.getCurrentId(),
  384. };
  385. return json;
  386. }
  387. downloadCadImg(canvas, filename) {
  388. // 图片导出为 png 格式
  389. var type = "png";
  390. var imgData = canvas.toDataURL(type, 1);
  391. let blobImg = this.base64ToBlob(imgData);
  392. return blobImg;
  393. // 加工image data,替换mime type
  394. //imgData = imgData.replace(this._fixType(type), 'image/octet-stream')
  395. // download
  396. //this.saveFile(imgData, filename)
  397. }
  398. saveFile(data, filename) {
  399. var save_link = document.createElementNS(
  400. "http://www.w3.org/1999/xhtml",
  401. "a"
  402. );
  403. save_link.href = data;
  404. save_link.download = filename;
  405. var event = document.createEvent("MouseEvents");
  406. event.initMouseEvent(
  407. "click",
  408. true,
  409. false,
  410. window,
  411. 0,
  412. 0,
  413. 0,
  414. 0,
  415. 0,
  416. false,
  417. false,
  418. false,
  419. false,
  420. 0,
  421. null
  422. );
  423. save_link.dispatchEvent(event);
  424. }
  425. _fixType(type) {
  426. type = type.toLowerCase().replace(/jpg/i, "jpeg");
  427. var r = type.match(/png|jpeg|bmp|gif/)[0];
  428. return "image/" + r;
  429. }
  430. base64ToBlob(base64) {
  431. let arr = base64.split(","),
  432. mime = arr[0].match(/:(.*?);/)[1],
  433. bstr = atob(arr[1]),
  434. n = bstr.length,
  435. u8arr = new Uint8Array(n);
  436. while (n--) {
  437. u8arr[n] = bstr.charCodeAt(n);
  438. }
  439. return new Blob([u8arr], { type: mime });
  440. }
  441. //截图
  442. menu_screenShot(fileName) {
  443. // this.menu_flex();
  444. // this.layer.stopAddVector()
  445. // setTimeout(function(){
  446. // this.downloadCadImg(this.layer.canvas,fileName)
  447. // }.bind(this),100)
  448. this.layer.stopAddVector();
  449. return this.downloadCadImg(this.layer.canvas, fileName);
  450. }
  451. menu_flex() {
  452. coordinate.reSet();
  453. this.layer.renderer.autoRedraw();
  454. }
  455. initTopTable(value) {
  456. let center = {
  457. x: 770,
  458. y: 200,
  459. };
  460. center = coordinate.getXYFromScreen(center);
  461. let table = tableService.createTable(center);
  462. table.setValue(value);
  463. this.layer.renderer.autoRedraw();
  464. }
  465. initDownTable(value) {
  466. let center = {
  467. x: 770,
  468. y: 520,
  469. };
  470. center = coordinate.getXYFromScreen(center);
  471. let table = tableService.createTable(center);
  472. table.setValue(value);
  473. this.layer.renderer.autoRedraw();
  474. }
  475. /******************************************************************************************************************************************************************/
  476. }