3 Konfiguration & Programmierung

3.1 Die Konfigurationsdateien
3.2 Wichtige globale Variablen
3.3 Wichtige Prozeduren
3.4 Ein Beispiel

MAINPAGE

3.1 Die Konfigurationsdateien

GRAPHitty ist 'hochgradig' konfigurierbar. Da das Hauptprogramm in der gleichen Umgebung läuft wie die Shell, kann zur Laufzeit die gesamte Applikation verändert werden. Dank Tcl/Tk können so Tastaturbelegungen, Buttons und Menuleisten ohne größeren Aufwand dem eigenem Geschmack angepasst werden. Hierzu gibt es zwei Konfigurationsdateien, die von GRAPHitty beim Start interpretiert werden - gy_profile.ini und gy_rc.ini. Der Unterschied zwischen diesen beiden Dateien ist der Zeitpunkt, an dem GRAPHitty sie interpretiert. gy_profile.ini wird vor dem ersten Hochfahren von GRAPHitty interpretiert. D.h. globale Variablen, die in dieser Datei gesetzt werden, 'wirken' schon beim ersten Hochfahren. Dies ist vorteilhaft, wenn Fenstergröße, Shellgröße oder Farben konfiguriert werden sollen. Andererseits hat zu diesem Zeitpunkt noch keine Initialisierung der Oberfläche stattgefunden; d.h. die Menuleiste, das Buttonfeld, etc. existieren noch nicht. Neue Buttons, Menuleisteneinträge oder andere Skripte, die sich auf Objekte des Editors beziehen, sollten hier nicht hineingeschrieben werden.
gy_rc.ini wird nach der Initialisierung von GRAPHitty interpretiert. Änderungen von globalen Variablen, die das Erscheinungsbild des Editors beeinflussen, haben in dieser Datei keinen Effekt. Allerdings können in dieser Datei die Objekte der Editoroberfläche beeinflußt werden, wie z.B. neue Buttons erzeugen oder Menueinträge manipulieren. Beispiele für den Gebrauch der beiden Konfigurationsdatein können Sie den Dateien im Installationsverzeichnis selbst entnehmen. Bei einer Multiuser-Installation wird zunächst im HOME-Verzeichnis des users nach den beiden Dateien gesucht. Werden sie nicht gefunden, so sourced GRAPHitty die standard Dateien im Installationspfad oder verwendet die intern voreingestellten Werte. In beiden Dateien sowie in der Shell können sämtliche Tcl/Tk, Tgl Befehle und einige GRAPHitty-Prozeduren interpretiert werden.

TOP

3.2 Wichtige globale Variablen

Die meisten hier aufgeführten Variablen beeinflussen größtenteils das äußere Erscheinungsbild von GRAPHitty. Wenn Sie permanente Veränderungen vornehmen wollen, so tuen Sie dies am besten in der gy_profile.ini Datei.





