shiracamus
@shiracamus (しらかみゅ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

plantumlで遠回り曲線になってしまうのを直線にする方法を教えてください

Q&A

Closed

解決したいこと

plantumlで図を描いているのですが、直線で線を引いて欲しいところが、大回りする曲線で描画されてしまいます。
直線で引くようにする方法はありますでしょうか?

発生している問題・エラー

plantumlコードを書いて図を生成すると、以下に示す図のように

  • Webブラウザ から web:80 への線
  • JavaScript(GET) から api:8888 への線

の接続線が直線にならなくて悩んでいます。

該当するソースコード

以下のコードをQiitaの投稿欄やコメント欄にコピー&ペーストして、先頭に ```:plantuml を、最終行に ``` を追加してプレビューすれば、図に変換されます。

@startuml

actor "利用者" as user

card Client {
  package "Webクライアント" as webc {
    component "Webブラウザ" as browser
    file "HTML\n(GET)" as htmlget
    component "JavaScript\n(GET)" as jsget
  }
}

card Server {
  package "DBサーバ" as dbs {
    database "data"
  }
  package "APIサーバ" as apis {
    component "APIサービス" as service
    interface "api:8888" as api
    interface "websocket:8889" as ws
  }
  package "Webサーバ" as webs {
    interface "web:80" as web
    file "HTML" as html
    component "JavaScript" as js
  }
}

webs --[hidden] apis

user - browser
browser - web
web - html
html - js

browser -- htmlget
htmlget - jsget
jsget - api
jsget -d- ws

api - service
ws -u- service
service - dbs

@enduml

自分で試したこと

together を使ってグループ化してみたり、線の向きを逆にしたりしてみたりしましたが、直線になってくれませんでした。
webs --[hidden] apis をコメントアウトすると、横並びになって問題の個所が曲線になっていて、コメントを外すと縦並びになるけど曲線属性がそのままなんだろうなぁ、と実装および動作を予測はできるのですが・・・

よろしくお願いします。

0

2Answer

left to right direction にして together も指定して望む配置になりました。
デフォルトが top to down direction で、接続点に対して上から接続しようとするのが大回り曲線になる理由かもしれませんね。

@startuml

left to right direction

together {
  actor "利用者" as user

  card Client {
    package "Webクライアント" as webclient {
      component "Webブラウザ" as browser
      file "HTML\n(GET)" as htmlget
      component "JavaScript\n(GET)" as jsget
      browser - htmlget
      htmlget -- jsget
    }
  }

  card Server {
    package "Webサーバ" as webserver {
      together {
        interface "web:80" as web
        file "HTML" as html
        component "JavaScript" as js
        web -- html
        html -- js
      }
    }
    package "APIサーバ" as apis {
      together {
        interface "api:8888" as api
        component "APIサービス" as service
        interface "websocket:8889" as ws
        api -- service
        ws -- service
      }
    }
    package "DBサーバ" as dbs {
      database "data"
    }
    service -- dbs
  }

  user -- browser
  browser -- web
  jsget -- api
  jsget - ws
}

@enduml
2Like

更に試行錯誤をしていたところ、package同士を hidden で結ぶのではなく、内部のinterface 同士を結ぶことで大回り曲線にならなくなりました。

@startuml

actor "利用者" as user

card Client {
  package "Webクライアント" as webc {
    component "Webブラウザ" as browser
    file "HTML\n(GET)" as htmlget
    component "JavaScript\n(GET)" as jsget
  }
}

card Server {
  package "DBサーバ" as dbs {
    database "data"
  }
  package "APIサーバ" as apis {
    together {
      component "APIサービス" as service
      interface "api:8888" as api
      interface "websocket:8889" as ws
    }
  }
  package "Webサーバ" as webs {
     together {
       interface "web:80" as web
       file "HTML" as html
       component "JavaScript" as js
    }
  }
}

web --[hidden] api
api --[hidden] ws

user - browser
browser - web
web - html
html - js

browser -- htmlget
htmlget - jsget
jsget - api
jsget - ws

api - service
ws -u- service
service - dbs

@enduml
1Like

Your answer might help someone💌