\usebox com tikz-uml

\usebox com tikz-uml

Gostaria de poder reutilizar componentes em um diagrama de estado usando TikZ-UML. Criei uma saveboxchamada \giraffecom dois componentes dentro e gostaria de colocá-los acima do nó inicial e abaixo do nó final. O código não parece produzir o resultado necessário. Alguma ideia do porquê?

\documentclass{report}

\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}

\begin{tikzpicture}[auto]

\newsavebox{\giraffe}
\savebox{\giraffe}{
  \umlbasicstate[x=0, y=0, fill=pink, width=15ex]{test1}
  \umlbasicstate[x=3, y=0, fill=yellow, width=15ex]{test2}
}

\umlstateinitial[x=0, y=11, name=initial]
\umlbasicstate[x=0, y=9, name=a, fill=white, width=15ex]{a}
\umlbasicstate[x=0, y=6, name=b, fill=white, width=15ex]{b}
\umlbasicstate[x=0, y=3, name=c, fill=white, width=15ex]{c}
\umlstatefinal[x=0, y=1, name=final]

\node [below of=final] {\usebox{\giraffe}};          % below final
\node [above of=initial] {\usebox{\giraffe}};        % above initial

\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}

\end{tikzpicture}
\end{document}

Nota: o código acima está compilando, mas tikz-umlé um pacote não padrão; ele pode ser baixado deaqui.

Responder1

Esperançosamente, isso pode ser adaptado à sua necessidade. A chave aqui é usar umseparado tikzpicturepara armazenar a caixa na qual você está colocando os componentes.

\documentclass{report}

\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}

\newsavebox{\giraffe}
\savebox{\giraffe}{%
\begin{tikzpicture}[auto]
  \umlbasicstate[x=0, y=0, fill=pink, width=15ex]{test1}
  \umlbasicstate[x=3, y=0, fill=yellow, width=15ex]{test2}
\end{tikzpicture}%
}

\begin{tikzpicture}[auto]
\umlstateinitial[x=0, y=11, name=initial]
\umlbasicstate[x=0, y=9, name=a, fill=white, width=15ex]{a}
\umlbasicstate[x=0, y=6, name=b, fill=white, width=15ex]{b}
\umlbasicstate[x=0, y=3, name=c, fill=white, width=15ex]{c}
\umlstatefinal[x=0, y=1, name=final]

\node [below of=final] {\usebox{\giraffe}};          % below final
\node [above of=initial] {\usebox{\giraffe}};        % above initial

\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}

\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder2

Com TiKZ 3.0você pode declarar e usar pics. A picé uma pequena imagem que você pode reutilizar várias vezes em seu diagrama. O próximo código mostra como usar giraffecomo um arquivo pic.

\documentclass[border=3mm]{standalone}

\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}

\tikzset{
    giraffe/.pic={
        \umlbasicstate[x=-1.5, y=0, fill=pink, width=15ex]{test1}
        \umlbasicstate[x=1.5, y=0, fill=yellow, width=15ex]{test2}
    }%
}


\begin{tikzpicture}[auto]
\umlstateinitial[x=0, y=11, name=initial]
\umlbasicstate[x=0, y=9, name=a, fill=white, width=15ex]{a}
\umlbasicstate[x=0, y=6, name=b, fill=white, width=15ex]{b}
\umlbasicstate[x=0, y=3, name=c, fill=white, width=15ex]{c}
\umlstatefinal[x=0, y=1, name=final]

\draw pic[below of = final] {giraffe};          % below final
\draw pic[above of =  initial] {giraffe};        % above initial

\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}

\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

Como você pode ver, o resultado é diferente da solução de Steven, mas não conheço tikz-umlsistema de posicionamento para fazer isso. Tentei substituir below of=a sintaxe (acho que está obsoleta), below = ofmas também modificou a composição interna dos umlbasicstatecomponentes.

informação relacionada