Seite 1 von 1

Sequenzdiagramm mit pgf-umlsd -> Thread unterbrechen

Verfasst: Mo 8. Sep 2014, 13:48
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

Verfasst: Mo 8. Sep 2014, 21:53
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

Verfasst: Mo 8. Sep 2014, 22:24
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.

Verfasst: Mo 8. Sep 2014, 23:18
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

Verfasst: Di 9. Sep 2014, 10:26
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!

Verfasst: Di 9. Sep 2014, 11:15
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.

Verfasst: Di 9. Sep 2014, 11:19
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}