Donnerstag, 21. November 2013

Erstellung von Diagrammen

Okay, heute wirds mal so richtig technisch.

Ich bin in den letzten Tagen eine meiner Dauerbaustellen angegangen: die Erstellung von Diagrammen. Für einen Blinden nicht so ganz einfach, aber durchaus lösbar. Anstatt grafisch orientierter Programme wie Microsoft Visio kann man Diagramme nämlich auch mit Beschreibungssprachen definieren und sich das fertige Diagramm dann von einem Stück Software erstellen lassen.


Nach einiger Recherche habe ich mich zunächst einmal für die Sprache DOT entschieden, und für das freie Open Source Softwarepaket Graphviz. Die Möglichkeiten dieser Sprache sind sehr vielfältig, auch wenn es einige Begrenzungen gibt, und der Code ist (im Gegensatz zu den XML-basierten Formaten wie GraphML oder GXL) leicht und schnell lesbar. Geeignet ist es für so ziemlich alles, was Knoten miteinander verbinden muss, von Molekülen über IT-Netzwerke bis zu Organigrammen. Gedacht ist diese Sprache vor allem für die automatische Generierung von Diagrammen. So lässt sich z.B. ein Prozessdiagramm direkt aus den Daten einer technischen Prozessbeschreibung erstellen.


Was kann man erwarten?


DOT ist eine einfache Beschreibungssprache für Diagramme. Diese Diagramme bestehen hauptsächlich aus Knoten und aus Kanten. Letztere verbinden die Knoten miteinander. Ein Diagramm kann dabei ein gerichteter oder ein ungerichteter Graph sein. DOT beherrscht außerdem Gruppierungen, Unterdiagramme und einige andere Konzepte.

Die Grundidee ist, mittels DOT zu definieren, welche Knoten und welche Kanten es gibt, und den Rest der Software zu überlassen. Letztere entscheidet weitgehend selbst, wie die Knoten angeordnet und wie die Kanten gezogen werden, damit es möglichst übersichtlich aussieht. Es gibt aber auch verschiedene Eingriffsmöglichkeiten in die Gestaltung des Diagramms, von Gruppierung zusammengehöriger Elemente über bevorzugte Anknüpfungspunkte von Kanten bis zur exakten Positionierung einzelner Knoten.

Optisch perfekt wird das Ergebnis dabei meist nicht sein. Aus Sicht eines Blinden ist es aber eine Möglichkeit, mit etwas Übung ansprechend aussehende Diagramme zu gestalten. Und was vielleicht noch viel wichtiger ist: man kann über den Quelltext sicherstellen, dass ein Diagramm inhaltlich korrekt ist.

Es stehen übrigens verschiedene Algorithmen zur Erstellung der eigentlichen Grafik zur Verfügung, die teils deutlich unterschiedliche Ergebnisse liefern. Man kann also auf Knopfdruck und ohne einen (durchaus möglichen) tieferen Eingriff in die Logik alternative Diagramme aus dem gleichen Quellcode erstellen und dann das am besten aussehende verwenden (lassen).


DOT - Einige Beispiele


Ich kann und will hier keinen Einsteigerkurs in DOT schreiben, die gibt es reichlich im Internet zu finden. Damit ihr aber ein Gefühl dafür bekommt, wie sich DOT "anfühlt", hier ein paar kleine Beispiele. Aber bitte nicht erschrecken: die Sprache ist leichter zu lernen, als sie aussieht, und als Anwender kann man frei entscheiden, wie tief man sich einarbeitet, und wie viel Einfluss man auf die Struktur und Gestaltung.nehmen möchte.

Zunächst ein simples Diagramm als gerichteter Graph:

digraph {
"Vater" -> "Sohn";
"Vater" -> "Tochter";
"Tochter" -> "Kind";
"Vater" -> "Kind" [label="Großvater von"]
}

Diagramm 1

In diesem Beispiel werden die Knoten als einfacher Text definiert. Die Kanten (Verbindungen) werden durch den "Pfeil" ("->") repräsentiert, wobei ich die Verbindung zwischen Vater und Kind beschriftet habe. Diese Beschriftung taucht neben der Linie auf.

