index.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import mitt from "mitt";
  2. import { text, table, compass, title, bgImage, customImage } from "./shape";
  3. import Layer from "./editCAD/Layer";
  4. import { history } from "./editCAD/History/History.js";
  5. import { uploadFile } from "@/store/system";
  6. // const toStore = (refs) => {
  7. // return {
  8. // bgImage: refs.baseMap?.data || null,
  9. // shapes: refs.shapes.map(shape => shape.data)
  10. // }
  11. // }
  12. export const create = async (store, canvas) => {
  13. const refs = {
  14. ctx: canvas.getContext("2d"),
  15. bus: mitt(),
  16. shapes: [],
  17. baseMap: null,
  18. };
  19. console.log(store)
  20. setTimeout(() => {
  21. console.log(!!store.floors[0].bgImage)
  22. refs.bus.emit('exixtsBgImage', !!store.floors[0].bgImage)
  23. }, 100)
  24. const layer = new Layer();
  25. await layer.start(canvas, store);
  26. const defaultData = {
  27. color: "rgba(0,0,0,1)",
  28. text: "",
  29. fontSize: 12,
  30. scale: 1,
  31. rotate: 0,
  32. content: [
  33. { width: 160, height: 60, value: "", colIndex: 0, rowIndex: 0 },
  34. { width: 160, height: 60, value: "", colIndex: 1, rowIndex: 0 },
  35. ],
  36. };
  37. layer.uiControl.bus.on("showAttribute", ({ type, value: data }) => {
  38. data =
  39. data && typeof data === "object"
  40. ? Object.assign({ ...defaultData }, data)
  41. : { ...defaultData };
  42. const method = Object.fromEntries(
  43. Object.keys(data).map((key) => [
  44. `set${key.slice(0, 1).toUpperCase() + key.slice(1)}`,
  45. (value, save = true) => {
  46. update({ [key]: value, save });
  47. },
  48. ])
  49. );
  50. const shape = {
  51. data: { type, ...data },
  52. ...method,
  53. delete: () => {
  54. layer.uiControl.clearUI();
  55. layer.uiControl.setAttributes(type, "delete");
  56. if (type === bgImage) {
  57. refs.bus.emit('exixtsBgImage', false)
  58. }
  59. },
  60. };
  61. const update = (newData) => {
  62. layer.uiControl.setAttributes(type, "update", { ...newData, version: 2 });
  63. };
  64. refs.bus.emit("selectShape", shape);
  65. });
  66. layer.uiControl.bus.on("hideAttribute", () => {
  67. refs.bus.emit("selectShape", null);
  68. });
  69. history.bus.on("undoAvailable", (availabe) => {
  70. refs.bus.emit("backDisabled", !availabe);
  71. });
  72. history.bus.on("redoAvailable", (availabe) =>
  73. refs.bus.emit("forwardDisabled", !availabe)
  74. );
  75. setTimeout(() => {
  76. // layer.uiControl.bus.emit('showAttribute', { type: compass, data: 0 })
  77. // history.bus.emit('undoAvailable', true)
  78. // history.bus.emit('redoAvailable', true)
  79. }, 100);
  80. let run = false;
  81. const board = {
  82. bus: refs.bus,
  83. el: canvas,
  84. async getStore() {
  85. const data = layer.uiControl.exportJSON();
  86. const floor = data.floors[0];
  87. const shapes = [];
  88. if (floor) {
  89. const bgImage = floor.bgImage?.url;
  90. if (bgImage && bgImage.includes("blob:")) {
  91. const url = await fetch(bgImage)
  92. .then((res) => res.blob())
  93. .then((blob) =>
  94. uploadFile(new File([blob], (store.id || "image") + ".png"))
  95. );
  96. floor.bgImage.url = url;
  97. console.log(url);
  98. }
  99. shapes.push({ type: title, text: floor.title.value });
  100. }
  101. return {
  102. id: store.id,
  103. shapes,
  104. ...layer.uiControl.exportJSON(),
  105. };
  106. },
  107. viewInit() {
  108. layer.uiControl.menu_flex();
  109. },
  110. unSelectShape() {
  111. layer.uiControl.clearUI();
  112. },
  113. setDefaultTable(rbTable, rtTable) {
  114. if (rbTable) {
  115. layer.uiControl.initDownTable(rbTable);
  116. }
  117. if (rtTable) {
  118. layer.uiControl.initTopTable(rtTable);
  119. }
  120. },
  121. initHistory() {
  122. history.init();
  123. },
  124. readyAddShape(shapeType, data, onFine) {
  125. layer.uiControl.selectUI = shapeType;
  126. if (customImage === shapeType) {
  127. layer.uiControl.setAttributes(shapeType, "upload", {
  128. url: data,
  129. version: 2,
  130. });
  131. onFine();
  132. } else {
  133. layer.uiControl.updateEventNameForSelectUI();
  134. const finePack = () => {
  135. layer.uiControl.bus.off("hideUI", finePack);
  136. onFine();
  137. };
  138. layer.uiControl.bus.on("hideUI", finePack);
  139. }
  140. },
  141. back() {
  142. if (run) return;
  143. run = true;
  144. console.log("撤销");
  145. history.handleUndo().then(() => {
  146. console.log("撤销完成");
  147. run = false;
  148. });
  149. },
  150. forward() {
  151. if (run) return;
  152. run = true;
  153. console.log("回复");
  154. history.handleRedo().then(() => {
  155. console.log("回复完成");
  156. run = false;
  157. });
  158. },
  159. setImage(url) {
  160. refs.bus.emit('exixtsBgImage', true)
  161. layer.uiControl.setAttributes(bgImage, "upload", { url, scale: 1 });
  162. },
  163. clear() {
  164. history.clear()
  165. },
  166. export() {
  167. return new Promise((resolve) => {
  168. layer.uiControl.exportImg(canvas, "cover.jpg", (blob) => {
  169. // const file = new File([blob], `asdasd.jpg`)
  170. // window.open(URL.createObjectURL(file))
  171. // console.log(blob)
  172. resolve(blob)
  173. });
  174. });
  175. const $canvas = document.createElement("canvas");
  176. $canvas.width = canvas.width;
  177. $canvas.height = canvas.height;
  178. const cctx = $canvas.getContext("2d");
  179. cctx.rect(0, 0, $canvas.width, $canvas.height);
  180. cctx.fillStyle = "rgba(255,255,255,1)";
  181. cctx.fill();
  182. cctx.drawImage(
  183. canvas,
  184. 0,
  185. 0,
  186. $canvas.width,
  187. $canvas.height,
  188. 0,
  189. 0,
  190. canvas.width,
  191. canvas.height
  192. );
  193. return new Promise((resolve) => {
  194. // resolve(layer.uiControl.menu_screenShot())
  195. $canvas.toBlob(resolve, "image/jpeg", 1);
  196. });
  197. },
  198. calcTableShape(data) {
  199. return new Promise((resolve) => {
  200. const tableData = {
  201. data: {
  202. type: table,
  203. content: data
  204. .map((cols, index) => [
  205. {
  206. rowIndex: index,
  207. colIndex: 0,
  208. width: 0,
  209. height: 0,
  210. value: cols[0],
  211. },
  212. {
  213. rowIndex: index,
  214. colIndex: 1,
  215. width: 0,
  216. height: 0,
  217. value: cols[1],
  218. },
  219. ])
  220. .flat(),
  221. },
  222. setContent(newData) {
  223. board.bus.emit("selectShape", null);
  224. resolve({ type: table, content: newData });
  225. },
  226. autoSet: true,
  227. };
  228. board.bus.emit("selectShape", tableData);
  229. });
  230. },
  231. destroy() {},
  232. };
  233. return board;
  234. };
  235. export * from "./shape";
  236. export default create;
  237. export { shapes } from "./shapes";