尝试调换“L”“M”的语句,箭头跑到了父节点跟前
下午好🌅🌅🌅
本答案参考ChatGPT-3.5
针对AntV的g6库纵向的紧凑树形节点之间箭头被覆盖的问题,可以采取以下解决方案:
调整箭头大小和位置,使其不被节点或其他元素覆盖。
利用G6提供的属性adjust和offset,在绘制边时对箭头进行微调,从而避免箭头与节点重叠或相反指向。
修改后的代码如下:
G6.registerEdge('compact-vertical-tree', {
draw(cfg, group) {
const targetNodeModel = cfg.targetNode.getModel(); // 从目标节点获取模型
const edgeLabel = targetNodeModel.edgeLabel;
const lineWidth = widthByPercent(edgeLabel);
// 动态计算箭头的大小
const arrowWidth = lineWidth * 2; // 让箭头宽度是线宽的两倍
const arrowLength = 10; // 设置箭头长度
const midPoint = {
x: (cfg.startPoint.x + cfg.endPoint.x) / 2,
y: (cfg.startPoint.y + cfg.endPoint.y) / 2,
};
const endArrow = {
path: G6.Arrow.triangle(arrowWidth, arrowLength, 0),
d: 20,
fill: cfg.color || '#000',
adjust: true, // 开启箭头位置自动调整
offset: 5, // 调整箭头位置
};
// 添加边路径
const edge = group.addShape('path', {
attrs: {
path: [
['M', cfg.startPoint.x, cfg.startPoint.y],
['L', cfg.endPoint.x, cfg.endPoint.y]
],
stroke: '#000',
lineWidth: widthByPercent(edgeLabel),
endArrow,
},
name: 'edge-path',
});
if (edgeLabel) {
// 绘制边上的标签
group.addShape('text', {
attrs: {
text: edgeLabel,
fill: '#595959', // 标签字体颜色
textAlign: 'center',
textBaseline: 'middle',
x: midPoint.x - 25, // 标签的 x 坐标
y: midPoint.y, // 标签的 y 坐标稍微向上偏移避免与线重叠
},
name: 'edge-label',
});
}
return edge;
},
});
同时,需要注意在箭头的path属性中设置箭头的偏移量(offset),以及开启箭头位置自动调整(adjust),可以有效避免箭头与节点重叠或相反指向的情况发生。
该回答引用自GPT-3.5,由博主GISer Liu编写:
针对您描述的问题,您想要解决的主要问题有两个:箭头被覆盖和箭头指向相反。以下是我对问题的分析和解决方案:
zIndex
属性,确保它们位于其他元素的上方。cfg.startPoint
是父节点的位置,而 cfg.endPoint
是子节点的位置。const midPoint = {
x: (cfg.startPoint.x + cfg.endPoint.x) / 2,
y: (cfg.startPoint.y + cfg.endPoint.y) / 2,
};
const edge = group.addShape('path', {
attrs: {
path: [
['M', cfg.startPoint.x, cfg.startPoint.y],
['L', cfg.endPoint.x, cfg.endPoint.y]
],
stroke: '#000',
lineWidth: widthByPercent(edgeLabel),
endArrow,
zIndex: 1, // 确保箭头位于其他元素上方
},
name: 'edge-path',
});
请注意,这只是示例代码,具体的调整可能需要根据您的实际情况进行调整和修改。如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