Sequenzdiagramm mit pgf-umlsd -> Thread unterbrechen

Tabellen und Grafiken erstellen und anordnen


kng
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mo 8. Sep 2014, 13:24

Sequenzdiagramm mit pgf-umlsd -> Thread unterbrechen

Beitrag von kng »

Hallo Forumsmitglieder,

ich bin neu hier im Forum, habe aber schon viel von den Fragen und Antworten hier gelernt.

Ich versuche aktuell ein Sequenzdiagramm mit tikz zu erstellen, dazu nutze ich das Paket pgf-umlsd, was auch sehr schön funktioniert. Ich würde jedoch gerne den Thread zwischen zwei Nachrichten unterbrechen können, wie im Minimalbeispiel im Kommentar markiert. Ich hätte noch gerne eine PDF oder ein PNG angehängt, aber bekomme immer einen "Upload Error: Kann das Attachment ... nicht hochladen".
\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{pgf-umlsd}
\begin{document}
	\section{Minimalbeispiel Sequenzdiagramm}
	\begin{sequencediagram}
		\newthread[white]{t}{:thread}
		\newinst[2]{i}{:inst}
		\begin{call}{t}{message 1}{i}{response 1}
		\end{call}
%		Hier soll der Thread-Balken unterbrochen sein...
		\begin{call}{t}{message 2}{i}{response 2}
		\end{call}
	\end{sequencediagram}
\end{document}
Weiss jemand wie das geht oder wie man es hinbiegen könnte?

Nachtrag: Habe folgendes Manual gefunden:
http://ftp.gwdg.de/pub/ctan/graphics/pg ... manual.pdf
Da findet sich jedoch leider nichts dazu.

Liebe Grüße,
Robert

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

etwa so?
\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{pgf-umlsd}
\begin{document}
   \section{Minimalbeispiel Sequenzdiagramm}
   \begin{sequencediagram}
      \newthread[white]{t}{:thread}
      \newinst[2]{i}{:inst}
      \begin{call}{t}{message 1}{i}{response 1}
      \end{call}
%      Hier soll der Thread-Balken unterbrochen sein...
      \path (thread1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (fooa){};
      \postlevel
      \path (thread1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (foob){};
      \draw[white] (fooa.west) -- (foob.west) (fooa.east) -- (foob.east);
      \draw (fooa.west) -- (fooa.east) (foob.west) -- (foob.east);
%
      \begin{call}{t}{message 2}{i}{response 2}
      \end{call}
   \end{sequencediagram}
\end{document}
MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

kng
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mo 8. Sep 2014, 13:24

Beitrag von kng »

Vielen Dank Rainer für diese Lösung! Das erfüllt, ergänzt um ein
\draw [dotted] (fooa.center) -- (foob.center);
genau meinen Wunsch, Respekt vor Deinen Tikz-Skills.

Allerdings bin ich mit dieser Lösung nicht 100% glücklich, denn:
Wenn ich eine so "abgetrennte" Sequenz in einen Block (z.B. Loop) packe, werden eben logischerweise zwei kleine weiße Löcher in den unteren Rand gezeichnet. Garantiert kann man das auch wieder auf ähnliche Weise lösen, das wird mir dann aber zu viel Gefrickel für zu wenig Nutzen. Wenn es das Paket nicht hergibt, lebe ich lieber mit dem durchgezogenen Balken.

Danke Dir nochmal für die Antwort und fühle Dich bitte nicht aufgefordert, dieses Problem auch noch zu lösen :D.

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

kng hat geschrieben: Danke Dir nochmal für die Antwort und fühle Dich bitte nicht aufgefordert, dieses Problem auch noch zu lösen :D.
Was soll ich sagen? Danke für die Blumen;-)
Wobei, sooo effizient bin ich im Umgang mit tikz gar nicht (dann hätte ich den Zugriff auf `thread1' (der vom pgf-umlsd-Paket angelegt wird) durch `t' (den Du selbst beim \newthread angegeben hast) ersetzt -- da passte die Position allerdings so nicht, was aber vermutlich auch handhabbar wäre.) Und vom pgf-umlsd-Paket hab ich hier heute zum ersten Mal was gehört;-)
Eine Idee hätte ich trotzdem: vllt wäre es konstruktiver, wenn Du statt \newthread \newinst nämst. Dann entfiele zumindest das `Übertünchen mit Weiß' -- allerdings müsstest Du Dir dann was einfallen lassen, die Balken dort entstehen zu lassen, wo sie denn erscheinen sollen ...

MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

kng
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mo 8. Sep 2014, 13:24

Beitrag von kng »

vllt wäre es konstruktiver, wenn Du statt \newthread \newinst nämst
Das hatte ich probiert, und Du hast recht, man müsste die Balken selbst zeichnen, worauf ich eigentlich keine Lust habe :). Aber vielleicht arbeite ich einfach mit Messages (\mess), da es sowieso eigentlich nur um Nachrichten geht und nicht um Calls... Dann brauche ich keine Balken. Schaue mal wie es aussieht, vorerst Frage geklärt.

Danke Dir nochmal!

kng
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mo 8. Sep 2014, 13:24

Beitrag von kng »

Eigentlich wollte ich es nicht tun, aber es war nicht so kompliziert, daher:
\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{pgf-umlsd}
\begin{document}
	\section{Minimalbeispiel Sequenzdiagramm}
	\centering
	\begin{sequencediagram}
		\newinst[]{i1}{:inst1}
		\newinst[2]{i2}{:inst2}
		
		\tikzstyle{instcolori1}=[fill=white]
		\tikzstyle{instcolori2}=[fill=white]
		
		\postlevel
		\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (fooa){};
		\prelevel
		\begin{call}{i1}{message 1}{i2}{response 1}
		\end{call}
		\postlevel
		\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (foob){};
		\draw[fill=white] (fooa.east) rectangle (foob.west);
		
		\postlevel
		\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (fooa){};
		\prelevel
		\begin{call}{i1}{message 2}{i2}{response 2}
		\end{call}
		\postlevel
		\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (foob){};
		\draw[fill=white] (fooa.east) rectangle (foob.west);
	\end{sequencediagram}
\end{document}
So tut es. Nicht schön, aber selten.

kng
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mo 8. Sep 2014, 13:24

Beitrag von kng »

Etwas optimiert.
\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{pgf-umlsd}
\begin{document}
	\section{Minimalbeispiel Sequenzdiagramm}
	\centering
	\begin{sequencediagram}
		\newinst[]{i1}{:inst1}
		\newinst[2]{i2}{:inst2}
		
		\tikzstyle{instcolori1}=[fill=white]
		\tikzstyle{instcolori2}=[fill=white]
		
		\begin{call}{i1}{message 1}{i2}{response 1}
			\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (fooa){};
		\end{call}
		\postlevel
		\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (foob){};
		\draw[fill=white] (fooa.east) rectangle (foob.west);
		
		\begin{call}{i1}{message 2}{i2}{response 2}
			\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (fooa){};
		\end{call}
		\postlevel
		\path (i1) +(0,-\theseqlevel*\unitfactor-0.1*\unitfactor) node (foob){};
		\draw[fill=white] (fooa.east) rectangle (foob.west);
	\end{sequencediagram}
\end{document}

Antworten