Das bißchen Script-Fu macht sich von allein … (Part 1) | von Clara Fall

Antworten
Benutzeravatar
Gimplyworxs
Beiträge: 2817
Registriert: Sa 22. Aug 2020, 09:11
Wohnort: Crailsheim, BaWü
Deine Galerie: https://gimp-werkstatt.de/werkstatt-galerie/gimplyworxs
Betriebssystem: Linux Mint 20.1 MATE

Das bißchen Script-Fu macht sich von allein … (Part 1) | von Clara Fall

Beitrag von Gimplyworxs »

ClaraFall
aktiv 05.07.2011 - 29.03.2014

Leider ist ClaraFall nicht mehr aktiv in der GIMP-Werkstatt. Wir halten ihre /seine Arbeiten aber in Ehren.

Dieses Tutorial entstand am: Sa 10. Mär 2012

Hallo Ihr Lieben

Heute möchte ich Euch einladen, gemeinsam mit mir die ersten Schritte in Skript-Fu zu unternehmen. Da ist nichts Mystisches oder Unüberwindliches. Es ist nur ein wenig Engagement und etwas Ausdauer gefragt. Außerdem ist es wie überall, je tiefer Ihr eintaucht, um so einfacher wird es.
Und wenn selbst ich es geschafft habe mal ein Skript zu schreiben, dann schafft Ihr das alle Mal.

Wer neben der Arbeit und der GIMP-Werkstatt noch Sachen erledigen kann wie: Familie versorgen, Wäsche waschen, bügeln, zusammenlegen und wegräumen, einkaufen, kochen, backen, putzen, Urlaub planen usw. usw. … eben das bißchen Haushalt, für den ist das bißchen Script-Fu echt nur ein Klacks.

Und die Herren der Schöpfung schaffen doch sowieso alles mit links. Also keine Angst!
Script-Fu ist irgendwann mal von Menschen für Menschen geschrieben worden.
Und da die meisten von uns ja dieser Gattung angehören, sollte es möglich sein durch ein klein wenig Einarbeitung mit dieser GIMP-Skriptsprache klar zu kommen.

Man (und Frau natürlich auch) sollte sich nur nicht sofort übernehmen, sondern immer in überschaubaren Regionen bleiben. Also kleine Teilziele abstecken und erreichen.
und dadurch nebenbei viele Erfolgserlebnisse erzielen.
Deshalb werden wir dieses Tutorial auch in mehrere überschaubare Teile aufsplitten.
Arbeitet die einzelnen Abschnitte in aller Ruhe durch, eventuell auch ein zweites oder drittes Mal. Bis Ihr es verstanden habt. Hier gibt es keinen Preis für das schnellste Durcharbeiten der Anleitung. Aber es wird jeder gewinnen, der am Ende sagen kann, daß alles verstanden wurde.

Und sollte es mal wirklich nicht weitergehen, sage ich immer:
"Fragen kostet nichts, außer vielleicht ein wenig Überwindung!"


Dann wollen wir mal loslegen.

Nein wir programmieren nicht, noch nicht, sondern überlegen uns erst einmal, was unser Skript überhaupt anstellen soll?
Auf einen Vorschlag hin von eibauoma soll es ein Skript werden, das Hilfslinien setzt.
Jetzt werden einige sagen, daß es so etwas ja schon gibt. Na klar, ABER wir wollen es ja nicht gleich zu kompliziert angehen und auch beim "Hilfslinien setzen" läßt sich noch einiges verbessern bzw. den persönlichen Vorlieben anpassen.

1. Überlegungen sollten sein, was mit Hilfslinien alles gemacht werden kann:
  • Sie können horizontal oder vertikal gesetzt werden
  • Die Positionen können in Pixel oder Prozent angegeben werden
  • Sie können immer nur einzelne gesetzt werden
  • Sie können gelöscht werden
  • Sie können aus einer Auswahl erzeugt werden
