2.6.5. TikZ-UML

Homepage

TikZ-UML Project

Documentation

TikZ-UML User Guide

TikZ-UML is a TikZ extension to manage common UML diagrams. The primary goal was to propose an alternative to the pst-uml package, as TikZ is an alternative itself to PSTricks.

tikzuml/usecasediag.tex, in Figure 2.41.

\begin{tikzpicture}

    \begin{umlsystem}[x=4, fill=red!10]{The system}
        \umlusecase{use case 1} % usecase-1
        \umlusecase[y=-2]{use case 2} % usecase-2
        \umlusecase[y=-4]{use case 3} % usecase-3
        \umlusecase[x=4, y=-2, width=1.5cm]{ % usecase-4
            \shortstack{use case 4\\\footnotesize{on 2 lines}}
        }
        \umlusecase[x=6, fill=green!20]{use case 5} % usecase-5
        \umlusecase[x=6, y=-4]{use case 6} % usecase-6
    \end{umlsystem}

    \umlactor{user}
    \umlactor[y=-3]{subuser}
    \umlactor[x=14, y=-1.5]{admin}

    \umlinherit{subuser}{user}
    \umlassoc{user}{usecase-1}
    \umlassoc{subuser}{usecase-2}
    \umlassoc{subuser}{usecase-3}
    \umlassoc{admin}{usecase-5}
    \umlassoc{admin}{usecase-6}
    \umlinherit{usecase-2}{usecase-1}
    \umlVHextend{usecase-5}{usecase-4}
    \umlinclude[name=incl]{usecase-3}{usecase-4}

    \umlnote[x=7, y=-7]{incl-1}{
        \footnotesize{note on include dependency}
    }

\end{tikzpicture}

%Local variables:
% coding: utf-8
% mode: text
% mode: rst
% End:
% vim: fileencoding=utf-8 filetype=tex :

Figure 2.41 Use case diagram example

tikzuml/classdiag.tex, in Figure 2.42.

\begin{tikzpicture}


    \begin{umlpackage}{p} % package-p
        \begin{umlpackage}{sp1} % package-sp1
            \umlclass[template=T]{A}{ % class-A
                n : uint \\
                t : float
            }{}
            \umlclass[y=-3]{B}{ % class-B
                d : double
            }{
                \umlvirt{setB(b : B) : void} \\
                getB() : B
            }
        \end{umlpackage}
        \begin{umlpackage}[x=10,y=-6]{sp2} % package-sp2
            \umlinterface{C}{ % class-C
                n : uint \\
                s : string
            }{}
        \end{umlpackage}
        \umlclass[x=2,y=-10]{D}{ % class-D
            n : uint
        }{}
    \end{umlpackage}

    \umlassoc[geometry=-|-, arg1=tata, mult1=*, pos1=0.3, arg2=toto, mult2=1, pos2=2.9, align2=left]{C}{B}
    \umlunicompo[geometry=-|, arg=titi, mult=*, pos=1.7, stereo=vector]{D}{C}
    \umlimport[geometry=|-, anchors=90 and 50, name=import]{sp2}{sp1}
    \umlaggreg[arg=tutu, mult=1, pos=0.8, angle1=30, angle2=60, loopsize=2cm]{D}{D}
    \umlinherit[geometry=-|]{D}{B}
    \umlnote[x=2.5,y=-6, width=3.5cm]{B}{
        \footnotesize{I am a note that belongs to class B.}
    }
    \umlnote[x=7.5,y=-1.5]{import-2}{
        \footnotesize{I am a note that concerns the import relationship.}
    }

\end{tikzpicture}

%Local variables:
% coding: utf-8
% mode: text
% mode: rst
% End:
% vim: fileencoding=utf-8 filetype=tex :

Figure 2.42 Class diagram example

tikzuml/statediag.tex, in Figure 2.43.

\begin{tikzpicture}

    \begin{umlstate}[name=Amain]{Overall state of the object A} % Amain

        \begin{umlstate}[name=Bgraph, fill=red!20]{graph B} % Bgraph

            \umlstateinitial[name=Binit] % state-Binit
            \umlbasicstate[y=-4, name=test1, fill=white]{test1} % state-test1
            \umltrans{Binit}{test1}
            \umltrans[recursive=20|60|2.5cm, recursive direction=right to top, arg={op1}, pos=1.5]{test1}{test1}
            \umltrans[recursive=160|120|2.5cm, recursive direction=left to top, arg={op2}, pos=1.5]{test1}{test1}
            \umltrans[recursive=-160|-120|2.5cm, recursive direction=left to bottom, arg={op3}, pos=1.5]{test1}{test1}
            \umltrans[recursive=-20|-60|2.5cm, recursive direction=right to bottom, arg={op4}, pos=1.5]{test1}{test1}

            \umlbasicstate[y=-8, name=test2, fill=white]{test2} % state-test2
            \umltrans[recursive=-160|-120|2.5cm, recursive direction=left to bottom, arg={op5}, pos=1.5]{test2}{test2}
            \umltrans{test1}{test2}

            \umlstatefinal[x=3, y=-7.75, name=Bfinal] % state-Bfinal
            \umltrans{test2}{Bfinal}

        \end{umlstate}

        \umlstateinitial[x=6, y=1, name=Ainit] % state-Ainit
        \umlVHtrans[anchor2=40]{Ainit}{Bgraph}

        \umlstatefinal[x=6, y=-3.5, name=Afinal] % state-Afinal
        \umlHVtrans[anchor1=30]{Bgraph}{Afinal}

        \umlbasicstate[x=6, y=-6, name=visu, fill=green!20]{Visualisation} % state-visu
        \umlHVtrans{Bfinal}{visu}
        \umltrans{visu}{Afinal}
        \umltrans[recursive=-20|-60|2.5cm, recursive direction=right to bottom, arg=a, pos=1.5]{visu}{visu}

    \end{umlstate}

