tikz-uml Problem mit Sequenzdigramm

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


StGo
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 53
Registriert: Do 29. Nov 2012, 12:19

tikz-uml Problem mit Sequenzdigramm

Beitrag von StGo »

Hallo zusammen,

ich habe ein Problem mit einem UML Sequenzdiagramm und habe mein es an dieser Stelle leider erfolglos gepostet http://tex.stackexchange.com/questions/ ... am-problem. Eventuell hat ja hier jemand Erfahrung mit TIKZ-UML?

Hier der Link zur Erweiterung: http://perso.ensta-paristech.fr/~kielba ... hp?lang=en

Mein Problem sieht folgendermaßen aus:

Ich habe zwei Sequenzdiagramme die in ähnlicher Form nachbilden möchte:

Bild
Bild

Mein Ergebnis sieht leider so aus:

Bild

Mein Problem ist, dass die Sequenz der Klasse DruckauftragB im ersten Bild unter der Sequenz der Klasse DruckauftragA anfangen müßte. Leider ist das nicht der Fall. Ich finde in der Dokumentation keine Lösung bzw. ich denke das ich etwas übersehe.
Im zweiten Bild ist es ähnlich.

Hier noch das Minibeispiel:
\documentclass[]{scrreprt}
    \usepackage[ngerman, english]{babel}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage{tikz}
    \usepackage{tikz-uml}
    \usetikzlibrary{matrix, shapes, positioning}

    \begin{document}

    \begin{tikzpicture}
    \begin{umlseqdiag}
    \umlactor{DruckauftragA}
    \umlactor[x=6]{DruckauftragB}
    \umlobject[x=12]{Drucker}

    \begin{umlcall}{DruckauftragA}{Drucker}
    \begin{umlcall}{Drucker}{DruckauftragA}
    \end{umlcall}
    \begin{umlcall}[return=1]{DruckauftragA}{Drucker}
    \end{umlcall}
    \end{umlcall}

    \begin{umlcall}{DruckauftragB}{Drucker}
    \begin{umlcall}{Drucker}{DruckauftragB}
    \end{umlcall}
    \begin{umlcall}[return=1]{DruckauftragB}{Drucker}
    \end{umlcall}
    \end{umlcall}

    \end{umlseqdiag}
    \end{tikzpicture}

        \begin{tikzpicture}
    \begin{umlseqdiag}
    \umlactor{DruckauftragA}
    \umlactor[x=6]{DruckauftragB}
    \umlobject[x=12]{Drucker}

    \begin{umlcall}{DruckauftragA}{Drucker}
    \begin{umlcall}{Drucker}{DruckauftragA}
    \end{umlcall}
    \begin{umlcall}{DruckauftragB}{Drucker}
    \begin{umlcall}{Drucker}{DruckauftragB}
    \end{umlcall}
    \begin{umlcall}[return=1]{DruckauftragB}{Drucker}
    \end{umlcall}
    \end{umlcall}
    \begin{umlcall}[return=1]{DruckauftragA}{Drucker}
    \end{umlcall}
    \end{umlcall}


    \end{umlseqdiag}
    \end{tikzpicture}
    
    \end{document}

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

http://tex.stackexchange.com/a/223125/37907 ;-)



btw: Link bitte in beide Richtungen.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

StGo
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 53
Registriert: Do 29. Nov 2012, 12:19

Beitrag von StGo »

Ich habe es auch eben gesehen bevor ich heim gefahren bin.

Die Lösung war recht simpel :-) damit sie auch hier steht:
\documentclass[]{scrreprt} 
\usepackage[ngerman, english]{babel} 
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{tikz} 
\usepackage{tikz-uml} 
\usetikzlibrary{matrix, shapes, positioning} 

\begin{document} 
\begin{tikzpicture} 
  \begin{umlseqdiag} 
    \umlactor{DruckauftragA} 
    \umlactor[x=6]{DruckauftragB} 
    \umlobject[x=12]{Drucker} 

    \begin{umlcall}{DruckauftragA}{Drucker} 
     \begin{umlcall}{Drucker}{DruckauftragA} 
     \end{umlcall} 
     \begin{umlcall}[return=1]{DruckauftragA}{Drucker} 
     \end{umlcall} 
    \end{umlcall} 
  %
    \begin{umlcall}[dt=25]{DruckauftragB}{Drucker} 
      \begin{umlcall}{Drucker}{DruckauftragB} 
      \end{umlcall} 
      \begin{umlcall}[return=1]{DruckauftragB}{Drucker} 
      \end{umlcall} 
    \end{umlcall} 
  \end{umlseqdiag} 