2. Überlegungen, was soll unser Skript vielleicht können können
  • Bei Bedarf alle oder bestimmte Hilfslinien löschen, bevor neue gesetzt werden, je nachdem, ob eventuell vorhandene Hilfslinien weiter benötigt werden oder nicht.
  • Es sollten einzelne oder mehrere Linien gleichzeitig gesetzt werden können und das sowohl horizontal, wie auch vertikal.
  • Die Abstände sollten wahlweise prozentual oder fest angegeben werden können.
  • Die Abstände für horizontale und vertikale Hilfslinien sollen gleichzeitig gesetzt werden können oder einzeln und getrennt.
  • Hilfslinien aus einer Auswahl soll auch oder nur gesetzt werden können
  • Eine bestimmte Anzahl an Hilfslinien sollen gleichmäßig horizontal oder vertikal mit oder ohne Randbegrenzung verteilt werden.
Um nur mal einige Möglichkeiten aufzuzählen. Ihr habt garantiert noch weitere Ideen.
Ob wirklich alles Nötig ist, ob damit nicht vielleicht die Handhabbarkeit und Übersichtlichkeit verlorengeht, das muß alles im Vorfeld entschieden werden. Änderungen oder neue Ideen (die meist nicht ausbleiben) im nachhinein mit einzubauen, ist oft schwieriger, als das Projekt neu zu erstellen.

Also ganz Wichtig:
Im Vorfeld ausreichend Gedanken machen, erspart viel Arbeit!



...

Editor

Bevor wir nun gleiiich loslegen, müssen wir noch kurz über das Werkzeug sprechen (bzw. schreiben).
Script-Fu ist eine Sprache, die von Sheme abgeleitet wurde. Um Scripte zu schreiben wird ein Texteditor benötigt, der Dateien im DOS- bzw. "UTF-8-ohne BOM" Format speichern kann.
Wichtig ist, das das Script dann nicht die Endung TXT bekommt sondern SCM.
Auch ist der Speicherort entsprechend den GIMP – Einstellungen vorzunehmen, oder das Skript muß nach dem Speichern ständig in den Scriptordner kopiert werden.
Am sinnvollsten ist es einen neuen Script-Fu-Entwicklungsordner anzulegen, in dem Ihr Eure Scripte erstellt. Damit GIMP die Scripte auch testen kann, wird dieser Ordner unter Bearbeiten/Einstellungen/Ordner/Skripte hinzugefügt.
Dort bleibt das Skript während der gesamten Bearbeitung. Ist es irgendwann fertig und ausgetestet, kann es in einen anderen Skriptordner verschoben werden.
So bleibt die Übersicht gewahrt.
Im Linuxbereich kenne ich mich leider nicht aus.
Unter Windows würde der Editor/Notepad oder WordPad reichen. Diese Editoren sind aber nicht wirklich zu empfehlen. Wer nicht zufällig schon etwas Professionelleres hat, für den wäre Notepad++ (Notepad plus plus) geeignet.
Nicht nur, das es Freeware ist und damit nichts kostet, er bietet noch eine Menge weiterer Vorteile wie z.B.:
  • Automatisches Erstellen von Sicherungskopien;
    Wenn ein Skript nach einer intensiven Bearbeitung nicht mehr funktionieren sollte, ist es manchmal besser auf eine ältere funktionierende Version zurückzugreifen und die letzten Schritte zu wiederholen, als stundenlanges Fehlersuchen.
    Notepad++ kann bei jedem Speichern auch eine Sicherheitskopie erzeugen.
  • Syntaxhervorhebung;
    Durch farbliche Unterscheidung verschiedener Bereiche wird die Übersichtlichkeit des Skriptes verbessert.
    Notepad++ kennt Sheme
  • Anzeige von Klammerpaaren;
    Es wird behauptet Script-Fu ist eine Klammersprache. So gut wie alles steht in Klammern und für jede sich öffnende Klammer muß auch eine schließende Klammer gesetzt werden. Sollte das einmal vergessen werden, wird das Script nicht geladen bzw. es gibt eine entsprechende Fehlermeldung:
    Notepad++ zeigt immer die korrespondierenden Klammer an

...

Script-Fu

Ein Script-Fu-Script besteht aus mindestens drei Teilen.
Der erste Teil ist natürlich das Skript. Hier werden alle Befehle bzw. Anweisungen gegeben, die GIMP zu erledigen hat.

