wujingjing
2024-04-22 f106e4dffb8279cb90726e83e7edd631f4c77699
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*!
 * @author claude
 * date 06/09/2020
 * 注册边
 */
 
import G6 from '@antv/g6'
 
export default (g6: typeof G6, cfg) => {
  g6.registerEdge('hvh-h-edge', {
    draw(cfg, group) {
      const xOffset = 40
      const { startPoint, endPoint } = cfg
      const Ydiff = endPoint.y - startPoint.y
      // 水平结束点坐标
      const horizontalEndPoint = {
        x: startPoint.x,
        y: endPoint.y
      }
      // 开口方向
      const left = startPoint.x - endPoint.x > 0
      const path =
        Ydiff === 0
          ? [
              ['M', startPoint.x, startPoint.y],
              ['L', endPoint.x, endPoint.y]
            ]
          : [
              ['M', startPoint.x, startPoint.y],
              ['L', left ? startPoint.x - xOffset : startPoint.x + xOffset, startPoint.y],
              [
                'L',
                left ? horizontalEndPoint.x - xOffset : horizontalEndPoint.x + xOffset,
                endPoint.y > startPoint.y ? horizontalEndPoint.y - 10 : horizontalEndPoint.y + 10
              ],
              [
                'Q',
                left ? horizontalEndPoint.x - xOffset : horizontalEndPoint.x + xOffset,
                horizontalEndPoint.y,
                left ? horizontalEndPoint.x - xOffset - 10 : horizontalEndPoint.x + xOffset + 10,
                horizontalEndPoint.y
              ],
              ['L', endPoint.x, endPoint.y]
            ]
 
      // 获取边的样式
      const { edgeStyle } = (cfg.sourceNode as any).getModel()
      const shape = group.addShape('path', {
        attrs: {
          path,
          stroke: '#1890FF',
          endArrow: false,
          ...cfg.style,
          ...edgeStyle
        },
        name: 'hvh-edge',
        // 设置 draggable 以允许响应鼠标的图拽事件
        draggable: true
      })
 
      const { text } = (cfg.targetNode as any).getModel()
 
      if (text) {
        const label = group.addShape('text', {
          attrs: {
            x: horizontalEndPoint.x + xOffset + 10, // 居中
            y: endPoint.y - 30,
            text: text || '',
            fill: '#333',
            fontSize: 16
          },
          name: 'hvh-edge-label',
          zIndex: 10
        })
 
        group.sort()
        label.toFront()
      }
      return shape
    },
    ...cfg
  })
}