Im nächsten Beispiel verfeinern wir das Diagramm noch ein wenig. Zum einen werden Sohn und Tochter jetzt gruppiert und erzwungen auf einer Ebene angezeigt, zum anderen sind die Knoten jetzt explizit definiert:

digraph {
vater [label="Vater"];
{ rank=same;
sohn [label="Sohn"];
tochter [label="Tochter"];
}
kind [label="Erstes Kind"];

vater -> sohn;
vater -> tochter;
tochter -> kind;
vater -> kind [label="Großvater von"]
}

Diagramm 2

Okay, optisch hat sich hier nicht viel verändert, aber das Diagramm ist "sauberer" und damit weniger fehleranfällig, Knoten können leicht umbenannt werden und die Hierarchie zwischen Sohn und Tochter ist festgelegt.

Im nächsten Schritt geht's in die Vollen. Ich nehme hier eine Reihe optischer Anpassungen vor, definiere eine Untergrafik und beschrifte einen der Knoten mittels des von DOT unterstützten Pseudo-HTMLs:

digraph {
nodesep=0.7; // Abstand zwischen Knoten
ranksep=1; // Abstand zwischen Hierarchieebenen:
margin=1.5; // Rand des Gesamtdiagramms
fontname="Tahoma"; // Schriftart für das Diagramm selbst
label="Beispieldiagramm" // Der Name des Diagramms

// Und hier definieren wir das Aussehen der Knoten:
node [
width=2; // Breite des Knotens
fontname="Tahoma",
shape=box
];

vater [label=<<table cellpadding="30" border="0" cellborder="0"><tr><td balign="left"><b>Vater</b><br />Die erste Generation</td></tr></table>>];

subgraph cluster_A {
label="Die Mitte";
labeljust=left; // Das Label linksbündig anzeigen
rank=same;
margin=20; // Innerer Rand der Box, die den Subgraph umschließt
pencolor=gray; // Die Box des Subgraphs in grau zeichnen

sohn [label="Sohn"];
tochter [label="Tochter"];
}
kind [label="Erstes Kind", style="rounded"];

vater -> sohn;
vater -> tochter;
tochter -> kind;
vater -> kind [label="Großvater von",style=dotted]
}



Stärken und Schwächen


DOT hat als Beschreibungssprache einige deutliche Stärken, insbes. das selbstständige "Entwirren" von Diagrammen. Wunder darf man aber hier natürlich nicht erwarten, denn diese Aufgabe ist mathematisch sehr komplex. Bleibt man bei den Vorgaben, so sehen die erzeugten Diagramme meist recht ansprechend aus, nur selten muss man von vornherein eingreifen.

Eine deutliche Schwäche ist dagegen die Gestaltung der Knoten und Knotenbeschriftungen. Es gibt zwar eine Vielfalt von Formen (Shapes), aber einige oft verwendete Formen wie Wolke oder Mauer fehlen, und müssten ggf. als Grafik eingebunden werden. Und um die eigentlich recht alltägliche Aufgabe im letzten Beispiel (Knoten mit mehrzeiliger, linksbündiger Beschriftung und erster Zeile in Fettschrift) zu erledigen, muss gleich der ganze Knoten als HTML-Tabelle gestaltet werden. Besonders letzteres finde ich ziemlich nervig, aber vielleicht ändert sich das ja noch in der Zukunft, denn DOT wird laufend weiterentwickelt.

Ein anderes Manko ist die Problematik der Verbindung von Untergraphen. Dies ist grundsätzlich möglich, aber recht komplex und variiert zwischen veschiedenen Algorithmen.

Klassische Organigramme und andere streng hierarchische Diagramme gestalten sich ebenfalls etwas schwierig. Zwar bilden die einzelnen DOT-Algorithmen ein solches Diagramm inhaltlich korrekt ab, es kann aber passieren, dass der Azubi optisch neben dem Abteilungsleiter landet, weil unten kein Platz mehr war. Hier gibt es ein paar Tricks, aber toll ist es nicht gerade.


