Probleme mit Pfeilen im State Machine Diagram von Tikz

Tabellen und Grafiken erstellen und anordnen


Akosol
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Sa 19. Aug 2017, 13:04

Probleme mit Pfeilen im State Machine Diagram von Tikz

Beitrag von Akosol »

Hallo,
ich bin gerade dabei, ein State machine Diagram mit Latex zu zeichnen. Nun möchte ich vom letzten Zustand zu einem höherliegenden einen Pfeil zeichnen. Leider gelingt mir das nicht. Zumindest nicht so, dass es akzeptabel aussieht.
Die Doku zum tikz-uml-Package hat mir da leider nicht weitergeholfen. Auch, wenn ich Befehle, wie umlHVHtrans{}{} oder ähnlliches verwende, wird das Ergebnis nicht deutlich besser.
Rekursive Transitionen werden ignoriert, weil ich ja auf einen anderen Zustand wechseln will.
Hier ist ein Minimalbeispiel und ein Bild von dem Diagramm, welches erzeugt wird. Es geht um die Darstellung des blauen Pfeils. Wenn ich die letzte Zeile im Code mit ausführe, wird ein Pfeil direkt durch alle Elemente durch, statt außenrum gezeichnet.
\documentclass[paper=a4,12pt,version=last]{scrartcl}
\usepackage{tikz-uml}
\usetikzlibrary{positioning}
\begin{document}
\resizebox{!}{\textheight}{
\begin{tikzpicture}
	\begin{umlstate}[name=main]{Gesamter Ablauf}
			\umlstateinitial[name=init]
			\umlbasicstate[anchor=north, below=1.5cm of init, name=state1]{state1}
			\umlstatejoin[below=1.5cm of state1, name=join1]
			\umlbasicstate[anchor=north, below=1.5cm of join1, name=state2]{state2}
			\umlstatedecision[below=0.8 of state2, name=decision1]
			\umlbasicstate[anchor=north, below right=1.8 and 1.5cm of decision1, name=state3]{state3}
			\umlstatejoin[below=5 of decision1, name=join2]
			\umlbasicstate[below=1.5cm of join2, name=state4]{state4}
			

			\umltrans{init}{state1}
			\umltrans{state1}{join1}
			\umltrans{join1}{state2}
			\umltrans{state2}{decision1}
			\umlHVtrans{decision1}{state3}
			\umltrans{decision1}{join2}
			\umlVHtrans{state3}{join2}
			\umltrans{join2}{state4}
	%		\umlHVHtrans{state4}{join1}
		\end{umlstate}
\end{tikzpicture}
}
\end{document}
Eine andere Sache, die mich an dem Diagramm stört ist, dass die Entscheidungsknoten nicht zentriert sind. Kann man das irgendwie beheben (außer durch Testen und manuelle Verschiebung nach rechts/links)?

Bild
Dateianhänge
stateMachine.JPG
stateMachine.JPG (32.98 KiB) 2756 mal betrachtet
Zuletzt geändert von Akosol am Mi 23. Aug 2017, 18:24, insgesamt 1-mal geändert.

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

Beitrag von Stefan Kottwitz »

Hallo,

das Minimalbeispiel sieht schon gut aus, doch es lässt sich nicht übersetzen. Da sind Fehler drin. Zum Beispiel ist in der Zeile

\umlbasicstate[anchor=north, below=1.5cm of init, name=state1]{state1)}

sicher die runde Klammer zuviel, nahe dem Ende der Zeile. Es treten noch weitere Fehlermeldungen auf. Evtl. sind die Fehler ja schuld am verschobenen Aussehen.

Ich bin gerade unterwegs und konnte nur kurz testen. Vielleicht repariere die Fehler oder sag Bescheid, wenn es damit ein Problem gibt, ich kann später am Abend nochmal draufschauen.

Stefan

Akosol
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Sa 19. Aug 2017, 13:04

Beitrag von Akosol »

Stefan Kottwitz hat geschrieben:Hallo,

das Minimalbeispiel sieht schon gut aus, doch es lässt sich nicht übersetzen. Da sind Fehler drin. Zum Beispiel ist in der Zeile

\umlbasicstate[anchor=north, below=1.5cm of init, name=state1]{state1)}

sicher die runde Klammer zuviel, nahe dem Ende der Zeile. Es treten noch weitere Fehlermeldungen auf. Evtl. sind die Fehler ja schuld am verschobenen Aussehen.