\end{tikzpicture}

%Local variables:
% coding: utf-8
% mode: text
% mode: rst
% End:
% vim: fileencoding=utf-8 filetype=tex :

Figure 2.43 State-machine diagram example

tikzuml/seqdiag.tex, in Figure 2.44.

\begin{tikzpicture}[scale=.85]

    \begin{umlseqdiag}
        \umlactor[class=A]{a}
        \umldatabase[class=B, fill=blue!20]{b}
        \umlmulti[class=C]{c}
        \umlobject[class=D]{d}
        \begin{umlcall}[op=opa(), type=synchron, return=0]{a}{b}
            \begin{umlfragment}
                \begin{umlcall}[op=opb(), type=synchron, return=1]{b}{c}
                    \begin{umlfragment}[type=alt, label=condition, inner xsep=8, fill=green!10]
                        \begin{umlcall}[op=opc(), type=asynchron, fill=red!10]{c}{d}
                        \end{umlcall}
                        \begin{umlcall}[type=return]{c}{b}
                        \end{umlcall}
                        \umlfpart[default]
                        \begin{umlcall}[op=opd(), type=synchron, return=3]{c}{d}
                        \end{umlcall}
                    \end{umlfragment}
                \end{umlcall}
            \end{umlfragment}
            \begin{umlfragment}
                \begin{umlcallself}[op=ope(), type=synchron, return=4]{b}
                    \begin{umlfragment}[type=assert]
                        \begin{umlcall}[op=opf(), type=synchron, return=5]{b}{c}
                        \end{umlcall}
                    \end{umlfragment}
                \end{umlcallself}
            \end{umlfragment}
        \end{umlcall}
        \umlcreatecall[class=E,x=8]{a}{e}
        \begin{umlfragment}
            \begin{umlcall}[op=opg(), name=test, type=synchron, return=6, dt=7, fill=red!10]{a}{e}
                \umlcreatecall[class=F, stereo=boundary, x=12]{e}{f}
            \end{umlcall}
            \begin{umlcall}[op=oph(), type=synchron, return=7]{a}{e}
            \end{umlcall}
        \end{umlfragment}
    \end{umlseqdiag}

\end{tikzpicture}

%Local variables:
% coding: utf-8
% mode: text
% mode: rst
% End:
% vim: fileencoding=utf-8 filetype=tex :

Figure 2.44 Sequence diagram example

tikzuml/componentdiag.tex, in Figure 2.45.

\begin{tikzpicture}

    \begin{umlcomponent}{A} % component-A
        \umlbasiccomponent{B} % component-B
        \umlbasiccomponent[y=-2]{C} % component-C
        \umlrequiredinterface[interface=C-interface]{C} % interface-C
        \umlprovidedinterface[interface=B-interface, with port, distance=3cm, padding=2.5cm]{B} % interface-B
    \end{umlcomponent}

    \umlbasiccomponent[x=-9,y=1]{D} % component-D
    \umlbasiccomponent[x=3.5,y=-7.5]{E} % component-E
    \umlbasiccomponent[x=-2, y=-9]{F} % component-F
    \umlbasiccomponent[x=-8,y=-8]{G} % component-G
    \umlbasiccomponent[x=-8,y=-11]{H} % component-H

    \umlassemblyconnector[interface=DA, with port, name=toto]{D}{A} % interface-DA
    \umldelegateconnector{A-west-port}{B-west-interface}
    \umlVHVassemblyconnector[interface=AE, with port]{A}{E} % interface-AE
    \umlHVHassemblyconnector[interface=EF, with port, first arm]{E}{F} % interface-EF
    \umlHVHassemblyconnector[interface=GHF, with port, arm2=-2cm, last arm]{G}{F} % interface-GHF
    \umlHVHassemblyconnector[with port, arm2=-2cm, last arm]{H}{F}

    \umlnote[x=-4, y=4, width=3.5cm]{B-west-interface}{
        \footnotesize{I am the node named B-west-interface}
    }
    \umlnote[x=2, y=4, width=3.5cm]{C-east-interface}{
        \footnotesize{I am the node named C-east-interface}
    }
    \umlnote[x=-9, y=-2, width=3.0cm]{toto-interface}{
        \footnotesize{I am the node named toto-interface}
    }
    \umlnote[x=-6, y=-4.5, width=3.5cm]{A-south-port}{
        \footnotesize{I am the node named A-south-port}
    }
    \umlnote[x=-1.5, y=-6, width=3.5cm]{AE-interface}{
        \footnotesize{I am the node named AE-interface}
    }
    \umlnote[x=2, y=-11, width=3.5cm]{F-east-port}{
        \footnotesize{I am the node named F-east-port}
    }

\end{tikzpicture}

%Local variables:
% coding: utf-8
% mode: text
% mode: rst
% End:
% vim: fileencoding=utf-8 filetype=tex :

Figure 2.45 Component diagram example