【PlantUML】フローチャートを描いてみる

こちらのサイトではDRUPAL10に関連する記事を掲載しています。

本記事はPlantUMLのマニュアルから引用しています

新しいアクティビティ図のベータ版の構文と機能
新しい構文は、より一貫性があります。あなたがループしながら、ループ、ノート、パーティションを繰り返し、ラベル、条件を、スタートを持って停止することができます。フォントや色を変更することも可能です。

単純なアクティビティ

アクティビティのラベルは:で開始し;で終了します。

テキストの書式設定は、Creole記法のWiki構文を使用して行うことができます。

それらは定義順に暗黙的にリンクされます。

@startuml:Hello world;:This is defined onseveral **lines**;@enduml

開始/終了

図の開始と終了を示すために、キーワードstartstopを使用できます。

@startumlstart:Hello world;:This is defined onseveral **lines**;stop@enduml

キーワード end もまた使用できます。

@startumlstart:Hello world;:This is defined onseveral **lines**;end@enduml

条件文

図に条件分岐を追加したい場合は、キーワードifthenそしてelseを使用することができます。ラベルは括弧を使用することで与えることができます。

3種類の構文を使うことができます。

  • if (...) then (...)
@startumlstartif (Graphviz installed?) then (yes):process all\ndiagrams;else (no):process only__sequence__ and __activity__ diagrams;endifstop@enduml
  • if (...) is (...) then
@startumlif (color?) is (<color:red>red) then:print red;else:print not red;@enduml
  • if (...) equals (...) then
@startumlif (counter?) equals (5) then:print 5;else:print not 5;@enduml

[Ref.QA-301]

複数条件(水平モード)

いくつもの条件分岐がある場合には、キーワードelseifを使用できます。(デフォルトで水平モードになります):

@startumlstartif (condition A) then (yes):Text 1;elseif (condition B) then (yes):Text 2;stop(no) elseif (condition C) then (yes):Text 3;(no) elseif (condition D) then (yes):Text 4;else (nothing):Text else;endifstop@enduml

複数条件(垂直モード)

!pragma useVerticalIf onコマンドを使用すると、垂直モードの分岐になります:

@startuml!pragma useVerticalIf onstartif (condition A) then (yes):Text 1;elseif (condition B) then (yes):Text 2;stopelseif (condition C) then (yes):Text 3;elseif (condition D) then (yes):Text 4;else (nothing):Text else;endifstop@enduml

コマンドラインオプション-Pを使用してpragmaを指定することもできます: java -jar plantuml.jar -PuseVerticalIf=on

[Refs.QA-3931,issue-582]

スイッチとケース [switch, case, endswitch]

switch ,case,endswitch キーワードを使って、図の中にスイッチを入れることができます。

ラベルは括弧を使って提供できます。

@startumlstartswitch (test?)case ( condition A ):Text 1;case ( condition B ):Text 2;case ( condition C ):Text 3;case ( condition D ):Text 4;case ( condition E ):Text 5;endswitchstop@enduml

アクションの停止を伴う条件文 [kill, detach]

if 節内でアクションを停止できます。

@startumlif (condition?) then:error;stopendif#palegreen:action;@enduml

ただし、明確なアクションで停止したい場合は、キーワード「kill」または「detach」を使用できます:

  • kill
@startumlif (condition?) then#pink:error;killendif#palegreen:action;@enduml

[Ref.QA-265]

  • detach
@startumlif (condition?) then#pink:error;detachendif#palegreen:action;@enduml

繰り返し(後判定)

繰り返し処理(後判定)がある場合には、キーワードrepeatrepeat whileを使用できます。

@startumlstartrepeat:read data;:generate diagrams;repeat while (more data?)stop@enduml

アクティビティをrepeatの戻り先にすることもできます。また、backwardキーワードを使用して、戻りのパスにアクティビティを挿入することもできます。

@startumlstartrepeat :foo as starting label;:read data;:generate diagrams;backward:This is backward;repeat while (more data?)stop@enduml

repeat 節を中断する [break]

アクションの後でbreakキーワードを使うと、ループを中断することができます。

