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] } }