Variable Init Value Funktion
G - Beinhaltet den internen Namen des aktuellen Graphen. Wenn Operationen über die Shell ausgeführt werden, sollte immer diese Variable als Argument für den aktuellen Graphen angegeben werden. Explizite Namen sind nicht sicher, da sie häufig variieren.
Ist erst nach der Initialisierung von GRPHitty existent!
prim - Beinhaltet den internen Namen der aktuellen primary selection. Wenn Operationen über die Shell ausgeführt werden, sollte immer diese Variable als Argument für die aktuelle primary selection angegeben werden. Explizite Namen sind nicht sicher, da sie häufig variieren.
Ist erst nach der Initialisierung von GRPHitty existent!
sec - Beinhaltet den internen Namen der aktuellen secondary selection. Wenn Operationen über die Shell ausgeführt werden, sollte immer diese Variable als Argument für die aktuelle secondary selection angegeben werden. Explizite Namen sind nicht sicher, da sie häufig variieren.
Ist erst nach der Initialisierung von GRPHitty existent!
ScrollbarSize 10 Bestimmt die Größe der Scrollbars
ButtonTableWidth 15m Bestimmt die Breite der Buttons.
BorderWidth 1 Bestimmt die Breite des Randes um alle Objekte.
WorkspaceBackgroundColor lightGrey Bestimmt die Farbe des Hintergrundes des Workspace.
ShellBackgroundColor black Bestimmt die Farbe des Hintergrundes der Shell.
ShellForegroundColor green Bestimmt die Farbe des Vordergrundes der Shell.
ShellHeight 25 Bestimmt die Höhe der Shell.
NodeSize 10 Bestimmt den Radius eines Knotens bei 1:1 Zoom.
zoom 1 Bestimmt die voreingestellte Stärke für den Zoom.
EdgeWidth 1 Bestimmt die Stärke der Kanten.
SelectEdgeWidth 1 Bestimmt die Stärke der Kanten, wenn sie sich unter dem Mauscursor befinden.
EdgeSpace 50 Bestimmt den Abstand zwischen Mehrfachkanten.
hide_node_attr "item" Eine Liste der Knotenattribute, die in GRAPHitty nicht angezeigt werden. "item" sollte hier immer enthalten bleiben, da dieses Attribut systeminterne Werte beinhaltet und auf keinen Fall manuell verändert werden darf.
hide_edge_attr "item" Eine Liste der Kantenattribute, die in GRAPHitty nicht angezeigt werden. "item" sollte hier immer enthalten bleiben, da dieses Attribut systeminterne Werte beinhaltet und auf keinen Fall manuell verändert werden darf.
NodeOutlineColor black Bestimmt die Umrissfarbe eines Knotens.
NodeFillColor white Bestimmt die Füllfarbe eines Knotens.
EdgeColor black Bestimmt die Farbe der Kanten.
SelectPrimColor red Bestimmt die Farbe der Objekte, die sich in der primary selection befinden.
SelectSecColor blue Bestimmt die Farbe der Objekte, die sich in der secondary selection befinden.
SelectBothColor red Bestimmt die Farbe der Objekte, die sich in der primary und der secondary selection befinden.
geom 90x30 Bestimmt die Geometrie des Hauptfensters (Höhe, Breite und Position).
helpdir /usr/local/ bin/GRAPHitty/help Gibt den Pfad zum help Verzeichnis von Graphitty an. Muß richtig gesetzt sein, damit GRAPHitty einwandfrei arbeiten kann.
gydir /usr/local/ bin/GRAPHitty Gibt den Pfad zum Stammverzeichnis von Graphitty an. Muß richtig gesetzt sein, damit GRAPHitty einwandfrei arbeiten kann.

TOP

3.3 GRAPHitty Prozeduren


Dies sind wichtige GRAPHitty-interne Tcl-Prozeduren, die auch vom Anwender bedenkenlos verwendet werden können. Sie erleichtern das Programmieren in GRAPHitty, da die Veränderungen im Datensatz gleich visualisiert werden. Sie können allerdings auch direkt in Tgl programmieren und Veränderungen an den Stellen 'refreshen'(siehe rebuild), an denen Sie es für nötig erachten. Die hier aufgeführten Befehle sind, wie schon erwähnt Prozeduren. Im Unterschied zu den Tgl-Befehlen sind sie selbst in Tgl geschrieben. Aus diesem Grund sind die Prozeduren hier mit ihren Prozedur Köpfen aufgeführt. Die geschweiften Klammern um den Argument Teil muß beim Aufruf weggelassen werden.
Desweiteren können die meisten Menupunkte über Prozeduren aufgerufen werden, die dem Pfad der Operation gleichen. So kann z.B. der Menupunkt Graph speichern via file.save_as aufgerufen werden.

note [w:window} [title:string} [text:string]
yesno [w:window] [title:string] [text:string] [buttontext1:string] [buttontext2:string]
getstring [w:window] [title:string] [prompt:string] [buttontext1:string] [buttontext2:string] [default:string]
get2strings [w:window] [title:string] [prompt1:string] [prompt2:string] [buttontext1:string] [buttontex2:string] [default1:string] [default2:string]
do_attr_menu
shellRedraw
zoom [scale:float]
new_node [x:integer] [y:integer]
new_edge [From:selection] [To:selection]
put [out:string]
do [this:script]
select_prim [S:selection]
add_prim [S:selection]
select_sec [S:selection]
add_sec [S:selection]
rebuild

MAINPAGE
TOP

note [w:window} [title:string} [text:string]

FUNKTION:
Erzeugt in w ein Fenster mit text title und OK-Button.
BEISPIEL:
note .d "Hello World!" "primary selection is $prim"
Prozeduren
TOP

