index.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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('ssssss', 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. ognFilesUrl: store.ognFilesUrl,
  105. ...layer.uiControl.exportJSON(),
  106. };
  107. },
  108. viewInit() {
  109. layer.uiControl.menu_flex();
  110. },
  111. unSelectShape() {
  112. layer.uiControl.clearUI();
  113. },
  114. setDefaultTable(rbTable, rtTable) {
  115. if (rbTable) {
  116. layer.uiControl.initDownTable(rbTable);
  117. }
  118. if (rtTable) {
  119. layer.uiControl.initTopTable(rtTable);
  120. }
  121. },
  122. initHistory() {
  123. history.init();
  124. },
  125. readyAddShape(shapeType, data, onFine) {
  126. layer.uiControl.selectUI = shapeType;
  127. if (customImage === shapeType) {
  128. layer.uiControl.setAttributes(shapeType, "upload", {
  129. url: data,
  130. version: 2,
  131. });
  132. onFine();
  133. } else {
  134. layer.uiControl.updateEventNameForSelectUI();
  135. const finePack = () => {
  136. layer.uiControl.bus.off("hideUI", finePack);
  137. onFine();
  138. };
  139. layer.uiControl.bus.on("hideUI", finePack);
  140. }
  141. },
  142. back() {
  143. if (run) return;
  144. run = true;
  145. console.log("撤销");
  146. history.handleUndo().then(() => {
  147. console.log("撤销完成");
  148. run = false;
  149. });
  150. },
  151. forward() {
  152. if (run) return;
  153. run = true;
  154. console.log("回复");
  155. history.handleRedo().then(() => {
  156. console.log("回复完成");
  157. run = false;
  158. });
  159. },
  160. setImage(url) {
  161. refs.bus.emit('exixtsBgImage', true)
  162. layer.uiControl.setAttributes(bgImage, "upload", { url, scale: 1 });
  163. },
  164. clear() {
  165. history.clear()
  166. },
  167. export() {
  168. return new Promise((resolve) => {
  169. layer.uiControl.exportImg(canvas, "cover.jpg", (blob) => {
  170. // const file = new File([blob], `asdasd.jpg`)
  171. // window.open(URL.createObjectURL(file))
  172. // console.log(blob)
  173. resolve(blob)
  174. });
  175. });
  176. const $canvas = document.createElement("canvas");
  177. $canvas.width = canvas.width;
  178. $canvas.height = canvas.height;
  179. const cctx = $canvas.getContext("2d");
  180. cctx.rect(0, 0, $canvas.width, $canvas.height);
  181. cctx.fillStyle = "rgba(255,255,255,1)";
  182. cctx.fill();
  183. cctx.drawImage(
  184. canvas,
  185. 0,
  186. 0,
  187. $canvas.width,
  188. $canvas.height,
  189. 0,
  190. 0,
  191. canvas.width,
  192. canvas.height
  193. );
  194. return new Promise((resolve) => {
  195. // resolve(layer.uiControl.menu_screenShot())
  196. $canvas.toBlob(resolve, "image/jpeg", 1);
  197. });
  198. },
  199. calcTableShape(data) {
  200. return new Promise((resolve) => {
  201. const tableData = {
  202. data: {
  203. type: table,
  204. content: data
  205. .map((cols, index) => [
  206. {
  207. rowIndex: index,
  208. colIndex: 0,
  209. width: 0,
  210. height: 0,
  211. value: cols[0],
  212. },
  213. {
  214. rowIndex: index,
  215. colIndex: 1,
  216. width: 0,
  217. height: 0,
  218. value: cols[1],
  219. },
  220. ])
  221. .flat(),
  222. },
  223. setContent(newData) {
  224. board.bus.emit("selectShape", null);
  225. resolve({ type: table, content: newData });
  226. },
  227. autoSet: true,
  228. };
  229. board.bus.emit("selectShape", tableData);
  230. });
  231. },
  232. destroy() {},
  233. };
  234. return board;
  235. };
  236. export * from "./shape";
  237. export default create;
  238. export { shapes } from "./shapes";