import { CompoundedComponent } from "@/types"; import { register } from "@antv/x6-react-shape"; import { Graph, Node } from "@antv/x6"; import { ports, defaultData } from "../../config/data"; import CustomInput from "../CustomInput"; import { useSizeHook, useShapeProps } from "@/hooks"; const component = ({ node }: { node: Node }) => { const { label, text, fill, stroke, opacity } = node.getData(); const { size, ref } = useSizeHook(); const { fillContent, defsContent, strokeColor, strokeWidth, strokeDasharray, } = useShapeProps(fill, size, stroke); const generatePath = (width: number, height: number, strokeWidth: number) => { let path = ""; // 开始位置 path += `M${width / 2} ${height - strokeWidth}`; path += `L${width - strokeWidth} ${height * 0.3}`; path += `C${width - strokeWidth},${height * 0.3} ${(width * 3) / 4},${strokeWidth} ${width / 2},${strokeWidth}`; path += `S${strokeWidth},${height * 0.3} ${strokeWidth},${height * 0.3}`; path += `L${width / 2} ${height - strokeWidth} Z`; return path; }; return ( <>
{defsContent}
); }; register({ shape: "custom-react-sector", width: 80, height: 70, effect: ["data"], component: component, }); // 左侧连接桩 Graph.registerPortLayout("sectorLeft", (portsPositionArgs, elemBBox) => { return portsPositionArgs.map((item) => { return { ...item, position: { x: elemBBox.width / 4, y: elemBBox.height / 2, }, }; }); }); // 右侧连接桩 Graph.registerPortLayout("sectorRight", (portsPositionArgs, elemBBox) => { return portsPositionArgs.map((item) => { return { ...item, position: { x: elemBBox.width * (3 / 4), y: elemBBox.height / 2, }, }; }); }); const Sector: CompoundedComponent = { name: "扇形", icon: require("./image/sector.png"), node: { shape: "custom-react-sector", data: { label: "", ...defaultData, }, ports: { ...ports, groups: { ...ports.groups, sectorLeft: { position: "sectorLeft", attrs: { circle: { r: 4, magnet: true, stroke: "#5F95FF", strokeWidth: 1, fill: "#fff", style: { visibility: "hidden", }, }, }, }, sectorRight: { position: "sectorRight", attrs: { circle: { r: 4, magnet: true, stroke: "#5F95FF", strokeWidth: 1, fill: "#fff", style: { visibility: "hidden", }, }, }, }, }, items: [ { group: "top", args: { dy: 2, }, }, { group: "sectorRight", }, { group: "bottom", args: { dy: -2, }, }, { group: "sectorLeft", }, ], }, }, }; export default Sector;