\end{tikzpicture} 


\begin{tikzpicture} 
  \begin{umlseqdiag} 
    \umlactor{DruckauftragA} 
    \umlactor[x=6]{DruckauftragB} 
    \umlobject[x=12]{Drucker} 
  %
    \begin{umlcall}{DruckauftragA}{Drucker} 
      \begin{umlcall}{Drucker}{DruckauftragA} 
      \end{umlcall} 
      \begin{umlcall}[dt=11]{DruckauftragB}{Drucker} 
        \begin{umlcall}{Drucker}{DruckauftragB} 
        \end{umlcall} 
        \begin{umlcall}[return=1]{DruckauftragB}{Drucker} 
        \end{umlcall} 
      \end{umlcall} 
      \begin{umlcall}[dt=19,return=1]{DruckauftragA}{Drucker} 
      \end{umlcall} 
    \end{umlcall} 
  \end{umlseqdiag} 
 \end{document}
Der originalpost ist unter obigem Link zu finden.

Danke trotzdem

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Da die Frage ursprünglich in dem anderen Forum gestellt wurde, habe ich dort geantwortet. Im übrigen habe ich bisher noch nie mit dem Paket gearbeitet und deshalb auch keine Erfahrung damit ;-)

Hier ist jetzt aber trotzdem wenigstens noch ein kurze Erklärung zu dem Vorschlag oben:

Im oberen Bild erhält der "DruckauftragB" keine Informationen, wann der erste call statt findet. Deshalb wird dieser am Beginn der timeline des "DruckauftragesB" ausgeführt. Nach hinten schieben kann man ihn mit Hilfe der Option dt. Die (Längen-)Einheit für die Verschiebung ist dabei laut Doku ex.

Im unteren Bild ist die Option dt entsprechend zwei Mal nötig, um zunächst den ersten call von B festzulegen und dann den unteren von A.

Ergebnis des Codes:

Bild

Gruß
Elke
Dateianhänge
uml.png
uml.png (12.13 KiB) 5024 mal betrachtet
Zuletzt geändert von esdd am Do 15. Jan 2015, 09:34, insgesamt 1-mal geändert.

StGo
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 53
Registriert: Do 29. Nov 2012, 12:19

Beitrag von StGo »

Hi Elke,

nett das du die Erklärung noch dabei geschrieben hast. Ich dachte wen es interessiert der schau unter dem Link nach.

Ich schreibe gerade auf der Arbeit meine Masterarbeit. Ich habe die Doku schon quer gelesen. Leider habe ich es übersehen.

Danke für deine Hilfe

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2526
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Beitrag von Stefan Kottwitz »

Mich interessiert es auch, und hier lesen ja auch einige mit, daher super, dass die Lösung auch hier erklärt wurde.

Bei TikZ bin ich auch gern dabei, hatte nur heute nicht so viel Zeit. Dafür was am Server gemacht. :-)

Stefan

StGo
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 53
Registriert: Do 29. Nov 2012, 12:19

Beitrag von StGo »

Da mein letzter Beitrag anscheinend verschwunden ist hier nocheinmal:

Inzwischen habe ich etwas damit herumgespielt und probiert die Details zu verbessern. Leider habe keine perfekte Lösung gefunden. Falls noch jemand eine Idee hat gerne her damit.

Im Bild von Elke sieht man das der Drucker durchgehend beschäftigt ist während einer Anfrage. Das ist so nicht ganz korrekt. Wenn man dieses Problem behebt bekommt man auf der Seite des Druckauftrages aber auch keine durchgängige Beschäftigung. Um die "Beschäftigung" etwas zu erklären:

1 Auftraggeber sendet Anfrage an Drucker.
2 Drucker antwortet.
3 Auftraggeber sendet Dokument
4 Drucker bestätigt fertigstellung

