【问题标题】:How to align blocks in PlantUML class diagrams?如何对齐 PlantUML 类图中的块?
【发布时间】:2012-07-19 09:05:12
【问题描述】:

我正在使用 PlantUML 制作简单的类图,该工具非常棒,但除了将它们放入包中或使用 Alice -left-* Bob 之类的关系外,我找不到任何方法将类相互对齐。我需要的是这样的:

@startuml  
class Bob  
class Alice  
class Dan  
**Dan aligned Alice: horizontally**  
'or using a grid?  
**Bob at grid (2, 3)**  
@enduml

有办法吗?

【问题讨论】:

    标签: uml plantuml


    【解决方案1】:

    使用-[hidden] 关系可以完成这项工作:

    @startuml  
    class Bob  
    class Alice  
    class Dan  
    class Foo
    class Bar
    class Foobar
    
    Bob -[hidden] Alice
    Bar -[hidden] Foobar
    @enduml
    

    【讨论】:

      【解决方案2】:

      2019 年 8 月 8 日更新

      来自Rotsiser的评论,通过将改变行的长度与关键字组合在一起,它可以对齐元素

      @startuml
      class A
      A ..> B
      C ---> B
      D ...> B
      together {
          class E
          class F
          class G
      }
      E ----> B
      @enduml
      


      过时

      您可以通过更改行字符数来对齐元素,例如“-”、“.”等。

      @startuml
      class A
      A ..> B
      C ---> B
      D ...> B
      E ----> B
      F ----> B
      G ----> B
      @enduml
      

      【讨论】:

      • 这不会对齐项目,它会增加连接器的长度。仍然有帮助,但不是我想要的。
      • 将此与建议使用 together 关键字的其他答案结合起来,我得到了很好的结果。
      • Rotsiser 的回答是正确的,classes 可以用 together 关键字对齐
      • 当您需要在相同方向的相同两个组件之间添加多个箭头并且需要每个连接产生一个箭头时,更改线长度也有效。 Plantuml 默认只创建一个箭头。就我而言,我需要几个箭头,每个箭头都有不同的标签
      • 一旦类填充了不同数量的项目,这种方法就不起作用
      【解决方案3】:

      不,没有办法做到这一点,抱歉 :( PlantUML 背后的理念是你不应该太在意布局渲染。

      实际上,PlantUML 的早期版本使用对齐类,但这是一个问题:当有许多不相关的类时,图表往往会变得非常大而且非常薄。所以添加了一个补丁来组织正方形中的类。

      您希望图表中有多少类?当然可以禁用组织补丁,例如3到5节课。您可以向the forum 发表建议,看看其他用户对此有何看法。

      【讨论】:

      • 我想到了一个不难实现的替代方案:添加“组”,它允许以与“包”或“命名空间”相同的方式对多个对象进行分组(但有是没有框架)。这可以有其他选项,例如“水平”或“垂直”,但这并不重要。重要的是,我们应该能够在整个图表完成后对类进行分组,只需添加“group { Bob Alice Animals.Cat}”,这将迫使类彼此靠近。
      【解决方案4】:

      这里有一个解决方案。

      文档: "It is also possible to change arrow direction by adding left, right, up or down keywords inside the arrow:"

      @startuml
      foo -left-> dummyLeft 
      foo -right-> dummyRight 
      foo -up-> dummyUp 
      foo -down-> dummyDown
      @enduml
      

      你的问题:

      @startuml
      class Bob
      class Alice
      class Dan
      Alice -left[hidden]-> Bob
      Alice -right[hidden]-> Dan 
      @enduml
      

      它也可能有用:

      @startuml
      class Bob
      class Alice
      class Dan
      Bob -right-|> Alice
      Alice -right-> Dan
      interface Friend
      Dan -up..> Friend
      interface Person
      Friend -left-> Person
      interface Object
      Person -down-> Object
      interface Native
      Object -right-> Native
      @enduml
      

      【讨论】:

      • 一旦类填充了不同数量的项目,这种方法就不起作用
      【解决方案5】:

      更简洁的方法是将它们放在一个隐藏的包中,这样更符合逻辑。

      @startuml
      
      skinparam shadowing false
      skinparam package<<Layout>> {
        borderColor Transparent
        backgroundColor Transparent
        fontColor Transparent
        stereotypeFontColor Transparent
      }
      
      package x <<Layout>>{ 
          class A
          class B
      } 
      A .. D
      B .. C
      C .. D
      
      A1 .. D1
      B1 .. C1
      C1 .. D1
      
      @end
      

      【讨论】:

      • 这不是对@Yuriy Kulikov 问题的回应:水平对齐两个以上的类。无论如何,不​​错的主题。
      • :我以为这就是他想要的。尤里·库利科夫为我们解决这个问题。 :) @freezed : 你能根据你画出预期输出的图表/草图吗?
      • 一旦类填充了不同数量的项目,这种方法就不起作用了。
      【解决方案6】:

      您不需要hidden package,使用together 关键字:

      together {
      class A
      class B
      }
      

      【讨论】:

      • 将此与另一个建议更改箭头链接中的行数的答案结合起来,我得到了很好的结果。
      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      相关资源
      最近更新 更多