@startumlstartrepeat:Test something;if (Something went wrong?) then (no)#palegreen:OK;breakendif->NOK;:Alert "Error with long text";repeat while (Something went wrong with long text?) is (yes) not (no)->//merged step//;:Alert "Success";stop@enduml

[Ref.QA-6105]

Goto and Label Processing [label, goto]

⚠ It is currently only experimental 🚧

You can use label and goto keywords to denote goto processing, with:

  • label <label_name>
  • goto <label_name>
@startumltitle Point two queries to same activity\nwith `goto`startif (Test Question?) then (yes)'space label only for alignmentlabel sp_lab0label sp_lab1'real labellabel lab:shared;else (no)if (Second Test Question?) then (yes)label sp_lab2goto sp_lab1else:nonShared;endifendif:merge;@enduml

[Ref.QA-15026,QA-12526 and initiallyQA-1626]

繰り返し(前判定)

繰り返し処理(前判定)がある場合には、キーワードwhileendwhileを使用できます。

@startumlstartwhile (data available?):read data;:generate diagrams;endwhilestop@enduml

キーワードendwhileの後ろ、または、 キーワードisを使用することで、ラベルを与えることができます。

@startumlwhile (check filesize ?) is (not empty):read file;endwhile (empty):close file;@enduml

detachを使用して無限ループを作る場合は、-[hidden]->を使用して不要な矢印を隠すと良いでしょう。

@startuml:Step 1;if (condition1) thenwhile (loop forever):Step 2;endwhile-[hidden]->detachelse:end normally;stopendif@enduml

並列処理

キーワードforkfork againそしてend forkまたはend mergeを使用して、並列処理を記述することができます。

単純なfork

@startumlstartfork:action 1;fork again:action 2;end forkstop@enduml

end mergeを使ったfork

@startumlstartfork:action 1;fork again:action 2;end mergestop@enduml

[Ref.QA-5320]

@startumlstartfork:action 1;fork again:action 2;fork again:action 3;fork again:action 4;end mergestop@enduml
@startumlstartfork:action 1;fork again:action 2;endend mergestop@enduml

[Ref.QA-13731]

end forkのラベル、またはjoin仕様(UML joinspec):

@startumlstartfork:action A;fork again:action B;end fork {or}stop@enduml
@startumlstartfork:action A;fork again:action B;end fork {and}stop@enduml

[Ref.QA-5346]

その他の例

@startumlstartif (multiprocessor?) then (yes)fork:Treatment 1;fork again:Treatment 2;end forkelse (monoproc):Treatment 1;:Treatment 2;endif@enduml

処理の分岐

Split

splitsplit againend splitキーワードを使って、プロセスの分岐を表すことができます。
@startumlstartsplit:A;split again:B;split again:C;split again:a;:b;end split:D;end@enduml

入力の分岐(複数開始)

入力の分岐を表現するには、hiddenで矢印を隠します。

@startumlsplit-[hidden]->:A;split again-[hidden]->:B;split again-[hidden]->:C;end split:D;@enduml
@startumlsplit-[hidden]->:A;split again-[hidden]->:a;:b;split again-[hidden]->(Z)end split:D;@enduml

[Ref.QA-8662]

出力の分岐(複数終了)

出力の分岐を表現するには、killまたはdetachを使用します。

@startumlstartsplit:A;killsplit again:B;detachsplit again:C;killend split@enduml
@startumlstartsplit:A;killsplit again:b;:c;detachsplit again(Z)detachsplit againendsplit againstopend split@enduml

注釈

Creole表記のWiki構文を使用することで、テキストの書式設定ができます。

キーワード floating を使用し、注釈を遊離させることもできます。

@startumlstart:foo1;floating note left: This is a note:foo2;note rightThis note is on several//lines// and cancontain <b>HTML</b>====* Calling the method ""foo()"" is prohibitedend notestop@enduml

戻り方向(backward)のアクティビティに注釈をつけることもできます。

@startumlstartrepeat :Enter data;:Submit;backward :Warning;note right: Noterepeat while (Valid?) is (No) not (Yes)stop@enduml

パーティションにノートを追加することもできます。

