123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import { InteractiveMessage } from "../../hook/use-interactive.ts";
- import { CircleConfig } from "konva/lib/shapes/Circle";
- import { themeMouseColors } from "@/constant/help-style.ts";
- import {
- BaseItem,
- generateSnapInfos,
- getBaseItem,
- getRectSnapPoints,
- } from "../util.ts";
- import { getMouseColors } from "@/utils/colors.ts";
- export { default as Component } from "./circle.vue";
- export { default as TempComponent } from "./temp-circle.vue";
- export const shapeName = "圆形";
- export const defaultStyle = {
- stroke: themeMouseColors.theme,
- fill: "#fff",
- strokeWidth: 1,
- };
- export const addMode = "area";
- export const getMouseStyle = (data: CircleData) => {
- const fillStatus = getMouseColors(data.fill || defaultStyle.fill);
- const strokeStatus = getMouseColors(data.stroke || defaultStyle.stroke);
- const strokeWidth = data.strokeWidth || defaultStyle.strokeWidth;
- return {
- default: { fill: fillStatus.pub, stroke: strokeStatus.pub, strokeWidth },
- hover: { fill: fillStatus.hover },
- press: { fill: fillStatus.press },
- };
- };
- export const getSnapInfos = (data: CircleData) => {
- const size = data.radius * 2;
- const points = getRectSnapPoints(size, size).map((v) => ({
- x: v.x + data.x,
- y: v.y + data.y,
- }));
- console.log(points)
- return generateSnapInfos(points, true, false);
- };
- export type CircleData = Partial<typeof defaultStyle> &
- BaseItem & {
- x: number;
- y: number;
- radius: number;
- };
- export const dataToConfig = (data: CircleData): CircleConfig => ({
- ...defaultStyle,
- ...data,
- });
- export const interactiveToData = (
- info: InteractiveMessage,
- preset: Partial<CircleData> = {}
- ): CircleData | undefined => {
- if (info.area) {
- const item = {
- ...getBaseItem(),
- ...preset,
- ...info.area[0],
- } as unknown as CircleData;
- return interactiveFixData(item, info);
- }
- };
- export const interactiveFixData = (
- data: CircleData,
- info: InteractiveMessage
- ) => {
- const area = info.area!;
- const xr = Math.abs(area[1].x - area[0].x);
- const yr = Math.abs(area[1].y - area[0].y);
- data.radius = Math.max(xr, yr, 0.01);
- return data;
- };
|