photomappe.de

Kalendarium-Plugin

Das Plugin enthält einige Klassen:

Calendardate - Eine Klasse für die einzelnen Tage eines Monats
Layer        - Eine Klasse für die Bilddaten in Gimp
GimpImage    - Eine Klasse um ein Bild in Gimp zu erzeugen und anzuzeigen
Gimpcalendar - Die Schnittstelle nach aussen, erbt von GimpImage,
               ein Objekt wird vom Plugin erzeugt

Die folgenden Klassen bauen auf der Klasse Layer auf:

GimpcalendarDayabbr - die Abkürzung des Wochentags für jeden Tag
GimpcalendarWeek    - die Kalenderwoche
GimpcalendarDay - erbt von Layer und Calendardate, ein Objekt nimmt
                       alle nötigen Tagen eines Tags auf.

Gimpcalendar

Vom Plugin wird ein Objekt dieser Klasse erzeugt. Es erhält die Parameter aus dem Gimp-Dialog.

Zunächst erzeugt es ein neues Bild da es von der Klasse GimpImage abgeleitet ist.

Aus einer Liste die calendar.monthcalendar() erzeugt wird die Liste monat mit je einer Liste für eine Kalenderwoche gefüllt.

Jede Woche besteht aus einem Objekt GimpcalendarWeek und einer Liste. Die Liste enthält für jeden Tag ein Objekt von GimpcalendarDay und GimpcalendarDayabbr.

Bei der Initialisierung der einzelnen Objekte wir immer die Ausdehnung des Layers ermittelt. Der maximale Wert über alle Objekte wird für die spätere Positionierung gespeichert.

Nachdem das Objekt Gimpcalendar erzeugt ist kann mit einer der Methoden horizontal, vertikal oder rect die Ausrichtung des Kalendariums festgelegt werden. Die Methode display zeigt das Bild an.

class Gimpcalendar(GimpImage):
    def __init__(self, month, year, font, fontsize, fontcolor,
                 sundaycolor, kwfont, kwfontsize, kwcolor):
        GimpImage.__init__(self)
        self.month = month
        self.year = year
        self.font = font
        self.fontsize = fontsize
        self.fontcolor = fontcolor
        self.sundaycolor = sundaycolor
        self.kwfont = kwfont
        self.kwfontsize = kwfontsize
        self.kwcolor = kwcolor
        self.monat = []
        self.headline = []
        for week in calendar.monthcalendar(self.year, self.month):
            weekdays = []
            for day in week:
                if day == 0:                 # 0 ist kein gueltiger Tag
                    continue
                caldate = GimpcalendarDay(day, self.month, self.year,
                                    self.image, self.font,
                                    self.fontsize,
                                    self.fontcolor,
                                    self.sundaycolor
                           )
                datename = GimpcalendarDayabbr(self.image,
                                    caldate.getweekdayabbr(),
                                    self.font,
                                    self.fontsize,
                                    caldate.getweekdaycolor()
                           )
                datew, dateh = datename.getmax()
                caldate.setmax(datew, dateh)
                weekdays.append((caldate, datename))
            self.monat.append((GimpcalendarWeek(self.image,
                               weekdays[0][0].getcalweek(),
                               self.kwfont,
                               self.kwfontsize,
                               self.kwcolor),
                              weekdays))
    def horizontal(self):
        """
        Alle erzeugten Layer von links nach rechts ausgeben:
        Die X-Position fuer das naechste Layer ergibt sich aus der
        Addition der Breite der bisher verschobenen Layers.
        """
        xoffset = 0
        yoffset = 0
        for kalenderwoche, days in self.monat:
            w, h = kalenderwoche.movelayer(xoffset, 0)
            xoffset += w
            for day, dayname in days:
                w, h = day.movelayer(xoffset, 0)
                w, h = dayname.movelayer(xoffset,
                                         -GimpcalendarDayabbr.maxh)
                xoffset += w
    def vertikal(self):
        """
        Wochentag und Datum von links nach rechts ausgeben, dann in
        die "naechste Zeile".
        """
        xoffset = 0
        yoffset = 0
        for kalenderwoche, days in self.monat:
            w, h = kalenderwoche.movelayer(0, yoffset)
            for day, dayname in days:
                w, h = day.movelayer(kalenderwoche.maxw +
                                     GimpcalendarDay.maxw,
                                     yoffset)
                w, h = dayname.movelayer(kalenderwoche.maxw, yoffset)
                yoffset += h
    def rect(self):
        """
        Kalenderwoche, die Wochentage und Daten von links nach rechts
        ausgeben. Dann erfolgt der Sprung in die "naechste Zeile".
        Die Wochentage werden alle mit der gleichen Y-Position
        uebereinander geschrieben.
        """
        yoffset = 0
        for kalenderwoche, days in self.monat:
            xoffset = 0
            w, h = kalenderwoche.movelayer(0, yoffset)
            xoffset += w
            for day, dayname in days:
                w, h = day.movelayer(xoffset +
                                     day.getweekday() * GimpcalendarDay.maxw,
                                     yoffset)
                w, h = dayname.movelayer(xoffset +
                                     day.getweekday() * GimpcalendarDay.maxw,
                                     -GimpcalendarDay.maxh)
            yoffset += h

Plugin register

Die Schnittstelle zum Registrieren des Plugins verlangt eine Menge Parameter. Besonders interessant ist der Pfad unter dem das Script nach dem Start von Gimp im Menu zu finden ist und die Bildtypen auf die das Script arbeitet.

Der Pfad

ist der Parameter Nummer sechs. <Toolbox>/File/Create/Monatskalender... lässt den Eintrag Monatskalender... unter File - Create erscheinen.

<Image>/FX-Foundry/Toolbox/HVR-Kalender plaziert den Eintrag unter FX-Foundry - Toolbox. Dieser Pfad funktioniert natürlich nur wenn die FX-Foundry-Scripts installiert sind.

Am Besten lassen sich die Möglichkeiten für den ersten Teil des Pfades ermitteln wenn man hier einen Tippfehler einbaut und Gimp dann in der Konsole startet. Die Fehlermeldung zeigt dann die zulässigen Werte.

Die Bildtypen

folgen nach der Pfadangabe für das Script. Normalerweise würde man dort alle möglichen Bildtypen eintragen: "RGB*, GRAY*"

Dieser Eintrag führt aber dazu, dass das Script erst aufgerufen werden kann wenn ein Bild geöffnet ist.

Wenn der Eintrag für den Bildtyp ein Leerstring ist, steht das Script auch ohne ein Bild zur Verfügung.

Mit dem Leerstring muss auch die Parameterzahl der Funktion register angepasst werden: Es sind jetzt zwei weniger!