Dieses Skript wird von Euch ja neu erfunden, es wird sozusagen neu definiert. Deshalb beginnt ein Script natürlich mit einer Klammer, gefolgt von dem Wort "define" und dem Namen des Skriptes, selbstredend auch in Klammern, und einer schließenden Klammer für das "define"-ende. Das Ganze würde in etwa so aussehen:

Code: Alles auswählen

(define (script-fu-name)    ; hier beginnt das Script "script-fu-name"
)                           ; und hier endet das Script "script-fu-name"
Ein Semikolon leitet einen Kommentar ein. Dieser wird von GIMP einfach ignoriert, hilft aber beim Entwickeln, da hiermit Notizen gemacht werden können. Das eigentliche Programm sieht nur so aus:

Code: Alles auswählen

(define (script-fu-name)
)
Der Rest oben soll nur als Hinweis dienen, was eigentlich gerade passiert. So kann z.B. auch in einem halben Jahr nachgelesen werden, was das Skript an bestimmten Stellen gerade macht.
Arbeitet also viel mit dem Semmelklown, aber paßt auf, daß Ihr es nicht VOR einen Befehl setzt, denn dann wird dieser nicht mehr ausgeführt.

Folgende Zeilen würden einen Fehler erzeugen, da das Kommentarzeichen vor der schließenden Klammer steht. GIMP würde sagen mit fehlt eine Klammer.

Code: Alles auswählen

(define (script-fu-name)   ; hier beginnt das Script "script-fu-name"
;)                         ; und hier endet das Script "script-fu-name"
Für den Namen hat es sich eingebürgert ihn mit "script-fu-" beginnen zu lassen.
Das ist für die Funktionalität nicht zwingend nötig, erhöht aber die Übersichtlichkeit in GIMP.
Unser Script könnte dann z.B. so aussehen:

Code: Alles auswählen

(define (script-fu-hilfslinien)    ; hier beginnt "script-fu-hilfslinien"
)                                  ; und hier endet "script-fu-hilfslinien"



Soviel heute erst einmal zum Skriptteil.
Die anderen beiden Teile dienen dazu, das Script einzulesen und GIMP zur Verfügung zu stellen.

Da wäre Teil 2:

(script-fu-register)

Hiermit wird GIMP veranlaßt das Script einzulesen. Dieser Anweisung müssen einige Daten (Parameter) übergeben werden. Die ersten 7 sind fest vorgegeben. Die restlichen hängen davon ab, was das Skript erledigen soll. Dazu komme ich dann später noch.
GIMP ist es dabei egal, ob die Parameter nebeneinander oder untereinander angegeben werden. Der Übersichtlichkeit halber hat sich hier die Schreibweise untereinander favorisiert.

Hier mal ein Beispiel.:

Code: Alles auswählen

(script-fu-register                ; GIMP-Anweisung
   "script-fu-hilfslinien"         ; Der Name des Skriptes
   "Hilfslinien"                   ; Anzeigename unter GIMP
   "Hilfslinienmanagement"         ; Kurze Skriptbeschreibung
   "Mein Name"                     ; Autor des Skriptes
   "Copyleft Mein Name"            ; Copyright
   "29.01.2012"                    ; Erstellungsdatum
   "RGB* GRAY* INDEXED*"           ; Bildtypen 
)

Der 3. und letzte Teil ist:

(script-fu-menu-register)

Wie Ihr vielleicht schon am Namen erkannt habt, ist diese Anweisung dafür da, GIMP mitzuteilen, wo das Skript in der Menüstruktur auftauchen soll. Die Syntax lautet:

(script-fu-menu-register "script-fu-name" "GIMP-Menüeintrag")

Da unser Script ja script-fu-hilfslinien heißt und wir es schnell wieder finden wollen, könnte unsere Zeile z.B. so aussehen:

Code: Alles auswählen

(script-fu-menu-register "script-fu-hilfslinien" "<Image>/SCRIPTE")
<Image> bedeutet so viel wie in der Menüleiste. SCRIPTE dahinter heißt; lege in der Menüleiste ein Menü "SCRIPTE" an und dahinein plaziere unser Script "Hilfslinien".