@startumlstartpartition "**process** HelloWorld" {noteThis is my note----//Creole test//end note:Ready;:HelloWorld(i)>:Hello-Sent;}@enduml

[Ref.QA-2398]

色指定

各アクティビティに、色を指定することができます。

@startumlstart:starting progress;#HotPink:reading configuration filesThese files should edited at this point!;#AAAAAA:ending of the process;@enduml

グラデーションを使用することもできます。

@startumlstartpartition #red/white testPartition {#blue\green:testActivity;}@enduml

[Ref.QA-4906]

矢印無しの線

skinparam ArrowHeadColor noneを指定すると、アクティビティの接続線を矢印無しにすることができます。

@startumlskinparam ArrowHeadColor nonestart:Hello world;:This is on defined onseveral **lines**;stop@enduml
@startumlskinparam ArrowHeadColor nonestartrepeat :Enter data;:Submit;backward :Warning;repeat while (Valid?) is (No) not (Yes)stop@enduml

矢印

記号->を用いて、矢印にテキストを添えることができ、また、色を変えることもできます。

点線、破線、太線、または、矢印なし、もまた可能です。

@startuml:foo1;-> You can put text on arrows;if (test) then-[#blue]->:foo2;-[#green,dashed]-> The text canalso be on several linesand **very** long...;:foo3;else-[#black,dotted]->:foo4;endif-[#gray,bold]->:foo5;@enduml

コネクタ

半角括弧を使用して、コネクタを記述することができます。

@startumlstart:Some activity;(A)detach(A):Other activity;@enduml

コネクタの色

コネクタにを設定することができます。

@startumlstart:The connector belowwishes he was blue;#blue:(B):This next connectorfeels that she wouldbe better off green;#green:(G)stop@enduml

[Ref.QA-10077]

グループ化(パーティション)

グループ

グループを定義して複数のアクティビティをまとめることができます:

@startumlstartgroup Initialization:read config file;:init internal variable;end groupgroup Running group:wait for user interaction;:print information;end groupstop@enduml

パーティション

パーティションを定義して複数のアクティビティをまとめることができます:

@startumlstartpartition Initialization {:read config file;:init internal variable;}partition Running {:wait for user interaction;:print information;}stop@enduml

パーティションのを変更することができます:

@startumlstartpartition #lightGreen "Input Interface" {:read config file;:init internal variable;}partition Running {:wait for user interaction;:print information;}stop@enduml

[Ref.QA-2793]

パーティションにリンクを追加することもできます:

@startumlstartpartition "[[http://plantuml.com partition_name]]" {:read doc. on [[http://plantuml.com plantuml_website]];:test diagram;}end@enduml

[Ref.QA-542]

グループ、パーティション、パッケージ、四角形、カード

  • グループ(group)、
  • パーティション(partition)、
  • パッケージ(package)、
  • 四角形(rectangle)、
  • カード(card)

を定義して複数のアクティビティをまとめることができます:

@startumlstartgroup Group:Activity;end groupfloating note: Note on Grouppartition Partition {:Activity;}floating note: Note on Partitionpackage Package {:Activity;}floating note: Note on Packagerectangle Rectangle {:Activity;}floating note: Note on Rectanglecard Card {:Activity;}floating note: Note on Cardend@enduml

スイムレーン

パイプ記号|を用いて、複数のスイムレーンを定義することができます。

さらに、スイムレーン毎にを変えることができます。

@startuml|Swimlane1|start:foo1;|#AntiqueWhite|Swimlane2|:foo2;:foo3;|Swimlane1|:foo4;|Swimlane2|:foo5;stop@enduml

スイムレーンの中で、if条件文やrepeatwhileのループを使用できます。

@startuml|#pink|Actor_For_red|startif (color?) is (red) then#pink:**action red**;:foo1;else (not red)|#lightgray|Actor_For_no_red|#lightgray:**action not red**;:foo2;endif|Next_Actor|#lightblue:foo3;:foo4;|Final_Actor|#palegreen:foo5;stop@enduml

次の構文で、スイムレーンに別名(alias)を付けることができます。

  • |[#<color>|]<swimlane_alias>| <swimlane_title>
@startuml|#palegreen|f| fisherman|c| cook|#gold|e| eater|f|start:go fish;|c|:fry fish;|e|:eat fish;stop@enduml

[Ref.QA-2681]

矢印の除去(detach, kill)

キーワードdetachまたはkillを使用して、矢印を取り除くことができます。

@startuml:start;fork:foo1;:foo2;fork again:foo3;detachendforkif (foo4) then:foo5;detachendif:foo6;detach:foo7;stop@enduml
  • kill
@startuml:start;fork:foo1;:foo2;fork again:foo3;killendforkif (foo4) then:foo5;killendif:foo6;kill:foo7;stop@enduml

SDL図

終端記号;を置き換えることで、アクティビティの表現形式を変えることができます:

  • |
  • <
  • >
  • /
  • \\
  • ]
  • }
@startuml:Ready;:next(o)|:Receiving;split:nak(i)<:ack(o)>split again:ack(i)<:next(o)on several lines|:i := i + 1]:ack(o)>split again:err(i)<:nak(o)>split again:foo/split again:bar\\split again:i > 5}stopend split:finish;@enduml

完全な例

@startumlstart:ClickServlet.handleRequest();:new page;if (Page.onSecurityCheck) then (true):Page.onInit();if (isForward?) then (no):Process controls;if (continue processing?) then (no)stopendif if (isPost?) then (yes):Page.onPost();else (no):Page.onGet();endif:Page.onRender();endifelse (false)endifif (do redirect?) then (yes):redirect process;elseif (do forward?) then (yes):Forward request;else (no):Render page template;endifendifstop@enduml

条件のスタイル

insideスタイル(デフォルト)

@startumlskinparam conditionStyle insidestartrepeat:act1;:act2;repeatwhile (<b>end):act3;@enduml
@startumlstartrepeat:act1;:act2;repeatwhile (<b>end):act3;@enduml

diamondスタイル

@startumlskinparam conditionStyle diamondstartrepeat:act1;:act2;repeatwhile (<b>end):act3;@enduml

InsideDiamond (またはfoo1)スタイル

@startumlskinparam conditionStyle InsideDiamondstartrepeat:act1;:act2;repeatwhile (<b>end):act3;@enduml
@startumlskinparam conditionStyle foo1startrepeat:act1;:act2;repeatwhile (<b>end):act3;@enduml

[Ref.QA-1290 and#400]

条件終了のスタイル

diamondスタイル(デフォルト)

  • 分岐が1つの場合
@startumlskinparam ConditionEndStyle diamond:A;if (decision) then (yes):B1;else (no)endif:C;@enduml
  • 分岐が2つ(B1, B2)の場合
@startumlskinparam ConditionEndStyle diamond:A;if (decision) then (yes):B1;else (no):B2;endif:C;@enduml@enduml

水平ライン(hline)スタイル

  • 分岐が1つの場合
@startumlskinparam ConditionEndStyle hline:A;if (decision) then (yes):B1;else (no)endif:C;@enduml
  • 分岐が2つ(B1, B2)の場合
@startuml skinparam ConditionEndStyle hline :A; if (decision) then (yes) :B1; else (no) :B2; endif :C; @enduml

[Ref.QA-4015]

グローバル(global)スタイルの使用

スタイル無し(デフォルト)

@startumlstart:init;-> test of color;if (color?) is (<color:red>red) then:print red;else:print not red;note right: no colorendifpartition End {:end;}-> this is the end;end@enduml
     
グローバル(global)スタイルの使用

スタイル有り

スタイルを指定して要素の見た目を変更することができます。@startuml<style>activityDiagram {BackgroundColor #33668EBorderColor #33668EFontColor #888FontName arial diamond {BackgroundColor #ccfLineColor #00FF00FontColor greenFontName arialFontSize 15}arrow {FontColor goldFontName arialFontSize 15}partition {LineColor redFontColor greenRoundCorner 10BackgroundColor PeachPuff}note {FontColor BlueLineColor NavyBackgroundColor #ccf}}document {BackgroundColor transparent}</style>start:init;-> test of color;if (color?) is (<color:red>red) then:print red;else:print not red;note right: no colorendifpartition End {:end;}-> this is the end;end@enduml
  

このサイトに関するご意見・ご質問はこちらまで

この記事またはDrupalに関するご質問がございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました