gen-tab.ts 8.5 KB

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