Ich bin gerade unterwegs und konnte nur kurz testen. Vielleicht repariere die Fehler oder sag Bescheid, wenn es damit ein Problem gibt, ich kann später am Abend nochmal draufschauen.

Stefan
Die runde Klammer ist an der Stelle egal, weil dort lediglich der angezeigte Name steht. Wenn ich das bei mir mit TexStudio ausführe, wird das Diagramm, wie es im Bild zu sehen ist, erzeugt. Fehlermeldungen bekomme ich dabei nicht.

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

Beitrag von Stefan Kottwitz »

Bei dem Code erhalte ich:

! TIKZUML ERROR : in umlstate, invalid option anchor.
\pgfkeys@code ...lstate, invalid option \keyname }

l.29 }

Entferne ich \resizebox samt der Klammer an der bemängelten Stelle, erhalte ich

! TIKZUML ERROR : in umlstate, invalid option anchor.
\pgfkeys@code ...lstate, invalid option \keyname }

l.8 ..., below=1.5cm of init, name=state1]{state1}

Daher meine Vermutung mit der Klammer. Ist ja oben nun geändert.

"invalid option anchor" meint, dass die Option anchor nicht unterstützt wird. Also entferne ich die.

Dann kommt

! TIKZUML ERROR : in umlstate, invalid option below.
\pgfkeys@code ...lstate, invalid option \keyname }

l.8 ...e[below=1.5cm of init, name=state1]{state1}

Wenn ich all diese Optionen entferne, erhalte ich

! Undefined control sequence.
\pgfmath@dimen@ ...men@@ #1=0.0pt\relax \pgfmath@

l.16 \umltrans{init}{state1}

Dann habe ich es erstmal gelassen.

Kannst Du mal deine .log-Datei hier als Anhang posten?

Stefan

Akosol
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Sa 19. Aug 2017, 13:04

Beitrag von Akosol »

Das klingt so, als würde dein Programm die Befehle aus der Tikz-library positioning nicht erkennen.
Hier kommt einmal die Log-Datei.
Ich hoffe, dass die aufschlussreich ist.
Dateianhänge
document.log
(29.38 KiB) 256-mal heruntergeladen

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

Beitrag von Stefan Kottwitz »

Hab jetzt eine andere Version von tikz-uml getestet. Der decision node scheint nicht gut mit anchor zu funktionieren, um ihn gerade darunter auszurichten. Mit below left und Verschiebung 0 aber schon. :-)

Unten dann noch ein Weg, wie man selber so einen Pfeil außen herum zeichnen kann.
\documentclass[paper=a4,12pt,version=last]{scrartcl}
\usepackage{tikz-uml}
\usetikzlibrary{positioning}
\begin{document}
\resizebox{!}{\textheight}{
\begin{tikzpicture}
   \begin{umlstate}[name=main]{Gesamter Ablauf}
         \umlstateinitial[name=init]
         \umlbasicstate[anchor=north, below=1.5cm of init, name=state1]{state1}
         \umlstatejoin[below=1.5cm of state1, name=join1]
         \umlbasicstate[anchor=north, below=1.5cm of join1, name=state2]{state2}
         \umlstatedecision[anchor=north, below left=0.8 and 0ex of state2.south, name=decision1]
         \umlbasicstate[anchor=center, below right=1.8 and 1.5cm of decision1, name=state3]{state3}
         \umlstatejoin[below left=5 and 0 of decision1.south, name=join2]
         \umlbasicstate[below=1.5cm of join2, name=state4]{state4}
         \umltrans{init}{state1}
         \umltrans{state1}{join1}
         \umltrans{join1}{state2}
         \umltrans{state2}{decision1}
         \umlHVtrans{decision1}{state3}
         \umltrans{decision1}{join2}
         \umlVHtrans{state3}{join2}
         \umltrans{join2}{state4}
   %      \umlHVHtrans{state4}{join1}
      \end{umlstate}
      \draw[->] (state4.south) -- ++(0,-0.8) -- ++(-2,0) |- (join1);
\end{tikzpicture}
}
\end{document}
 
Bild

Stefan
Dateianhänge
chart.png
chart.png (9.72 KiB) 2500 mal betrachtet

Akosol
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Sa 19. Aug 2017, 13:04

Beitrag von Akosol »

Super :D
Dankeschön :)

Antworten