index.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { InteractiveMessage } from "../../hook/use-interactive.ts";
  2. import { CircleConfig } from "konva/lib/shapes/Circle";
  3. import { themeMouseColors } from "@/constant/help-style.ts";
  4. import {
  5. BaseItem,
  6. generateSnapInfos,
  7. getBaseItem,
  8. getRectSnapPoints,
  9. } from "../util.ts";
  10. import { getMouseColors } from "@/utils/colors.ts";
  11. export { default as Component } from "./circle.vue";
  12. export { default as TempComponent } from "./temp-circle.vue";
  13. export const shapeName = "圆形";
  14. export const defaultStyle = {
  15. stroke: themeMouseColors.theme,
  16. fill: "#fff",
  17. strokeWidth: 1,
  18. };
  19. export const addMode = "area";
  20. export const getMouseStyle = (data: CircleData) => {
  21. const fillStatus = getMouseColors(data.fill || defaultStyle.fill);
  22. const strokeStatus = getMouseColors(data.stroke || defaultStyle.stroke);
  23. const strokeWidth = data.strokeWidth || defaultStyle.strokeWidth;
  24. return {
  25. default: { fill: fillStatus.pub, stroke: strokeStatus.pub, strokeWidth },
  26. hover: { fill: fillStatus.hover },
  27. press: { fill: fillStatus.press },
  28. };
  29. };
  30. export const getSnapInfos = (data: CircleData) => {
  31. const size = data.radius * 2;
  32. const points = getRectSnapPoints(size, size).map((v) => ({
  33. x: v.x + data.x,
  34. y: v.y + data.y,
  35. }));
  36. console.log(points)
  37. return generateSnapInfos(points, true, false);
  38. };
  39. export type CircleData = Partial<typeof defaultStyle> &
  40. BaseItem & {
  41. x: number;
  42. y: number;
  43. radius: number;
  44. };
  45. export const dataToConfig = (data: CircleData): CircleConfig => ({
  46. ...defaultStyle,
  47. ...data,
  48. });
  49. export const interactiveToData = (
  50. info: InteractiveMessage,
  51. preset: Partial<CircleData> = {}
  52. ): CircleData | undefined => {
  53. if (info.area) {
  54. const item = {
  55. ...getBaseItem(),
  56. ...preset,
  57. ...info.area[0],
  58. } as unknown as CircleData;
  59. return interactiveFixData(item, info);
  60. }
  61. };
  62. export const interactiveFixData = (
  63. data: CircleData,
  64. info: InteractiveMessage
  65. ) => {
  66. const area = info.area!;
  67. const xr = Math.abs(area[1].x - area[0].x);
  68. const yr = Math.abs(area[1].y - area[0].y);
  69. data.radius = Math.max(xr, yr, 0.01);
  70. return data;
  71. };