Skip to content

Python で PlantUML の作図を行う

Plantweb は Python ベースで PlantUML ライクな作図を実行出来るツールです。 今回は Plantweb を使って作図する方法をメモしておきます。

検証環境

対象 バージョン
macOS 14.5
Python 3.11.9

インストール

plantweb を pip でインストールします。 今回は uv を使ってインストールします。

uv pip install plantweb

基本的な使い方

plantweb を実行する為の入力ファイルを作成します。 今回は以下の内容にしました。

sample.dot
1
2
3
4
5
@startdot
digraph one_node_graph {
   node1 -> node2 -> node3
}
@enddot

作成した .dot ファイルを引数に plantweb を実行します。 オプションを指定しない場合、SVG 形式で出力されます。

# plantweb sample.dot
Writing output for /path/to/sample.dot to sample.svg

具体的には以下の画像が出力されました。

file

PNG 形式で出力する

PNG 形式で出力したい場合は --format png オプションを指定します。

plantweb --format png sample.dot

入出力例

サンプル 1

入力

@startuml test

node "node1" {
    agent "Gi2" as node1.Gi2
}

node "node2" {
    agent "Gi1" as node2.Gi1
    agent "Gi2" as node2.Gi2
}

node "node3" {
    agent "Gi1" as node3.Gi1
    agent "Gi2" as node3.Gi2
}

node "node4" {
    agent "Gi1" as node4.Gi1
    agent "Gi2" as node4.Gi2
}

node "node5" {
    agent "Gi2" as node5.Gi1
}

node1.Gi2 - node2.Gi1
node2.Gi2 - node3.Gi1
node3.Gi2 - node4.Gi1
node4.Gi2 - node5.Gi1

@enduml

出力

file

サンプル 2

入力

@startuml
nwdiag {
  network NW1 {
      address = "10.0.1.x/24"
      node1 [address = "10.0.1.1"];
      node2 [address = "10.0.1.2"];
  }
  network NW2 {
      address = "10.0.2.x/24"
      node2 [address = "10.0.2.2"];
      node3 [address = "10.0.2.3"];
  }
  network NW3 {
      address = "10.0.3.x/24"
      node3 [address = "10.0.3.3"];
      node4 [address = "10.0.3.4"];
  }
  network NW4 {
      address = "10.0.4.x/24"
      node4 [address = "10.0.4.4"];
      node5 [address = "10.0.4.5"];
  }
}
@enduml

出力

file

サンプル 3

入力

digraph finite_state_machine {
    rankdir=LR;
    size="8,5"
    node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
    node [shape = circle];
    LR_0 -> LR_2 [ label = "SS(B)" ];
    LR_0 -> LR_1 [ label = "SS(S)" ];
    LR_1 -> LR_3 [ label = "S($end)" ];
    LR_2 -> LR_6 [ label = "SS(b)" ];
    LR_2 -> LR_5 [ label = "SS(a)" ];
    LR_2 -> LR_4 [ label = "S(A)" ];
    LR_5 -> LR_7 [ label = "S(b)" ];
    LR_5 -> LR_5 [ label = "S(a)" ];
    LR_6 -> LR_6 [ label = "S(b)" ];
    LR_6 -> LR_5 [ label = "S(a)" ];
    LR_7 -> LR_8 [ label = "S(b)" ];
    LR_7 -> LR_5 [ label = "S(a)" ];
    LR_8 -> LR_6 [ label = "S(b)" ];
    LR_8 -> LR_5 [ label = "S(a)" ];
}

出力

file

サンプル 4

入力

@startuml

nwdiag {
  group nightly {
    color = "#FFAAAA";
    description = "<&clock> Restarted nightly <&clock>";
    web02;
    db01;
  }
  network dmz {
      address = "210.x.x.x/24"

      user [description = "<&person*4.5>\n user1"];
      // set multiple addresses (using comma)
      web01 [address = "210.x.x.1, 210.x.x.20",  description = "<&cog*4>\nweb01"]
      web02 [address = "210.x.x.2",  description = "<&cog*4>\nweb02"];

  }
  network internal {
      address = "172.x.x.x/24";

      web01 [address = "172.x.x.1"];
      web02 [address = "172.x.x.2"];
      db01 [address = "172.x.x.100",  description = "<&spreadsheet*4>\n db01"];
      db02 [address = "172.x.x.101",  description = "<&spreadsheet*4>\n db02"];
      ptr  [address = "172.x.x.110",  description = "<&print*4>\n ptr01"];
  }
}
@enduml

出力

file

参考

plantweb のヘルプ表示

$ plantweb --help
usage: plantweb [-h] [-v] [--version] [--engine {auto,plantuml,graphviz,ditaa}] [--format {auto,svg,png}]
                [--server SERVER] [--no-cache] [--cache-dir CACHE_DIR]
                sources [sources ...]

Python client for the PlantUML server

positional arguments:
  sources               source files to render

options:
  -h, --help            show this help message and exit
  -v, --verbose         increase verbosity level
  --version             show program's version number and exit
  --engine {auto,plantuml,graphviz,ditaa}
                        engine to use to render diagram
  --format {auto,svg,png}
                        diagram export format
  --server SERVER       server to use for rendering
  --no-cache            do not use cache
  --cache-dir CACHE_DIR
                        directory to store cached renders