%% Tikz-Styles for Palladio Component Model symbols %% by Erik Burger %% %% version 2010-12-13 %% %% Problems, bugs and comments to %% burger@kit.edu \usepackage{tikz} \usetikzlibrary{positioning} \usetikzlibrary{arrows} \usetikzlibrary{fit} \usetikzlibrary{petri} \usetikzlibrary{decorations.markings} \usetikzlibrary{decorations.pathmorphing} \usetikzlibrary{decorations.text} \usetikzlibrary{fit} \usetikzlibrary{automata} \usetikzlibrary{shapes} \usetikzlibrary{shadows} \usetikzlibrary{calc} %% Vertikal geteilter Kreis \pgfdeclareshape{circle vertical split} { \inheritsavedanchors[from=circle] \inheritanchorborder[from=circle] \inheritanchor[from=circle]{north} \inheritanchor[from=circle]{north west} \inheritanchor[from=circle]{north east} \inheritanchor[from=circle]{center} \inheritanchor[from=circle]{west} \inheritanchor[from=circle]{east} \inheritanchor[from=circle]{mid} \inheritanchor[from=circle]{mid west} \inheritanchor[from=circle]{mid east} \inheritanchor[from=circle]{base} \inheritanchor[from=circle]{base west} \inheritanchor[from=circle]{base east} \inheritanchor[from=circle]{south} \inheritanchor[from=circle]{south west} \inheritanchor[from=circle]{south east} \inheritbackgroundpath[from=circle] \foregroundpath{ \centerpoint% \pgf@xc=\pgf@x% \pgf@yc=\pgf@y% \pgfutil@tempdima=\radius% \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}% \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}% \ifdim\pgf@xb<\pgf@yb% \advance\pgfutil@tempdima by-\pgf@yb% \else% \advance\pgfutil@tempdima by-\pgf@xb% \fi% \advance\pgfutil@tempdima by-.5\pgflinewidth% \pgfsetshortenstart{0pt}% \pgfsetshortenend{0pt}% \pgfsetarrows{-}% \pgfpathmoveto{\pgfpointadd{\centerpoint}{\pgfqpoint{0pt}{-1\pgfutil@tempdima}}}% \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpoint{0pt}{\pgfutil@tempdima}}}% \pgfusepath{stroke}% } } \tikzset{ %% Color Shadings blueshading/.style={shade, top color=white, bottom color=kit-blue30, draw=kit-blue100, thick}, greyshading/.style={shade, top color=white, bottom color=black!30, draw=black!50, thick}, lightgreyshading/.style={shade, top color=white, bottom color=black!15, draw=black!50, thick}, blackshading/.style={shade, top color=black!50, bottom color=black!95, middle color=black!95, draw=black!95, thick}, greenshading/.style={shade, top color=white, bottom color=kit-green30, draw=kit-green100, thick}, redshading/.style={shade, top color=white, bottom color=kit-red30, draw=kit-red100, thick}, yellowshading/.style={shade, top color=white, bottom color=kit-yellow30, draw=kit-orange100, thick}, %% Boxes roundbox/.style={rectangle, rounded corners=.5ex}, %% PCM Actions seffaction/.style={rectangle split, rectangle split parts=2, rectangle split part align={center}, text centered, rounded corners}, pcmball/.style={shade, ball color=kit-blue100,circle,fill}, startaction/.style={pcmball,minimum size=1ex}, stopaction/.style={startaction,draw=black,double}, %% Petri net/Queueing Petri net symbols pnplace/.style={circle, draw, minimum size=2em}, pntrans/.style={rectangle, draw, minimum height=2em}, qpnplace/.style={circle vertical split, draw, minimum size=2em}, subnetplace/.style={qpnplace, double}, } %% Baseline adaptation for PCM symbols \tikzstyle{pcm} = [baseline=-.2ex] %% Ragged left text for boxes \tikzoption{text badly raggedleft}[]{\def\tikz@text@action{\raggedleft\relax}} \tikzoption{text raggedleft}[]% {\def\tikz@text@action{\raggedleft\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}} %% Layers \pgfdeclarelayer{l1} \pgfdeclarelayer{l2} \pgfdeclarelayer{l3} \pgfdeclarelayer{l4} \pgfdeclarelayer{l5} \pgfdeclarelayer{l6} \pgfdeclarelayer{l7} \pgfdeclarelayer{l8} \pgfdeclarelayer{l9} \pgfsetlayers{main,l1,l2,l3,l4,l5,l6,l7,l8,l9} % Internal Action \newcommand{\pcmintaction}[2][]{ \node[pcmball, minimum size=.7ex, text width=0ex, #1] (#2) {}; \draw[thick] (#2.north) -- ([yshift=.5ex]#2.north); \draw[thick] (#2.south) -- ([yshift=-.5ex]#2.south); } \newcommand{\pcmextaction}[2][]{ \node[pcmball, minimum size=.7ex, text width=0ex, #1] (#2) {}; \draw[thick,<-] (#2.north) -- ([yshift=1ex]#2.north); \draw[thick,->] (#2.south) -- ([yshift=-.8ex]#2.south); \draw[ultra thick,->,color=red!70!black] (#2.east) -- ([xshift=1ex]#2.east); } \newcommand{\pcmloopaction}[2][]{ \node[pcmball, minimum size=.7ex, text width=0ex, #1] (#2) {} edge [->, in=30, out=90, looseness=1, distance=2ex, thick] node {} (#2); } \newcommand{\pcmiterator}[2][]{ \begin{scope}[decoration={ markings, mark=at position .5 with {\arrow[red, line width=.2ex]{>}}}, #1] \node[matrix,draw=black!75, row sep=.3ex, inner sep=.3ex] (#2) { \draw[red,thick] (0,0) -- (.7ex,0);\\ \draw[red,thick] (0,0) -- (.7ex,0);\\ \draw[red,thick] (0,0) -- (.7ex,0);\\ }; \draw [thick,black!75,postaction=decorate] (#2.south) .. controls (0,-1.5ex) and (1.4ex,-1.5ex) .. (1.4ex,0) .. controls (1.4ex,1.5ex) and (0,1.5ex) .. (#2.north); \end{scope} } \newcommand{\pcmbranch}[2][]{ {\pgfsetcornersarced{\pgfpointorigin} \scriptsize \node[diamond, shade, ball color=kit-blue100, inner sep=.1ex, text width=1.2ex, #1] (#2) {\color{white}\scriptsize\textbf?}; \draw[thick] (#2.north) -- ([yshift=.8ex]#2.north); \draw[thick] (#2.south west) -- ([xshift=-.7ex,yshift=-.7ex]#2.south west); \draw[thick] (#2.south east) -- ([xshift=.7ex, yshift=-.7ex]#2.south east); } } \newcommand{\pcmfork}{ \begin{scope}[very thick,black!75] \draw (0,0) -- (0,.4em) -- (1em,.4em) -- (1em,0em); \draw (.33em,.4em) -- (.33em,0em); \draw (.66em,.4em) -- (.66em,0em); \draw (.5em,1em) -- (.5em,.4em); \draw (.2em,.75em) -- (.5em,.45em) -- (.8em,.75em); \end{scope} } \newcommand{\pcmnote}{ {\pgfsetcornersarced{\pgfpointorigin} \path[draw, black!75, thick, shade, top color=white, bottom color=yellow] (0,0) -- (2ex,0) -- (2ex,1ex) -- (1.5ex,1.5ex) -- (0,1.5ex) -- cycle; \draw[black!75, thick] (2ex,1ex) -- (1.5ex,1ex) -- (1.5ex,1.5ex); } } \newcommand{\pcmstart}[2][]{ \node[startaction, text width=0cm, #1] (#2) {}; } \newcommand{\pcmstop}[2][]{ \node[stopaction, text width=0cm, #1] (#2) {}; } \newcommand{\pcmsetvar}[2][]{ \node[rectangle,draw=gray,ultra thick,dashed,#1] (#2) {\$x}; } \newcommand{\pcmacq}{ \begin{scope}[every token/.style={color=kit-blue100,minimum size=.2ex}] \node[place, minimum size=1em,shade, bottom color=kit-blue30,top color=white,shading angle=30] {} [children are tokens, token distance=.4ex] child {node [token] {}} child {node [token] {}} child {node (inlier) [token] {}} child {node [token] {}} child {node [token] {}} child {node [token] {}} child {node [token] {}}; \node[token] (outlier) at (.6em,.6em) {}; \draw[->, red, very thick] (inlier) -- (outlier); \end{scope} } \newcommand{\pcmrel}{ \begin{scope}[every token/.style={color=kit-blue100,minimum size=.2ex}] \node[place, minimum size=1em,shade, bottom color=kit-blue30,top color=white,shading angle=30] {} [children are tokens, token distance=.4ex] child {node [token] {}} child {node [token] {}} child {node (inlier) [token] {}} child {node [token] {}} child {node [token] {}} child {node [token] {}} child {node [token] {}}; \node[token] (outlier) at (.6em,.6em) {}; \draw[<-, red, very thick] (inlier) -- (outlier); \end{scope} } \newcommand{\pcmdice}{ \tikzset{point/.style={circle,fill=black,minimum size=.4ex,inner sep=0pt}} \begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5] \shade[right color=white, left color=kit-blue30, draw=black, rounded corners=.1ex] (0,0) rectangle +(1em,1em); \node [point] at (.25em,.25em) {}; \node [point] at (.25em,.75em) {}; \node [point] at (.5em,.5em) {}; \node [point] at (.75em,.25em) {}; \node [point] at (.75em,.75em) {}; \end{scope} \begin{scope}[every node/.append style={yslant=0.5},yslant=0.5] \shade[left color=white, right color=kit-blue30, draw=black, rounded corners=.1ex] (1em,-1em) rectangle +(1em,1em); \node [point] at (1.25em,-.25em) {}; \node [point] at (1.25em,-.75em) {}; \node [point] at (1.75em,-.25em) {}; \node [point] at (1.75em,-.75em) {}; \end{scope} \begin{scope}[every node/.append style={ yslant=0.5,xslant=-1},yslant=0.5,xslant=-1 ] \shade[bottom color=white, top color=kit-blue30, draw=black, rounded corners=.1ex] (2em,1em) rectangle +(-1em,-1em); \node [point] at (1.25em,.25em) {}; \node [point] at (1.25em,.75em) {}; \node [point] at (1.5em,.25em) {}; \node [point] at (1.5em,.75em) {}; \node [point] at (1.75em,.25em) {}; \node [point] at (1.75em,.75em) {}; \end{scope} \draw[thick, color=black] (.5em,-.25em) -- +(-.7ex,-.7ex); \draw[thick, color=black] (1.5em,-.25em) -- +(.7ex,-.7ex); } \newcommand{\pcmcertsign}{ \begin{scope}[rotate=30] \node [draw, red, thick, circle, rotate=30] (certified) at (0,0) {\scriptsize CERTIFIED}; \draw [red, thick] (.67,.2) arc (16.6:163.4:7mm) -- cycle; \draw [red, thick] (-.67,-.2) arc (196.6:343.4:7mm) -- cycle; \end{scope} } % #1 = Formatierung % #2 = Name des Nodes % #3 = Position \newcommand{\pcmcomponentsymbol}[3]{ \node[rectangle, minimum width=1.2em, minimum height=1.2em, #1] (#2) #3 {}; \filldraw[#1] ($(#2)+(-1em,.1em)$) rectangle +(.7em,.3em) ($(#2)+(-1em,-.1em)$) rectangle +(.7em,-.3em); } % #1 = Formatierung % #2 = Name des Nodes % #3 = Text % #4 = oberer Layer % #5 = unterer Layer % #6 = Position \newcommand{\pcmcomponentbodyonlayers}[6]{ \begin{pgfonlayer}{#4} \node[minimum width=4em] (#2text) #6 {\small #3}; \pcmcomponentsymbol{fill=white, draw=black}{#2componentsymbol}{at ($(#2text.east)+(-1em,1.5em)$)} \end{pgfonlayer} \begin{pgfonlayer}{#5} \node[draw=black, rectangle, inner sep = .2em, #1] (#2) [fit=(#2text) (#2componentsymbol)] {}; \end{pgfonlayer} } % #1 = Formatierung % #2 = Name des Nodes % #3 = Text % #4 = Position \newcommand{\pcmcomponentbody}[4]{ \pcmcomponentbodyonlayers{#1}{#2}{#3}{l4}{l3}{#4} } % #1 = Formatierung % #2 = Name des Nodes % #3 = Position \newcommand{\pcmlolliwest}[3]{ \node[circle, minimum size=1ex, draw, anchor=east, xshift=-1em, #1] (#2) at #3 {}; \draw[#1] #3 -- (#2); } % #1 = Formatierung % #2 = Name des Nodes % #3 = Position \newcommand{\pcmarceast}[3]{ \node[xshift=1em] (#2) at #3 {}; \draw[#1] #3 -- (#2.center); \draw[#1, fill opacity=transparent] ($(#2)+(1.4ex,1.4ex)$) arc (90:270:1.4ex); } % #1 = Formatierung % #2 = Name des Nodes % #3 = Text % #4 = oberer Layer % #5 = unterer Layer % #6 = Position \newcommand{\pcmcomponentonlayers}[6]{ \pcmcomponentbodyonlayers{#1}{#2}{#3}{#4}{#5}{#6} \begin{pgfonlayer}{#5} \pcmlolliwest{#1}{#2lolli}{(#2.west)} \pcmarceast{#1}{#2arc}{(#2.east)} \end{pgfonlayer} } % #1 = Formatierung % #2 = Name des Nodes % #3 = Text % #4 = Position \newcommand{\pcmcomponent}[4]{ \pcmcomponentonlayers{#1}{#2}{#3}{l4}{l3}{#4} } % Extrudieren von rechteckigen Shapes % % #1 = Name des Nodes % #2 = Abstand % #3 = Zeichenoptionen \newcommand{\pcmextrude}[3]{ \path[#3] (#1.north west) -- (#1.north east) -- (#1.south east) -- (#1.south west) -- (#1.north west) -- ++(#2,#2) -- ($(#1.north east)+(#2,#2)$) -- ($(#1.south east)+(#2,#2)$) -- (#1.south east) (#1.north east) -- ($(#1.north east)+(#2,#2)$); } % Dummy-Bild \newcommand{\dummypic}[2]{ \tikz \draw[kit-red100] (0,0) -- (#1,0) -- (#1,#2) -- (0,#2) -- (0,0) -- (#1,#2) (0,#2) -- (#1,0); }