如何用D2绘图语言在两个柱形节点间实现指定布局的形状渲染?
实现D2中自定义分区布局的方案
完全可以在D2中实现你想要的自定义布局,以下是针对不同引擎的具体实现方式:
ELK引擎(推荐)
ELK引擎提供了最精细的布局控制能力,能完美匹配你的需求:
- 水平对齐磁盘节点:通过设置节点的垂直坐标(
y值)一致,或者利用ELK的对齐约束,让nvme0n1和nvme1n1保持水平对齐。 - 中间容器垂直排列:将
RAID1、RAID0、SWAP0、SWAP1设置为同一水平坐标(x值),并依次设置递增的垂直坐标,让它们形成一列;也可以将这些节点放入一个垂直布局的容器中,自动实现垂直排列。 - 直线连线:ELK默认支持直线连线,只需确保源节点的出口端口与目标节点的入口端口在同一轴线上(比如给磁盘分区设置
port: right,RAID容器设置port: left),即可让连线保持直线。
原生布局指令(兼容多引擎)
如果不想依赖ELK,也可以通过D2的原生属性强制控制布局:
- 给
nvme0n1和nvme1n1设置相同的y坐标,比如:nvme0n1: {shape: cylinder, y: 0} nvme1n1: {shape: cylinder, y: 0} - 给中间的容器节点设置统一的
x坐标,按垂直方向依次排布:RAID1: {x: 250, y: 0} RAID0: {x: 250, y: 160} SWAP0: {x: 250, y: 320} SWAP1: {x: 250, y: 480} - 给连线添加直线样式:
nvme0n1.p1 -> RAID1: {style.stroke: straight}
完整示例代码
layout: elk elk: algorithm: box # 更适合规整布局的算法 nvme0n1: {shape: cylinder, y: 0, width: 120} nvme0n1.p1 -> RAID1: {style.stroke: straight} nvme0n1.p3 -> RAID0: {style.stroke: straight} nvme1n1: {shape: cylinder, y: 0, x: 500, width: 120} nvme1n1.p1 -> RAID1: {style.stroke: straight} nvme1n1.p3 -> RAID0: {style.stroke: straight} RAID1: {x: 250, y: 0, width: 100} RAID0: {x: 250, y: 160, width: 100} SWAP0: {x: 250, y: 320, width: 100} SWAP1: {x: 250, y: 480, width: 100}
内容的提问来源于stack exchange,提问作者djsumdog
相关产品推荐
相关产品推荐