yesno [w:window] [title:string] [text:string] [buttontext1:string] [buttontext2:string]

FUNKTION:
Erzeugt in w ein Fenster mit text title YES- und NO-Buttons um einen Vorgang zu bestätigen oder abzubrechen. In $status steht nach betätigen eines Button 'yes' oder 'no'.
BEISPIEL:
proc yesnowin {} { global status yesno .d "Hello World!" "Press button yes or no !" YES NO if {$status=="ok"} { put "button YES pressed!" } else { put "button NO pressed!" } } yesnowin
Prozeduren
TOP

getstring [w:window] [title:string] [prompt:string] [buttontext1:string] [buttontext2:string] [default:string]

FUNKTION:
Erzeugt in w ein Fenster mit text title, einem Eingabefeld mit Prompt und dem default-Eintrag, sowie zwei Buttons mit buttontext1 und buttontext2. In $status steht nach betätigen eines Buttons 'yes'(Button1 gedrückt) oder 'no'(Button2 gedrückt). In $input1 steht dann der Inhalt des Eingabefeldes.
BEISPIEL:
proc getstringwin {} { global status global input1 getstring .d "Hello World!" "enter something!" OK CANCEL "like this" if {$status=="ok"} { put "button OK pressed!" } else { put "button CANCEL pressed!" } put "You entered $input1" } getstringwin
Prozeduren
TOP

get2strings [w:window] [title:string] [prompt1:string] [prompt2:string] [buttontext1:string] [buttontex2:string] [default1:string] [default2:string]

FUNKTION:
Erzeugt in w ein Fenster mit text title, zwei Eingabefeldern mit prompt1 und prompt2 und den default-Einträgen default1 und default2, sowie zwei Buttons mit buttontext1 und buttontext2. In $status steht nach betätigen eines Buttons 'yes'(Button1 gedrückt) oder 'no'(Button2 gedrückt). In $input1 und $input2 steht dann der Inhalt der Eingabefelder.
BEISPIEL:
proc get2stringswin {} { global status global input1 global input2 get2strings .d "Hello World!" "enter" "something!" OK CANCEL "like this" "or this" if {$status=="ok"} { put "button OK pressed!" } else { put "button CANCEL pressed!" } put "You entered $input1" put "and $input2" } get2stringswin
Prozeduren
TOP

do_attr_menu

FUNKTION:
Wenn via Tgl Veränderungen an den Attributen der Graphenobjekte vorgenommen wurden, d.h. Attribute hinzugefügt oder entfernt wurden, so können mit dieser Prozedur die Einträge in den Attributmenus aktualisiert werden.
BEISPIEL:
$G new node_attr spin vert

# Zu diesem Zeitpunkt ist das neue Attribut noch nicht im Editor erkennbar

do_attr_menu

# erst jetzt ist das neue Attribut im Editor sichtbar
Prozeduren
TOP

shell_redraw

FUNKTION:
Wenn Veränderungen an den Umgebungsvariablen vorgenommen wurden, die die Shell beeinflussen, so kann mit diesem Befehl ein Redraw der Shell erzwungen werden, so daß die neu gesetzten Werte Wirkung zeigen.
BEISPIEL:
set $ShellHeight 10; shell_redraw;
Prozeduren
TOP

zoom [scale:float]

FUNKTION:
Zoomt die Workspace auf den durch scale angegebenen Faktor.
BEISPIEL:
# zoomt auf zweifache Vergößerung
zoom 2;
Prozeduren
TOP

new_node [x:integer] [y:integer]

FUNKTION:
Erzeugt im aktuellen Graphen an den Stellen x y einen neuen Knoten und zeichnet ihn.
BEISPIEL:
# erzeugt eine Linie von Knoten for {set i 0} {$i<100} {incr i +20} { new_node $i $i}
Prozeduren
TOP

new_edge [From:selection] [To:selection]

FUNKTION:
Erzeugt im aktuellen Graphen neue Kanten von allen Knoten in From zu allen Knoten in To (selections)und zeichnet sie.
BEISPIEL:
# erzeugt eine Linie von Knoten mit Kanten set from [new_node 10 200] for {set i 100} {$i<500} {incr i +50} { set to [new_node $i $i] new_edge $from $to set from $to }
Prozeduren
TOP

