index.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { Pos } from "@/utils/math.ts";
  2. import { BaseItem, generateSnapInfos, getBaseItem } from "../util.ts";
  3. import { getMouseColors } from "@/utils/colors.ts";
  4. import { InteractiveFix, InteractiveTo, MatResponseProps } from "../index.ts";
  5. import { Transform } from "konva/lib/Util";
  6. import { inRevise } from "@/utils/shared.ts";
  7. export { default as Component } from "./line.vue";
  8. export { default as TempComponent } from "./temp-line.vue";
  9. export const shapeName = "线段";
  10. export const defaultStyle = {
  11. stroke: '#000000',
  12. strokeWidth: 5,
  13. dash: [30, 0],
  14. };
  15. export const addMode = "dots";
  16. export const getMouseStyle = (data: LineData) => {
  17. const strokeStatus = getMouseColors(data.stroke || defaultStyle.stroke);
  18. const strokeWidth = data.strokeWidth || defaultStyle.strokeWidth;
  19. return {
  20. default: { stroke: data.stroke || defaultStyle.stroke, strokeWidth },
  21. hover: { stroke: strokeStatus.hover },
  22. select: { stroke: strokeStatus.select },
  23. focus: { stroke: strokeStatus.hover },
  24. press: { stroke: strokeStatus.press },
  25. };
  26. };
  27. export const getSnapInfos = (data: LineData) =>
  28. generateSnapInfos(getSnapPoints(data), true, true, true);
  29. export const getSnapPoints = (data: LineData) => {
  30. return data.points;
  31. };
  32. export type LineData = Partial<typeof defaultStyle> &
  33. BaseItem & {
  34. points: Pos[];
  35. attitude: number[];
  36. };
  37. export const interactiveToData: InteractiveTo<"line"> = ({
  38. info,
  39. preset = {},
  40. ...args
  41. }) => {
  42. if (info.cur) {
  43. return interactiveFixData({
  44. ...args,
  45. info,
  46. data: {
  47. ...defaultStyle,
  48. ...getBaseItem(),
  49. ...preset,
  50. points: [],
  51. attitude: [1, 0, 0, 1, 0, 0],
  52. },
  53. });
  54. }
  55. };
  56. export const interactiveFixData: InteractiveFix<"line"> = ({ data, info }) => {
  57. const nv = [...info.consumed, info.cur!];
  58. data.points.length = nv.length
  59. for (let i = 0; i < nv.length; i++) {
  60. if (inRevise(data.points[i], nv[i])) {
  61. data.points[i] = nv[i]
  62. }
  63. }
  64. // data.points = [...info.consumed, info.cur!];
  65. return data;
  66. };
  67. export const matResponse = ({data, mat, increment}: MatResponseProps<'line'>) => {
  68. let transfrom: Transform
  69. const attitude = new Transform(data.attitude);
  70. if (!increment) {
  71. const inverMat = attitude.copy().invert();
  72. transfrom = mat.copy().multiply(inverMat);
  73. } else {
  74. transfrom = mat
  75. }
  76. data.points = data.points.map((v) => transfrom.point(v));
  77. data.attitude = transfrom.copy().multiply(attitude).m;
  78. return data;
  79. }
  80. export const getPredefine = (key: keyof LineData) => {
  81. if (key === 'strokeWidth') {
  82. return { proportion: true }
  83. }
  84. }