gen-tab.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import { getBaseItem } from "@/core/components/util";
  2. import {
  3. getPaperConfig,
  4. paperConfigs,
  5. PaperKey,
  6. } from "@/example/components/slide/actions";
  7. import {
  8. TabCover,
  9. tableCompassKey,
  10. tableCoverHeight,
  11. tableCoverKey,
  12. tableCoverScaleKey,
  13. tableCoverWidth,
  14. tableTableKey,
  15. tableTitleKey,
  16. } from "../../store";
  17. import { matResponse } from "@/core/components/table";
  18. import { Transform } from "konva/lib/Util";
  19. import { getFixPosition } from "@/utils/bound";
  20. import { getImage } from "@/utils/resource";
  21. import { ImageData } from "@/core/components/image";
  22. import { DrawData } from "@/core/components";
  23. import { getEmptyStoreData, StoreData } from "@/core/store/store";
  24. import { defaultLayer } from "@/constant";
  25. import { IconData } from "@/core/components/icon";
  26. import { MathUtils } from "three";
  27. export const getRealPixel = (real: number, paperKey: PaperKey) => {
  28. const realPixelScale = paperConfigs[paperKey].scale;
  29. return real * realPixelScale;
  30. };
  31. export const transformPaper = (
  32. real: number,
  33. paperKey: PaperKey,
  34. toPaperKey: PaperKey
  35. ) => {
  36. const scale = paperConfigs[paperKey].scale / paperConfigs[toPaperKey].scale;
  37. return real * scale;
  38. };
  39. export const getCoverPaperScale = (cover: ImageData, paperKey: PaperKey) => {
  40. let pixelScale = (cover.widthRaw! / cover.width) * cover.proportion!.scale;
  41. const realPixelScale = paperConfigs[paperKey].scale;
  42. return realPixelScale * pixelScale;
  43. };
  44. export const setCoverPaperScale = (cover: ImageData, paperKey: PaperKey, scale: number) => {
  45. const realPixelScale = paperConfigs[paperKey].scale;
  46. cover.width = cover.widthRaw! / ((scale / realPixelScale) /cover.proportion!.scale)
  47. cover.height = (cover.heightRaw! / cover.widthRaw!) * cover.width
  48. }
  49. export const genTabulationData = async (paperKey: PaperKey, compass?: number, cover?: TabCover | null) => {
  50. const { margin, size } = getPaperConfig(
  51. paperConfigs[paperKey].size,
  52. paperConfigs[paperKey].scale
  53. );
  54. const getTable = () => {
  55. const w1 = getRealPixel(25, paperKey);
  56. const w2 = getRealPixel(55, paperKey);
  57. const h = getRealPixel(8, paperKey);
  58. const nameColl = {
  59. width: w1,
  60. height: h,
  61. padding: getRealPixel(2, paperKey),
  62. content: "",
  63. align: "center",
  64. fontSize: getRealPixel(4, paperKey),
  65. fontColor: "#000000",
  66. };
  67. const valueColl = { ...nameColl, width: w2 };
  68. const data = {
  69. ...getBaseItem(),
  70. content: [
  71. [{ ...nameColl, content: "案发时间" }, valueColl],
  72. [{ ...nameColl, content: "案发地点" }, valueColl],
  73. [{ ...nameColl, content: "绘图单位" }, valueColl],
  74. [{ ...nameColl, content: "绘图人" }, valueColl],
  75. [{ ...nameColl, content: "绘图时间" }, valueColl],
  76. ],
  77. fontSize: getRealPixel(4, paperKey),
  78. key: tableTableKey,
  79. width: nameColl.width + valueColl.width,
  80. height: nameColl.height * 5,
  81. mat: [1, 0, 0, 1, 0, 0],
  82. };
  83. const pos = getFixPosition(
  84. {
  85. right: getRealPixel(15, paperKey) + margin[1],
  86. bottom: getRealPixel(15, paperKey) + margin[2],
  87. },
  88. data,
  89. size
  90. );
  91. return matResponse({ data, mat: new Transform().translate(pos.x, pos.y) });
  92. };
  93. const getCover = async () => {
  94. if (!cover) return;
  95. const image = await getImage(cover.url);
  96. const rectScale = image.width / image.height;
  97. const tableCoverScale = tableCoverWidth / tableCoverHeight;
  98. let width: number, height: number;
  99. if (rectScale > tableCoverScale) {
  100. width = transformPaper(tableCoverWidth, paperKey, "a4");
  101. height = width / rectScale;
  102. } else {
  103. height = transformPaper(tableCoverHeight, paperKey, "a4");
  104. width = rectScale * height;
  105. }
  106. const coverData = {
  107. ...getBaseItem(),
  108. cornerRadius: 0,
  109. strokeWidth: 0,
  110. disableDelete: true,
  111. url: cover.url,
  112. key: tableCoverKey,
  113. proportion: cover.proportion,
  114. disableTransformer: true,
  115. widthRaw: cover.width,
  116. showScale: true,
  117. heightRaw: cover.height,
  118. zIndex: -1,
  119. width,
  120. height,
  121. mat: [1, 0, 0, 1, 0, 0],
  122. itemName: '比例'
  123. };
  124. const pos = getFixPosition(
  125. {
  126. left: coverData.width / 2 + margin[3] + getRealPixel(15, paperKey),
  127. bottom: -coverData.height / 2 + margin[2] + getRealPixel(15, paperKey),
  128. },
  129. coverData,
  130. size
  131. );
  132. coverData.mat[4] = pos.x;
  133. coverData.mat[5] = pos.y;
  134. const scale = getCoverPaperScale(coverData, paperKey);
  135. setCoverPaperScale(coverData, paperKey, Math.round(scale / 10) * 10 || 10)
  136. return coverData;
  137. };
  138. const getCoverScale = (cover: ImageData) => {
  139. const scale = (cover.widthRaw! / cover.width) * cover.proportion!.scale;
  140. console.log(cover)
  141. const text = {
  142. ...getBaseItem(),
  143. content: `1:${scale}`,
  144. width: getRealPixel(30, paperKey),
  145. heihgt: getRealPixel(4.8, paperKey),
  146. fontSize: getRealPixel(4, paperKey),
  147. disableEditText: true,
  148. key: tableCoverScaleKey,
  149. disableDelete: true,
  150. align: "center",
  151. mat: [1, 0, 0, 1, 0, 0],
  152. };
  153. const x = cover.mat[4] - (text.width || 0) / 2;
  154. const y = cover.mat[5] + cover.height / 2 + getRealPixel(5, paperKey);
  155. text.mat[4] = x;
  156. text.mat[5] = y;
  157. return text;
  158. };
  159. const getTitle = () => {
  160. const title = {
  161. ...getBaseItem(),
  162. content: "默认标题",
  163. width: getRealPixel(90, paperKey),
  164. heihgt: getRealPixel(14.4, paperKey),
  165. fontSize: getRealPixel(12, paperKey),
  166. key: tableTitleKey,
  167. align: "center",
  168. mat: [1, 0, 0, 1, 0, 0],
  169. };
  170. const pos = {
  171. x: (size.width - margin[3]) / 2 - getRealPixel(40, paperKey) + margin[3],
  172. y: getRealPixel(15, paperKey) + margin[0],
  173. };
  174. title.mat[4] = pos.x;
  175. title.mat[5] = pos.y;
  176. return title;
  177. };
  178. const getCompass = () => {
  179. const mat = new Transform().rotate(MathUtils.degToRad(compass!))
  180. const data: IconData = {
  181. ...getBaseItem(),
  182. width: getRealPixel(37.3366 / 2.3, paperKey),
  183. height: getRealPixel(60 / 2.3, paperKey),
  184. url: './icons/compass.svg',
  185. fill: "#000000",
  186. disableDelete: true,
  187. coverOpcatiy: 0,
  188. strokeScaleEnabled: false,
  189. key: tableCompassKey,
  190. mat: mat.m,
  191. name: '指南针'
  192. };
  193. const pos = getFixPosition(
  194. {
  195. right: getRealPixel(8, paperKey) + margin[1] ,
  196. top: getRealPixel(42, paperKey) + margin[2],
  197. },
  198. data,
  199. size
  200. );
  201. data.mat[4] = pos.x;
  202. data.mat[5] = pos.y;
  203. return data;
  204. }
  205. const data: DrawData = {
  206. table: [getTable()],
  207. text: [getTitle()],
  208. }
  209. const image = await getCover()
  210. if (image) {
  211. data.image = [image]
  212. data.text!.push(getCoverScale(image))
  213. }
  214. if (compass !== undefined) {
  215. data.icon = [getCompass()]
  216. }
  217. return data
  218. };
  219. export const repTabulationStore = async (paperKey: PaperKey, compass?: number, cover?: TabCover, store?: StoreData) => {
  220. const repData = await genTabulationData(paperKey, compass, cover)
  221. const layer = store?.layers && store?.layers[defaultLayer];
  222. if (!layer) {
  223. return {
  224. ...(store || {}),
  225. config: {
  226. ...getEmptyStoreData(),
  227. ...(store?.config || {}),
  228. },
  229. layers: {
  230. ...(store?.layers || {}),
  231. [defaultLayer]: repData
  232. }
  233. }
  234. }
  235. if (repData.image?.length) {
  236. const imageData = repData.image[0]
  237. const images = layer.image || []
  238. const imageNdx = images.findIndex(item => item.key === imageData.key)
  239. if (~imageNdx) {
  240. images[imageNdx] = {
  241. ...imageData,
  242. mat: images[imageNdx].mat
  243. }
  244. } else {
  245. images.push(imageData)
  246. }
  247. layer.image = images
  248. const scaleData = repData.text!.find(item => item.key === tableCoverScaleKey)!
  249. const texts = layer.text || []
  250. const textNdx = texts.findIndex(item => item.key === scaleData.key)
  251. if (~textNdx) {
  252. texts[textNdx].content = scaleData.content
  253. } else {
  254. texts.push(scaleData)
  255. }
  256. layer.text = texts
  257. }
  258. if (repData.icon) {
  259. const iconData = repData.icon[0]
  260. const icons = layer.icon || []
  261. const iconNdx = icons.findIndex(item => item.key === iconData.key)
  262. if (~iconNdx) {
  263. icons[iconNdx] = iconData
  264. } else {
  265. icons.push(iconData)
  266. }
  267. layer.icon = icons
  268. }
  269. store.layers[defaultLayer] = layer
  270. return store;
  271. }