put [out:string]

FUNKTION:
Schreibt out in die Shell.
BEISPIEL:
put "Hello World!"
Prozeduren
TOP

select_prim [S:selection]

FUNKTION:
Macht alle Objekte in S zur primary selection.
BEISPIEL:
select_prim $neuer_knoten
Prozeduren
TOP

add_prim [S:selection]

FUNKTION:
Fügt alle Objekte in S zur primary selection hinzu.
BEISPIEL:
add_prim $neuer_knoten
Prozeduren
TOP

select_sec [S:selection]

FUNKTION:
Macht alle Objekte in S zur secondary selection.
BEISPIEL:
select_sec $neuer_knoten
Prozeduren
TOP

add_sec [S:selection]

FUNKTION:
Fügt alle Objekte in S zur secondary selection hinzu.
BEISPIEL:
add_sec $neuer_knoten
Prozeduren
TOP

rebuild

FUNKTION:
Registriert alle Veränderungen im Datensatz und zeichnet den Graphen neu. Dies ist die sicherste Methode um Veränderungen duch Tgl-Befehle sichtbar zu machen.
BEISPIEL:
set from [$G new node] $from set node_attr x 100 $from set node_attr y 100 set to [$G new node] $to set node_attr x 300 $to set node_attr x 300 $G new edge $from $to # zu diesem Zeirpunkt sind die Neuen Objekt noch nicht im Editor # sichtbar rebuild # erst jetzt registriert der Editor die neuen Objekte und stellt # sie dar
Prozeduren
TOP




3.4 Ein Beispiel

Im folgenden wird anhand eines Beispiels gezeigt, wie eigene Funktionen zu GRAPHitty hinzugefügt werden können. Es soll ein Button erstellt werden, mit dem man alle die Knoten anwählt, die von den Knoten in der primary selection einen Schritt weit enfernt sind, d.h. die Knoten, die die Zielknoten der austretenden Kanten sind.



  • Zunächst muß eine Prozedur geschrieben werden, die eben diese Aufgabe erfüllt. Um die Prozedur möglichst allgemein verwendbar zu machen, wird ihr eine selection übergeben, die die Knoten enthält, auf die die Operation ausgeführt werden soll. In diesem Fall wird das später immer die primary selection sein. Soll die Operation auch für die secondary oder andere selections realisiert werden, so veraendern sich lediglich die Argumente.
    Geben Sie nun folgende Prozedur ein:
    proc step_out { S } { set ERG [$S clone] $ERG select outs $ERG select targets select_prim $ERG put "\n... steped out" }
  • Jetzt kann die Prozedur aufgerufen werden; z.B. mit

    step_out $prim

    Um eine Wirkung sehen zu können, muß in der primary selection mindestens ein Knoten mit ausgehender Kante enthalten sein.

  • Dieser Prozeduraufruf kann nun auf einen Button gelegt werden. Dies geschieht in den folgenden Zeilen

    button .step_out_btn -text "Step Out" -borderwidth $BorderWidth -background #dd8 -command { step_out $prim } pack .step_out_btn -in .buttons -side top -fill x
  • Um den Button schon beim Start von GRAPHitty auf dem Bildschirm zu haben, können die obigen Zeilen in die gy_rc.ini eingetragen werden.
    Sollte Ihnen der Button nicht mehr gefallen, so können Sie ihn mit

    destroy .step_out_btn

    wieder löschen.

  • Das folgende Skript zeigt nun noch, wie die Alt-Taste mit der step_out Prozedur belegt werden kann. Im unterschied zu dem zuvor beschriebenen Skript für den Button wird hier die step_out Prozedur nicht mit der gesamten primary selection aufgerufen, sondern nur mit dem aktuellen Objekt. Dies ist das Objekt, daß sich unter dem Mauszeiger befindet. Um den Namen einer selection zu erhalten, in der das aktuelle Objekt enthalten ist, kann der Ausdruck [getobj [.c find withtag current]] verwendet werden. In dem unteren Skript wird lediglich noch die Möglichkeit abgefangen, daß es kein aktuelles Objekt gibt, d.h.,daß der Mauszeiger auf kein Objekt zeigt.

    bind .c { set cur_obj [.c find withtag current] if { $cur_obj != "" } { step_out [getobj $cur_obj] } }