antvis/G6

为什么在自定义边中的afterDraw中第一次渲染取不到正确的中点坐标(附代码、截图) #4628

lovelyGFR posted onGitHub

问题描述

export const customEdgeConfig = {
    afterDraw(cfg, group) {
        const startPoint = cfg.startPoint;
        const endPoint = cfg.endPoint;

        // 计算中点的坐标
        const midX = (startPoint.x + endPoint.x) / 2;
        const midY = (startPoint.y + endPoint.y) / 2;

        // 绘制圆
        const edgeGroup = group.addShape('circle', {
            attrs: {
                x: midX,
                y: midY,
                r: 12,
                fill: 'white'
            }
        });

        group.addShape('circle', {
            attrs: {
                x: midX,
                y: midY,
                r: 10,
                fill: 'blue'
            }
        });

        // 绘制数字
        group.addShape('text', {
            attrs: {
                x: midX,
                y: midY,
                text: cfg.label, // 要显示的数字
                fill: 'white',
                textAlign: 'center',
                textBaseline: 'middle',
                fontSize: 12
            }
        });

        return edgeGroup;
    }
};

export const customLayout = {
    execute() {
        const { nodes, center, height } = this;
        const [centerX, centerY] = center;
        const centerNode = find(nodes, (node) => node.state === 'center'); // 中间节点
        const leftNodes = filter(nodes, (node) => node.state === 'left'); // 左边节点
        const rightNodes = filter(nodes, (node) => node.state === 'right'); // 右边节点

        centerNode.x = centerX - NODE_WIDTH / 2;
        centerNode.y = centerY - NODE_HEIGHT / 2;

        // 设置左边节点的布局位置
        forEach(leftNodes, (node, i) => {
            node.x = centerX - NODE_X_SPACE - NODE_WIDTH * 1.5; // 设置 x 坐标
            const nodeY =
                (height / size(leftNodes)) * (i + 0.5) +
                (i - (size(leftNodes) - 1) / 2) * NODE_Y_SPACE;
            node.y = nodeY - NODE_HEIGHT / 2; // 设置 y 坐标
        });

        // 设置右边节点的布局位置
        forEach(rightNodes, (node, i) => {
            node.x = centerX + NODE_X_SPACE + NODE_WIDTH * 0.5; // 设置 x 坐标
            const nodeY =
                ((i + 0.5) * height) / size(rightNodes) +
                (i - (size(rightNodes) - 1) / 2) * NODE_Y_SPACE;
            node.y = nodeY - NODE_HEIGHT / 2; // 设置 y 坐标
        });
    }
};

G6.registerEdge('custom-edge', customEdgeConfig, 'cubic-horizontal');
G6.registerLayout('custom-layout', customLayout);


const containerGraph = new G6.Graph({
    renderer: 'svg',
    container,
    width: container.offsetWidth,
    height: container.offsetHeight,
    layout: {
        type: 'custom-layout'
    },
    defaultNode: {
        type: 'modelRect',
        preRect: false,
        size: [200, 40]
    },
    defaultEdge: {
        type: 'custom-edge'
    },
    modes: {
        default: ['drag-canvas']
    }
});

重现链接

https://g6.antv.antgroup.com/examples/item/customEdge/#extraShape

重现步骤

不清楚是不是布局的时候出了问题,但节点的布局是正确的

预期行为

期望可以得到每条边的中点坐标,但控制台打印所有边的坐标都是一样的,第二次进入画布才显示了正确的坐标

平台

  • 操作系统: [macOS, Windows, Linux, React Native ...]
  • 网页浏览器: [Google Chrome, Safari, Firefox]
  • G6 版本: [4.5.1 ... ]

屏幕截图或视频(可选)

<img width="522" alt="image" src="https://github.com/antvis/G6/assets/48376890/678ccd89-7468-4e50-b24d-0076bf5b6b74"> <img width="425" alt="image" src="https://github.com/antvis/G6/assets/48376890/5d6eb078-ad8f-4c47-9329-6ca289785e53"> <img width="1067" alt="image" src="https://github.com/antvis/G6/assets/48376890/38d61448-3d77-4b57-91ce-bbd1f880bfab">

补充说明(可选)

烦请指点


给个在线复现 demo 看看。初步判断是第一次进入 afterDraw 的时候布局还没有完成,两端节点还没有位置所以边也是拿不到位置的。不清楚你这里说的第二次进入画布是怎么操作的

posted by Yanyan-Wang almost 2 years ago

给个在线复现 demo 看看。初步判断是第一次进入 afterDraw 的时候布局还没有完成,两端节点还没有位置所以边也是拿不到位置的。不清楚你这里说的第二次进入画布是怎么操作的

那如何确保进入 afterDraw 的时候布局完成了呢。第二次就是组件销毁后再次点击进入,画布是在组件里面的

posted by lovelyGFR almost 2 years ago

如果你目的就是在边中间绘制一个图形的话,可以在 afterUpdate 中去更新一下那个额外的图形,afterUpdate 中应该可以拿到布局后的位置

posted by Yanyan-Wang almost 2 years ago

如果你目的就是在边中间绘制一个图形的话,可以在 afterUpdate 中去更新一下那个额外的图形,afterUpdate 中应该可以拿到布局后的位置

哇库哇库,谢谢小姐姐~

posted by lovelyGFR almost 2 years ago

球仓库右上角点亮一下 star~

posted by Yanyan-Wang almost 2 years ago

球仓库右上角点亮一下 star~

之前就点过啦~

posted by lovelyGFR almost 2 years ago

Fund this Issue

$0.00
Funded

Pull requests