Unser bisheriges Script könnte also z.B. so aussehen:

Code: Alles auswählen

; Teil 1 Das Script
;======================================================
(define (script-fu-hilfslinien)    ; hier beginnt "script-fu-hilfslinien"
)                                  ; und hier endet "script-fu-hilfslinien"

; Teil 2 Registrierung des Skriptes
;======================================================
(script-fu-register                ; GIMP-Anweisung
   "script-fu-hilfslinien"         ; Der Name des Skriptes
   "Hilfslinien"                   ; Anzeigename unter GIMP
   "Hilfslinienmanagement"         ; Kurze Skriptbeschreibung
   "Mein Name"                     ; Autor des Skriptes
   "Copyleft Mein Name"            ; Copyright
   "29.01.2012"                    ; Erstellungsdatum
   "RGB* GRAY* INDEXED*"           ; Bildtypen 
)

; Teil 3 Festlegen der Menüstruktur
;======================================================
 (script-fu-menu-register "script-fu-hilfslinien" "<Image>/SCRIPTE")
Wenn wir das jetzt speichern, GIMP neu starten bzw. Script-Fu auffrischen, dann sollte es einen Menüpunkt SCRIPTE in der Menüleiste geben.
Und wenn wir darauf klicken wird unser Skript Hilfslinien angezeigt.
Wenn wir darauf klicken, passiert natürlich nichts, weil in unserem Skript ja noch keine Befehle enthalten sind, es wird ja nur gestartet und sofort wieder beendet.
Wichtig ist nur, daß GIMP es bereits kennt.
Verändert ruhig einmal den Namen SCRIPTE z.B. in.

Code: Alles auswählen

(script-fu-menu-register "script-fu-hilfslinien" "<Image>/Meine Skripte")
oder

Code: Alles auswählen

(script-fu-menu-register "script-fu-hilfslinien" "<Image>/Meine Skripte/Helferlein")
oder

Code: Alles auswählen

(script-fu-menu-register "script-fu-hilfslinien" "<Image>/Hier/Hier/Hier")
Denkt Euch etwas Eigenes aus und testet es.
Ihr müßt nur nach jeder Änderung speichern und Script-Fu aktualisieren.

So seid Ihr in der Lage Euer Skript ganz exakt in der Menüleiste zu positionieren und natürlich auch es wieder zu finden.

Jetzt wißt Ihr auch was Ihr machen könnt, wenn Ihr mal ein fremdes Skript benutzen möchtet, es in GIMP aber nicht findet. Ihr schaut einfach in die SCM-Script-Datei und sucht die script-fu-menu-register-Zeile und schon könnt Ihr den Ort auslesen. Ihr könnt die Position sogar anpassen indem Ihr einfach selber festlegt, wo das Skript im Menü zu erscheinen hat.


...

Register

Jetzt möchte ich wie versprochen noch einmal ein wenig näher auf den 2. Teil eines Script-Fu-Skriptes "(script-fu-register)" eingehen.

Code: Alles auswählen

; Teil 2 Registrierung des Skriptes
;======================================================
(script-fu-register                ; GIMP-Anweisung
   "script-fu-hilfslinien"         ; Der Name des Skriptes
   "Hilfslinien"                   ; Anzeigename unter GIMP
   "Hilfslinienmanagement"         ; Kurze Skriptbeschreibung
   "Mein Name"                     ; Autor des Skriptes
   "Copyleft Mein Name"            ; Copyright
   "29.01.2012"                    ; Erstellungsdatum
   "RGB* GRAY* INDEXED*"           ; Bildtypen 
)
Wie bereits gesagt, sind die ersten 7 Parameter festgelegt, die da wären:
  • 1. Der Name des Skriptes, das registriert werden soll.
    Es ist der Name Eures definierten Skriptes.
    Er wird ebenfalls von "(script-fu-menu-register)" benutzt.
    Unter diesem Namen wird das Skript auch im Prozeduren-Browser von GIMP angezeigt.
    Zum Prozeduren-Browser kommen wir in einem späteren Teil.
    Benutzt für den Namen bitte keine Umlaute.

    2. Anzeigename unter GIMP.
    Das ist der Name, der in der Menüstruktur angeklickt werden kann, um das Skript zu starten.

    3. Kurze Skriptbeschreibung.
    Diese erscheint in der Statusleiste und in einem Popupfenster, wenn mit der Maus ein wenig über dem Anzeigenamen verweilt wird.

    4. Name des Skriptautors.
    Also Euer Name, auch diese Information wird für den Prozeduren-Browser benötigt

    5. Copyright
    und

    6. Erstellungsdatum
    Landen ebenfalls im Prozeduren-Browser

    7. Bildtypen.
    Das sind die Bildtypen, bei denen das Skript gestartet werden darf. Da Hilfslinien überall benutzt werden sollen, geben wir hier auch alle Bildtypen an.