Die Praxis


DOT ist gut geeignet, um schnell und einfach Diagramme zu erstellen, und das Ergebnis ist meist recht ansehnlich. Die Kompelxität des Diagramms spielt dabei nur eine untergeordnete Rolle, auch sehr komplexe Aufgaben kann DOT gut abbilden.

Als "Malprogramm" für extrahübsche Diagramme ist es aber nicht wirklich gedacht und auch nur begrenzt geeignet. Hier hängt viel davon ab, wie tief sich der Anwender in die Sprache einarbeitet, und wie leicht er oder sie Feedback zum Aussehen der Grafiken erhalten kann. Wer sich noch mit Bildschirmlupe, Farbumkehrung und sonstigen Hilfen ein Bild vom Ergebnis machen kann, der kann auch viel alleine optimieren.

Ich jedenfalls bin glücklich, meinen Kunden und Kollegen jetzt wieder "kein Problem" antworten zu können, wenn ich nach einem Diagramm gefragt werde. Besonders charmant finde ich es, ein solches Diagramm während einer Besprechung gleich "mitschreiben" und auf Knopfdruck vorführen zu können.


Die Technik


Mit GraphViz kommt auch eine Benutzeroberfläche für die Erstellung der DOT-Dateien und ihre Anzeige als Grafik. Diese ist aber leider, zumindest mit NVDA, komplett unzugänglich. Eine ausführliche Suche nach einer Alternative habe ich noch nicht durchgeführt, stattdessen habe ich mir meinen eigenen Werkzeugsatz erstellt, der allerdings deutlich technischer ausfällt.

Als Editor für die Quelltexte nehme ich wie immer mein Schweizer Taschenmesser namens Notepad++ (sehr empfohlen, aber wenn möglich auf Englisch nutzen, in der aktuellen Version sind die deutschen Tastenkombis völlig verworren). Das grafische Ergebnis lasse ich dann durch die dot.exe aus dem HraphViz Paket erzeugen und vom Betriebssystem anzeigen.

Damit es etwas einfacher wird, habe ich in Notepad++ eine Taste mit dem Run-Befehl für die folgende Batch-Datei belegt:

@ECHO OFF

SET format=png
SET outfile="%~d1%~p1%~n1.%format%"
SET logfile="%~d1%~p1%~n1.log"

DEL %outfile%
"C:\Program Files (x86)\Graphviz2.34\bin\dot.exe" -T%format% -o%outfile% %1 >%logfile% 2>&1

FIND /I "error" %logfile%
IF %ERRORLEVEL% EQU 0 (%logfile%) ELSE (%outfile%)


Diese Batchdatei erzeugt aus der als Parameter übergebenen DOT-Datei eine PNG-Grafik unter dem Namen . im gleichen Verzeichnis wie die DOT-Datei, und ruft diese mit dem Standardprogramm auf. Tritt bei der Erstellung ein Fehler auf, so wird anstatt der Grafik die Logdatei (.log) angezeigt, die übrigens immer erzeugt wird.

Um diese Batch-Datei in Notepad++ einer Taste zuzuweisen, muss man sie als "run"-Befehl speichern. Die Syntax für den Aufruf lautet:

C:\BIN\dot_preview.bat "$(FULL_CURRENT_PATH)"


Integration in Microsoft Visio


Mit GraphVizio gibt es ein freies Addin für Microsoft Visio, um demselben DOT beizubringen. Ich habe dieses noch nicht getestet, möchte es hier aber schon mal erwähnen, da es die Zusammenarbeit mit Kollegen vermutlich deutlich vereinfachen kann.


Ein Tipp zum Abschluss


Wer DOT ernsthaft einsetzen möchte, der sollte sich unbedingt mit den verschiedenen Ausgabeformaten beschäftigen. So kann GraphViz beispielsweise SVG (Scalable Vector Graphics) erzeugen, die nicht nur frei skalierbar sind, sondern auch mit gewissen Einschränkungen mit dem Screereader lesbar sind, und das selbst mit der normalen Windows Bildanzeige.

Keine Kommentare:

Kommentar veröffentlichen