Aus Sicht des Auftraggeber ist er von 1 bis 4 beschäftigt. Der Drucker sieht das anders. Er bekommt seine Anfrage und beantwortet sie. -> fertig. Er bekommt das Dokument, druckt -> fertig.

Dazu habe ich mir einen "ghostcall" gebastelt. Der das realisiert. Ich frage mich nur ob ich die Doku nicht kapiere oder warum es dafür keinen Befehl gibt.

Für all die sehen was ich damit darstellen will ist das Endprodukt in Form einer gemeinsamen Grafik noch interessant. Ich werde den kompletten Code posten falls ihn jemand brauchen kann. Aber auch hier gilt die Problematik, dass die Bilder nicht perfekt sind.

Bevor jemand fragt wo der Unterschied liegt schaut sich bitte genau die ersten beiden Bilder und dann die Lösung von Elke an. Danach meine neue Lösung. Ich denke dann versteht man auch meinen Text.

Falls jemand eine Idee hat freue ich mich ansonsten hoffe ich das jemand die Beispiele brauchen kann.


\documentclass[]{scrreprt}
\usepackage[ngerman, english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{matrix, shapes, positioning}

\begin{document}
\begin{tikzpicture}
\begin{umlseqdiag}
\umlactor[x=0, fill=white]{a0}
\umlactor[x=0]{a}
\umlactor[x=3, fill=white]{b0}
\umlactor[x=3]{b}
\umlobject[x=6]{c}

\begin{umlcall}{a0}{a}
	\begin{umlcall}[return =1]{a}{c}
	\end{umlcall}
	\begin{umlcall}[return=2]{a}{c}
	\end{umlcall}
\end{umlcall}

\begin{umlcall}[dt=20]{b0}{b}
	\begin{umlcall}[return =1]{b}{c}
	\end{umlcall}
	\begin{umlcall}[return=2]{b}{c}
	\end{umlcall}
\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}

\begin{tikzpicture}
\begin{umlseqdiag}
\umlactor[x=0, fill=white]{a0}
\umlactor[x=0]{a}
\umlactor[x=3, fill=white]{b0}
\umlactor[x=3]{b}
\umlobject[x=6]{c}

\begin{umlcall}{a0}{a}
\begin{umlcall}[return =1]{a}{c}
\end{umlcall}
	\begin{umlcall}[dt=12]{b0}{b}
		\begin{umlcall}[return =x]{b}{c}
		\end{umlcall}
		\begin{umlcall}[return=y]{b}{c}
		\end{umlcall}
	\end{umlcall}
\begin{umlcall}[dt=20, return=2]{a}{c}
\end{umlcall}
\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}

\begin{tikzpicture}
\begin{umlseqdiag}
\umlactor[x=0, fill=white]{a0}
\umlactor[x=0]{a}
\umlactor[x=3, fill=white]{b0}
\umlactor[x=3]{b}
\umlobject[x=6]{c}
\umlobject[x=9]{syncobj}

\begin{umlcall}{a0}{a}
	\begin{umlcall}[return =1]{a}{syncobj}
	\end{umlcall}
	\begin{umlcall}[return=2]{a}{c}
	\end{umlcall}
	\begin{umlcall}[return=3]{a}{c}
	\end{umlcall}
		\begin{umlcall}[dt=23, return=x]{b}{syncobj}
	\begin{umlcall}[dt=8, return =4, fill=red!10]{a}{syncobj}
	\end{umlcall}
	\end{umlcall}
	\end{umlcall}
\begin{umlcall}[dt=33]{b0}{b}
	\begin{umlcall}[return =y]{b}{c}
	\end{umlcall}
	\begin{umlcall}[return=z]{b}{c}
	\end{umlcall}
	\begin{umlcall}[return=a]{b}{syncobj}
	\end{umlcall}
\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}

\end{document}
Und so sollte das letzte Diagramm aussehen:
Bild

So sieht die Ausgabe jetzt aus:
Bild
Bild

StGo
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 53
Registriert: Do 29. Nov 2012, 12:19

Beitrag von StGo »

Ich muss das Thema nochmal aufgreifen. Da ich immer noch keine Lösung habe. Inzwischen überlege ich ob ich ein anderes Tool für die Bilder nutze. Eventuell hat jemand ja doch noch eine Idee auf meinen letzten Beitrag.

