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 getD = (width: number, height: number) => {
let path = `
M ${width / 2} ${strokeWidth}
L ${width * 0.62},${height * 0.38}
L ${width - strokeWidth},${ height * 0.38}
L ${width * 0.7},${height * 0.62}
L ${width * 0.82},${height - strokeWidth}
L ${width / 2},${ height * 0.76}
L ${width * 0.18},${height - strokeWidth}
L ${width * 0.3},${height * 0.62}
L ${strokeWidth},${height * 0.38}
L ${width * 0.38},${ height * 0.38}
L ${width / 2},${strokeWidth} Z
`;
return path;
};
return (
<>
>
);
};
register({
shape: "custom-react-fiveStar",
width: 90,
height: 90,
effect: ["data"],
component: component,
});
// 左侧连接桩
Graph.registerPortLayout("fiveStarLeft", (portsPositionArgs, elemBBox) => {
return portsPositionArgs.map((item) => {
return {
...item,
position: {
x: 0,
y: elemBBox.height * 0.4,
},
};
});
});
// 右侧连接桩
Graph.registerPortLayout("fiveStarRight", (portsPositionArgs, elemBBox) => {
return portsPositionArgs.map((item) => {
return {
...item,
position: {
x: elemBBox.width,
y: elemBBox.height * 0.4,
},
};
});
});
const FiveStar: CompoundedComponent = {
name: "五角星",
icon: require("./image/pentagon.png"),
node: {
shape: "custom-react-fiveStar",
data: {
label: "",
...defaultData,
},
ports: {
...ports,
groups: {
...ports.groups,
fiveStarLeft: {
position: "fiveStarLeft",
attrs: {
circle: {
r: 4,
magnet: true,
stroke: "#5F95FF",
strokeWidth: 1,
fill: "#fff",
style: {
visibility: "hidden",
},
},
},
},
fiveStarRight: {
position: "fiveStarRight",
attrs: {
circle: {
r: 4,
magnet: true,
stroke: "#5F95FF",
strokeWidth: 1,
fill: "#fff",
style: {
visibility: "hidden",
},
},
},
},
},
items: [
{
group: "top",
args: {
dy: 2,
},
},
{
group: "fiveStarLeft",
},
{
group: "bottom",
args: {
dy: -2,
},
},
{
group: "fiveStarRight",
},
],
},
},
};
export default FiveStar;