Zu Beginn hatten wir Überlegungen angestellt, was unser Skript machen soll. Dafür müssen wir aber mit dem Skript interagieren können, denn wir müssen dem Skript ja mitteilen:
  • Ob vorhandene Hilfslinien zuerst gelöscht werden sollen oder nicht
  • Wie viele Hilfslinien gesetzt werden sollen
  • Sollen Horizontale oder Vertikale oder Beide berücksichtigt werden
  • Usw. usf.
Für derartige Eingaben ist auch "(script-fu-register)" zuständig. Dafür gibt es einige Parameter, von denen ich Euch die erläutern möchte, die wir für unser Skript benötigen.


SF-TOGGLE

Es wird ein Kontrollkästchen angezeigt, in das ein Häkchen gesetzt werden kann oder nicht.
Das heißt hier kann eine Auswahl getroffen werden in der Art "Aktiv/Nicht Aktiv" oder "Ja/Nein"
Wir könnten z.B. schreiben:

Code: Alles auswählen

SF-TOGGLE "Sollen zuerst alle Hilfslinien gelöscht werden "" TRUE
Der Text hinter SF-TOGGLE wird als Anzeige dargestellt.
Das TRUE veranlaßt GIMP den Haken bei der ersten Anzeige bereits zu setzen.
Sozusagen als Standardwert.
Soll der Haken nicht als Vorgabe gesetzt sein, dann wird statt TRUE einfach FALSE angegeben.
Gebt einmal folgende zwei Zeilen nach den Bildtypen in script-fu-register ein:

Code: Alles auswählen

SF-TOGGLE "Sollen zuerst alle Hilfslinien gelöscht werden" TRUE
SF-TOGGLE "Sollen zuerst alle Hilfslinien gelöscht werden" FALSE
Teil 2 sieht dann also so aus:

Code: Alles auswählen

; Teil 2 Registrierung des Skriptes
;======================================================
(script-fu-register                ; GIMP-Anweisung
   "script-fu-hilfslinien"         ; Der Name des Skriptes
   "Hilfslinien"                   ; Anzeigename unter GIMP
   "Hilfslinienmanagement"         ; Kurze Skriptbeschreibung
   "Mein Name"                     ; Autor des Skriptes
   "Copyleft Mein Name"            ; Copyright
   "29.01.2012"                    ; Erstellungsdatum
   "RGB* GRAY* INDEXED*"           ; Bildtypen 
   SF-TOGGLE "Sollen zuerst alle Hilfslinien gelöscht werden" TRUE
   SF-TOGGLE "Sollen zuerst alle Hilfslinien gelöscht werden" FALSE
)
Speichern – Script-Fu aktualisieren – Skript aufrufen.
Schon haben wir eine Interaktion mit unserem Skript. Wenn wir OK geben, passiert zwar immer noch nichts, aber wir können schon Entscheidungen eingeben.

Wie wir sehen ist ein Häkchen gesetzt und eines nicht. Das Skript interessiert es also gar nicht, wie sinnvoll die Anzeige ist, es macht einfach das, was wir sagen. Es liegt also in der Verantwortung jedes einzelnen, wie die Eingabe aussehen wird.


SF-OPTION

Erzeugt ein Auswahlfeld mit den als Liste übergebenen Werten z.B.:

Code: Alles auswählen

SF-OPTION "Welche Hilfslinien sollen gelöscht werden?" '("Alle" "Alle Horizontalen" "Alle Vertikalen" "Keine") 
Beachtet das einzelne Hochkomma vor der Klammer, damit wird eine Liste definiert (dazu auch mehr in einem späteren Kapitel).
Es wird ein ausklappbares Auswahlfeld erzeugt, hier mit 4 Einträgen. Der erste Eintrag ist der Standardwert. Da hier mehr als zwei Auswahlmöglichkeiten vorhanden sind, erhöht das die Flexibilität des Skriptes, allerdings auch den Bedienaufwand.
Bei Löschen/Nichtlöschen wird ein Klick benötigt bzw. keiner.
Bei 4 Auswahlmöglichkeiten werden eventuell zwei Klicks nötig.
Das hört sich nicht viel an, multipliziert sich aber mit jedem weiteren Parameter.
Dann probiert die Zeile gleich aus. Ändert die Reihenfolge der Liste. Schreibt eigene Listen.


SF-ADJUSTMENT

Erzeugt ein komfortables Auswahlfeld

SF-ADJUSTMENT "Wie viele Hilfslinien sollen gesetzt werden" '(wert min max schritt sprung stelle typ)

Code: Alles auswählen

SF-ADJUSTMENT "Wie viele Hilfslinien sollen gesetzt werden" '(3 0 9999 1 10 0 0)
  • Wert ist der Standardwert in unserem Fall 3
  • Min ist der kleinste Wert, der eingestellt werden kann, hier 0, kleiner wäre unlogisch
  • Max ist der größte Wert, der Eingestellt werden kann, hier 9999, Wie viele Hilfslinien werden wirklich gebraucht
  • Schritt ist die Schrittweite, hier 1 , Hilfslinien sollten schon einzeln einstellbar sein
  • Sprung ist die Sprungweite bei Bild-Auf- oder Bild-Ab-Taste, hier 10.
  • Stelle ist die Nachkommastelle, hier 0, da Hilfslinien keine Nachkommastellen besitzen
  • Typ ist der Auswahlfeldtyp hier 0 es gibt noch die 1. testet mal den Unterschied.
SF-IMAGE

Ist das aktive Bild. Das erscheint zwar nicht in der Interaktionsmaske, wird aber dennoch benötigt, da die Hilfslinien ja in einem Bild gesetzt werden sollen.


Weitere Parameter findet Ihr HIER. Druckt Euch die Tabellen (ziemlich am Ende) aus, da sie immer wieder benötigt werden.
Experimentiert ruhig ein wenig damit herum und probiert die verschiedenen Parameter einmal aus.
Es kann dadurch überhaupt nichts zerstört werden.


Da Ihr jetzt die nötigsten Parameter kennt, könnt Ihr Euch ja mal überlegen, wie Eure Eingabemaske aussehen sollte. Und mit überlegen meine ich natürlich auch gleich mal erstellen.
Was hättet Ihr gerne in Eurem Hilfslinienskript und wie soll die Benutzermaske aussehen.
Ich bin gespannt auf Eure Ergebnisse. Egal ob in Form der Maske oder des Quellcodes.
Am besten natürlich beides!

Setzt bitte in den Scriptnamen Euren Namen mit hinein z.B.

script-fu-clarafall-hilfslinien

Hier sind mal drei Entwürfe von mir als Anregung. Auch um zu zeigen, wie unterschiedlich die Herangehensweise sein kann. Beachtet dabei bitte das Verhältnis von Funktionsumfang, Übersichtlichkeit und Handhabbarkeit.
CFU_Hilfslinien_Demo.zip
(1012 Bytes) 285-mal heruntergeladen
...

Abschluß

So das soll’s für heute erst mal gewesen sein.
Es war jetzt vielleicht ein bißchen mehr Text, also laßt es ruhig ein wenig sacken.
Sollte danach noch etwas nicht klar sein, dann einfach noch mal durchlesen, nacharbeiten und/oder nachfragen.


Liebe Grüße
Clara
Antworten