Gruß

StGo
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 53
Registriert: Do 29. Nov 2012, 12:19

Beitrag von StGo »

Habe das ganze nochmal etwas überarbeitet und beschriftete. Habe auch mal das Paket \usepackage{pgf-umlsd} ausprobiert. Leider bin ich damit auch nicht weitergekommen.

Ich hänge meinen Code für die aktuellen Diaramme mal an ich hoffe ja immer noch das jemand eine Idee hat wie ich die Linie es UmlActors durchgängig bekommen.

Gruß
\documentclass[]{scrreprt}
\usepackage[ngerman, english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{matrix, shapes, positioning}
\usepackage{pgf-umlsd}

\begin{document}
\begin{sequencediagram}
\newthread{u1}{User1}
\newthread{u2}{User2}
\newinst[6]{b}{Drucker}

\begin{call}{u1}{Drucker bereit?}{b}{bereit}
\end{call}
\begin{call}{u1}{Druckauftrag senden}{b}{Druckauftrag fertig}
\end{call}

\begin{call}{u2}{Drucker bereit?}{b}{bereit}
\end{call}
\begin{call}{u2}{Druckauftrag senden}{b}{Druckauftrag fertig}
\end{call}

\end{sequencediagram}

\begin{tikzpicture}
\begin{umlseqdiag}
\umlactor[x=0, class=User]{a}
\umlactor[x=2, class=User]{b}
\umlobject[x=7, class=Drucker]{c}

\begin{umlcall}[padding= 5, op={Drucker bereit?},return = Status]{a}{c}
\end{umlcall}
\begin{umlcall}[padding= 5, op={Druckauftrag senden},return = Status]{a}{c}
\end{umlcall}

\begin{umlcall}[dt=23, padding= 5, op={Drucker bereit?},return = Status]{b}{c}
\end{umlcall}
\begin{umlcall}[padding= 5, op={Druckauftrag senden},return = Status]{b}{c}
\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}

\begin{tikzpicture}
\begin{umlseqdiag}
\umlactor[x=0, class=User]{a}
\umlactor[x=2, class=User]{b}
\umlobject[x=7, class=Drucker]{c}

\begin{umlcall}[padding= 5, op={Drucker bereit?},return = Status]{a}{c}
\end{umlcall}
	\begin{umlcall}[dt=13, padding= 5, op={Drucker bereit?},return = Status]{b}{c}
	\end{umlcall}
	\begin{umlcall}[padding= 5, op={Druckauftrag senden},return = Status]{b}{c}
	\end{umlcall}
\begin{umlcall}[dt=22, padding= 5, op={Druckauftrag senden},return = Status]{a}{c}
\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}

\begin{tikzpicture}
\begin{umlseqdiag}
\umlactor[x=0, class=User]{a}
\umlactor[x=2, class=User]{b}
\umlobject[x=8, class=Drucker]{c}
\umlobject[x=10, class=syncObj]{d}

\begin{umlcall}[dt= 4, padding= 5, op={Sync Obj. anfragen},return = Status]{a}{d}
\end{umlcall}
\begin{umlcall}[dt= 4, padding= 5, op={Drucker bereit?},return = Status]{a}{c}
\end{umlcall}
\begin{umlcall}[dt= 4, padding= 6, op={Druckauftrag senden},return = Status]{a}{c}
\end{umlcall}
	\begin{umlcall}[dt= 28, padding= 5, op={Sync Obj. anfragen}, return = Status, fill=red!10]{b}{d}
\begin{umlcall}[dt= 4, padding= 5, op={Sync Obj. freigeben},return = Status]{a}{d}
\end{umlcall}
	\end{umlcall}
\begin{umlcall}[dt= 4, padding= 5, op={Drucker bereit?},return = Status]{b}{c}
\end{umlcall}
\begin{umlcall}[dt= 4, padding= 6, op={Druckauftrag senden},return = Status]{b}{c}
\end{umlcall}
\begin{umlcall}[dt= 4, padding= 5, op={Sync Obj. freigeben},return = Status]{b}{d}
\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}

\end{document}
Bild

Bild

Antworten