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 (
<>
>
);
};
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;