Mal wieder ein Reboot? Creative Coding und Generative Art mit DrawBot

Creative Coding
Generative Art
Drawbot
Python
Autor:in

Jörg Kantel

Veröffentlichungsdatum

6. November 2023

Da hat mir ja jemand wieder einen Floh ins Ohr gesetzt: Denn am Wochenende schickte mir Kalle, ein hier schon mehrfach erwähnter Freund aus Bremen, eine Mail, in der er mich auf DrawBot hinwies, einer Python-App für zweidimensionale Graphiken mit einem Fokus auf Printerzeugnissen. Ich schrieb zurück, daß mir DrawBot durchaus bekannt sei und das Teil auch schon mehrfach Erwähnung im Schockwellenreiter gefunden hätte. Ich hätte die Beschäftigung damit jedoch eingestellt, weil ich nicht schon wieder in eine Mac-only-Falle laufen wollte.

Ich hätte auf diese Mail nicht reagieren sollen. Denn das ganze Wochenende über rumorte es in meinem Kopf: War DrawBot nicht wirklich ein geiles Werkzeug? Besonders im Hinblick auf meine Idee, Generative Art zwischen zwei Pappedeckel zu pressen, um dem NFT-Hype den Stinkefinger zu zeigen? Ehe ich mich versah, hatte ich die aktuelle Version von DrawBot heruntergeladen und angefangen, damit zu spielen. Herausgekommen ist dabei erst einmal eine weitere Version (m)einer Hommage an Kasimir Malewitsch:

# Hommage an Kasimir Malewitsch

from random import randint

WIDTH, HEIGHT = 640, 480
lmargin = 40   # unterer Rand und Rand links
umargin = 100  # oberer Rand und Rand rechts
nIter   = 30   # Anzahl der Shapes
a = 0.85       # Alpha (Transparenz)

# Farbpalette
malPal = [(42/255.0, 40/255.0, 45/255.0),
          (160/255.0, 51/255.0, 46/255.0),
          (54/255.0, 50/255.0, 80/255.0),
          (50/255.0, 80/255.0, 105/255.0),
          (180/255.0, 144/255.0, 55/255.0),
          (215/255.0, 158/255.0, 40/255.0),
          (140/255.0, 82/255.0, 48/255.0)]
          
def makeFillColor(color, a):
    r = color[0]
    g = color[1]
    b = color[2]
    fill(r, g, b, a)

def drawRect():
    x = randint(lmargin, width() - umargin)
    y = randint(lmargin, height() - umargin)
    w = randint(lmargin, umargin)
    h = randint(lmargin, umargin)
    rect(x, y, w, h)

def drawCircle():
    x = randint(lmargin, width() - umargin)
    y = randint(lmargin, height() - umargin)
    r = randint(15, 50)
    oval(x, y, r, r)
    
size(WIDTH, HEIGHT)
# Hintergrundfarbe (Packpapier)
bgColor = (230/255.0, 226/255.0, 204/255.0)
makeFillColor(bgColor, 1)
rect(0, 0, width(), height())

for _ in range(nIter):
    rand = randint(0, 100)
    if rand < 30:
        stroke(0)
        strokeWidth(1)
        makeFillColor(malPal[randint(0, 1)], a)
        if randint(0, 100) > 50:
            drawRect()
        else:
            drawCircle()
    elif rand < 85:
        makeFillColor(malPal[randint(2, 5)], a)
        drawRect()
    else:
        strokeR = malPal[6][0]
        strokeG = malPal[6][1]
        strokeB = malPal[6][2]
        strokeWidth(randint(4, 8))
        stroke(strokeR, strokeG, strokeB)
        makeFillColor(bgColor, a)
        drawCircle()
        stroke(0)
        strokeWidth(1)
            
print("I did it, Babe!")

Und nicht nur, daß ich Spaß dabei hatte. Zwar habe ich mittlerweile auch Processing.py und Py5 dazu überreden können, weitestgehend auflösungsunabhängige Dateien für Print-Erzeugnisse zu produzieren, aber DrawBot macht es einem viel einfacher, weil das von vorneherein in der App fest eingbaut ist. Und ist es – wenn das Endergebnis »Print« sein soll – nicht völlig egal, ob es mit einem Mac erzeugt wurde? Fragen über Fragen …

Jedenfalls habe ich erst einmal ein paar Tutorials zu DrawBot (wieder) hervorgekramt, die ich Euch nicht vorenthalten möchte (denn die DrawBot-Community ist doch recht überschaubar und so auch die Anzahl der Tutorien):

Nun spiele ich mit dem Gedanken, auch mal meinen FPlotter (2), meine »Matplotlib für Arme«, die ich jüngst schon erfolgreich nach Py5 portiert hatte, auch in DrawBot zu implementieren, um auflösungsunabhängige Plots zu erzeugen. Und auch einige weitere Re-enactment Ideen schlummern in meiner Pipeline. Kalle, da hast Du was angestellt!

War sonst noch was? Ach ja, während meiner Suche nach DrawBot-Tutorien ist mir auch wieder PlotDevice von der Suchmaschine meines Vertrauens vorgeschlagen worden (ein weiteres Mac-only-Programm für die Erzeugung zweidimensionaler Graphiken). Die Software hat im Juli 2022 nach langer Pause ein neues Update bekommen. Die Probleme mit den NodeBox 1-Bibliotheken coreimage, colors etc. sind zwar immer noch nicht vollständig behoben, aber immerhin werden sie benannt und es wird Abhilfe versprochen. Jedoch verlangt das Teil nach dem Update nach macOS 11 oder jünger, so daß es auf meinem betagten MacBook, auf dem maximal Catalina noch läuft, nicht mehr startet. Daher konnte ich leider nicht testen, was von dem vollmundigen Versprechen zu halten sei.