PlantUML中如何让连线穿过隐藏组件以保持直线?
PlantUML网格布局中让连线穿过隐藏组件的实现方法
问题场景
我通过隐藏连线([hidden])强制组件形成3×3网格布局,基础代码如下:
@startuml A1 -r[hidden]- A2 A2 -r[hidden]- A3 B1 -r[hidden]- B2 B2 -r[hidden]- B3 C1 -r[hidden]- C2 C2 -r[hidden]- C3 A1 -d[hidden]- B1 B1 -d[hidden]- C1 A2 -d[hidden]- B2 B2 -d[hidden]- C2 A3 -d[hidden]- B3 B3 -d[hidden]- C3 @enduml
当动态分配组件并隐藏未使用的网格位置(如B2),同时添加A2到C2的连线时,连线会绕路而非直线穿过目标位置:
@startuml A1 -r[hidden]- A2 A2 -r[hidden]- A3 B1 -r[hidden]- B2 B2 -r[hidden]- B3 C1 -r[hidden]- C2 C2 -r[hidden]- C3 A1 -d[hidden]- B1 B1 -d[hidden]- C1 A2 -d[hidden]- B2 B2 -d[hidden]- C2 A3 -d[hidden]- B3 B3 -d[hidden]- C3 Hide B2 A2 -d[norank]- C2 @enduml
需要在维持原有网格结构的前提下,让连线忽略隐藏组件,直接以直线穿过。
解决方案
方案1:切换到Smetana布局引擎
PlantUML的Smetana布局引擎对隐藏节点的路径处理更友好,能自动让连线穿过隐藏组件,同时保留网格的位置结构。只需在代码开头添加布局指令:
@startuml !pragma layout smetana A1 -r[hidden]- A2 A2 -r[hidden]- A3 B1 -r[hidden]- B2 B2 -r[hidden]- B3 C1 -r[hidden]- C2 C2 -r[hidden]- C3 A1 -d[hidden]- B1 B1 -d[hidden]- C1 A2 -d[hidden]- B2 B2 -d[hidden]- C2 A3 -d[hidden]- B3 B3 -d[hidden]- C3 Hide B2 A2 -d- C2 @enduml
方案2:强制连线为直线
如果不想切换布局引擎,可以在连线时添加straight参数,强制连线以直线绘制,忽略路径上的隐藏组件,同时保留norank避免布局层级混乱:
@startuml A1 -r[hidden]- A2 A2 -r[hidden]- A3 B1 -r[hidden]- B2 B2 -r[hidden]- B3 C1 -r[hidden]- C2 C2 -r[hidden]- C3 A1 -d[hidden]- B1 B1 -d[hidden]- C1 A2 -d[hidden]- B2 B2 -d[hidden]- C2 A3 -d[hidden]- B3 B3 -d[hidden]- C3 Hide B2 A2 -d[straight,norank]- C2 @enduml
内容的提问来源于stack exchange,提问作者GBot
相关产品推荐
相关产品推荐

