UIControl.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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 GeoActions from "../enum/GeoActions.js";
  6. import { stateService } from "../Service/StateService.js";
  7. import { uiService } from "../Service/UIService.js";
  8. import { dataService } from "../Service/DataService.js";
  9. import { historyService } from "../Service/HistoryService.js";
  10. import { elementService } from "../Service/ElementService";
  11. import { lineService } from "../Service/LineService.js";
  12. import { circleService } from "../Service/CircleService.js";
  13. import { textService } from "../Service/TextService.js";
  14. import { magnifierService } from "../Service/MagnifierService.js";
  15. import { mathUtil } from "../Util/MathUtil";
  16. import Constant from "../Constant";
  17. // import { roomsUtil } from "../Room/RoomsUtil.js";
  18. import { addRoad } from "../Controls/AddRoad";
  19. import { addLine } from "./AddLine.js";
  20. import VectorCategory from "../enum/VectorCategory.js";
  21. // import { floorplanData } from "../VectorData.js";
  22. import Message from "@/components/base/components/message/message.vue";
  23. import { pointService } from "../Service/PointService.js";
  24. import Settings from "../Settings.js";
  25. export default class UIControl {
  26. constructor(layer, newsletter, graphicStateUI) {
  27. this._prompts = [];
  28. this.layer = layer;
  29. this.newsletter = newsletter;
  30. this.graphicStateUI = graphicStateUI;
  31. }
  32. get selectUI() {
  33. return this.newsletter.selectUI;
  34. }
  35. set selectUI(selectUI) {
  36. this.updateEventNameForSelectUI(selectUI);
  37. this.newsletter.selectUI = selectUI;
  38. }
  39. get focusVector() {
  40. return this.newsletter.focusVector;
  41. }
  42. set focusVector(focusVector) {
  43. this.newsletter.focusVector = focusVector;
  44. }
  45. /**
  46. * 获取选中要操作的UI
  47. */
  48. get currentUI() {}
  49. /**
  50. * 设置选中要操作的UI
  51. */
  52. set currentUI(value) {
  53. this.selectUI = value;
  54. }
  55. clearUI() {
  56. this.currentUI = null;
  57. this.selectUI = null;
  58. }
  59. //点击左侧栏后,更新事件
  60. updateEventNameForSelectUI(selectUI) {
  61. console.log(this.selectUI, selectUI);
  62. if (selectUI != null) {
  63. if (this.selectUI == selectUI) {
  64. return;
  65. } else if (this.selectUI != selectUI) {
  66. if (this.selectUI != null) {
  67. //先取消当前事件和进程
  68. this.layer.exit();
  69. }
  70. //执行新的事件
  71. if (uiService.isBelongRoad(selectUI) || selectUI == "road") {
  72. stateService.setEventName(LayerEvents.AddRoad);
  73. } else if (selectUI == UIEvents.CurveRoad) {
  74. stateService.setEventName(LayerEvents.AddCurveRoad);
  75. } else if (uiService.isBelongLine(selectUI)) {
  76. stateService.setEventName(LayerEvents.AddLine);
  77. } else if (selectUI == UIEvents.CurveLine) {
  78. stateService.setEventName(LayerEvents.AddCurveLine);
  79. } else if (uiService.isBelongPoint(selectUI)) {
  80. stateService.setEventName(LayerEvents.AddPoint);
  81. } else if (selectUI == UIEvents.Circle) {
  82. stateService.setEventName(LayerEvents.AddCircle);
  83. } else if (selectUI == UIEvents.Text) {
  84. stateService.setEventName(LayerEvents.AddText);
  85. } else if (selectUI == UIEvents.Magnifier) {
  86. stateService.setEventName(LayerEvents.AddMagnifier);
  87. } else if (selectUI == UIEvents.SVG) {
  88. stateService.setEventName(LayerEvents.AddSVG);
  89. } else if (selectUI == UIEvents.Img) {
  90. stateService.setEventName(LayerEvents.Img);
  91. }
  92. }
  93. }
  94. }
  95. async handleGeo(action) {
  96. let needAutoRedraw = false;
  97. const item = stateService.getFocusItem();
  98. if (item && item.vectorId) {
  99. switch (action) {
  100. case GeoActions.CopyAction:
  101. await this.copyVector(item.vectorId, item.type);
  102. needAutoRedraw = true;
  103. break;
  104. case GeoActions.DeleteAction:
  105. this.deleteVector(item.vectorId, item.type);
  106. needAutoRedraw = true;
  107. break;
  108. }
  109. }
  110. if (needAutoRedraw) {
  111. this.layer.history.save();
  112. this.layer.renderer.autoRedraw();
  113. }
  114. }
  115. //删除按钮
  116. deleteVector(vectorId, geoType) {
  117. switch (geoType) {
  118. case VectorType.Point:
  119. pointService.deletePoint(vectorId);
  120. break;
  121. case VectorType.Line:
  122. dataService.deleteLine(vectorId);
  123. if (vectorId == Settings.baseLineId) {
  124. this.layer.initLocation();
  125. Settings.baseLineId = null;
  126. }
  127. break;
  128. case VectorType.CurveLine:
  129. break;
  130. case VectorType.Circle:
  131. dataService.deleteCircle(vectorId);
  132. break;
  133. case VectorType.Text:
  134. dataService.deleteText(vectorId);
  135. break;
  136. case VectorType.Magnifier:
  137. dataService.deleteMagnifier(vectorId);
  138. break;
  139. }
  140. this.layer.exit();
  141. uiService.setLineCategory(VectorCategory.Line.NormalLine);
  142. uiService.setPointCategory(VectorCategory.Point.NormalPoint);
  143. this.focusVector = null;
  144. }
  145. //复制按钮
  146. async copyVector(vectorId, geoType) {
  147. switch (geoType) {
  148. case VectorType.Line:
  149. lineService.copy(vectorId);
  150. break;
  151. case VectorType.CurveLine:
  152. break;
  153. case VectorType.Circle:
  154. circleService.copy(vectorId);
  155. break;
  156. case VectorType.Text:
  157. textService.copy(vectorId);
  158. break;
  159. case VectorType.Magnifier:
  160. await magnifierService.copy(vectorId);
  161. break;
  162. }
  163. }
  164. //截图
  165. async screenShot() {
  166. let canvas = this.layer.canvas;
  167. this.menu_view_reset();
  168. //隐藏grid
  169. dataService.setGridDisplay(false);
  170. this.layer.renderer.autoRedraw();
  171. // this.downloadCadImg(canvas, "test.jpg");
  172. const blob = await this.getCadBlob(canvas);
  173. //显示grid
  174. dataService.setGridDisplay(true);
  175. this.layer.renderer.autoRedraw();
  176. return blob;
  177. }
  178. getCadBlob(canvas) {
  179. var type = "jpg";
  180. return new Promise((resolve) => canvas.toBlob(resolve, `${type}/image`));
  181. }
  182. downloadCadImg(canvas, filename) {
  183. // 图片导出为 jpg 格式
  184. var type = "jpg";
  185. var imgData = canvas.toDataURL(type, 3);
  186. canvas.toBlob(`${type}/image`);
  187. // 加工image data,替换mime type
  188. imgData = imgData.replace(this._fixType(type), "image/octet-stream");
  189. // 下载后的图片名
  190. //var filename = 'cad_' + new Date().getTime() + '.' + type
  191. // download
  192. debugger;
  193. this.saveFile(imgData, filename);
  194. }
  195. saveFile(data, filename) {
  196. var save_link = document.createElementNS(
  197. "http://www.w3.org/1999/xhtml",
  198. "a"
  199. );
  200. save_link.href = data;
  201. save_link.download = filename;
  202. var event = document.createEvent("MouseEvents");
  203. event.initMouseEvent(
  204. "click",
  205. true,
  206. false,
  207. window,
  208. 0,
  209. 0,
  210. 0,
  211. 0,
  212. 0,
  213. false,
  214. false,
  215. false,
  216. false,
  217. 0,
  218. null
  219. );
  220. save_link.dispatchEvent(event);
  221. }
  222. _fixType(type) {
  223. type = type.toLowerCase().replace(/jpg/i, "jpeg");
  224. var r = type.match(/png|jpeg|bmp|gif/)[0];
  225. return "image/" + r;
  226. }
  227. /****************************************************************************针对菜单*******************************************************************************/
  228. //撤销
  229. menu_revoke() {
  230. this.layer.history.goPreState();
  231. const historyState = historyService.getHistoryState();
  232. this.graphicStateUI.canRevoke = historyState.pre;
  233. this.graphicStateUI.canRecovery = true;
  234. this.layer.stopAddVector();
  235. this.layer.renderer.autoRedraw();
  236. }
  237. //恢复
  238. menu_recovery() {
  239. this.layer.history.goNextState();
  240. const historyState = historyService.getHistoryState();
  241. this.graphicStateUI.canRecovery = historyState.next;
  242. this.graphicStateUI.canRevoke = true;
  243. this.layer.stopAddVector();
  244. this.layer.renderer.autoRedraw();
  245. }
  246. menu_view_reset() {
  247. coordinate.reSet(this.layer.canvas);
  248. this.layer.renderer.autoRedraw();
  249. }
  250. // value 为true则开 false则关
  251. menu_backgroundImg(value) {
  252. console.log(value);
  253. //
  254. const backgroundImg = dataService.getBackgroundImg();
  255. backgroundImg.setDisplay(value);
  256. this.graphicStateUI.showBackImage = value;
  257. this.layer.renderer.autoRedraw();
  258. }
  259. menu_clear() {
  260. dataService.clear();
  261. Settings.locationMode = null;
  262. Settings.baseLineId = null;
  263. Settings.selectBasePointId = null;
  264. elementService.hideAll();
  265. this.layer.exit();
  266. this.layer.initLocation();
  267. this.layer.history.save();
  268. this.layer.renderer.autoRedraw();
  269. }
  270. /******************************************************************************************************************************************************************/
  271. prompt(msg) {
  272. this._prompts.push(
  273. Message.success(typeof msg === "string" ? { msg } : msg)
  274. );
  275. }
  276. // 进入持续添加出确认与取消框
  277. showConfirm() {
  278. this.graphicStateUI.continuedMode = true;
  279. }
  280. confirmEntry() {
  281. console.log("确认");
  282. this.graphicStateUI.continuedMode = false;
  283. }
  284. confirmCancel() {
  285. console.log("取消");
  286. this.graphicStateUI.continuedMode = false;
  287. }
  288. hidePrompt() {
  289. for (let prompt of this._prompts) {
  290. prompt();
  291. }
  292. }
  293. }