Das Setup der Blender-Szene

Die Standard-Szene in Blender besteht aus einem Würfel, einer Lampe und einer Kamera. Die brauchen wir nicht mehr bzw. sie sind falsch positioniert und/oder eingestellt.

Mit dem ersten Python-Skripts erstellen wir eine Steuer-Datei, die den Start aller folgenden Skriptvarianten übernimmt. Damit zeigt sich schon ein kleiner Vorteil eines einmal ausgetüftelten Python-Skripts:

  • Es kann wiederholt ausgeführt und/oder verwendet werden, vorausgesetzt es ist fehlerfrei.
  • Es spart einige Mausklicks oder die Pflege einer Blender-Vorlage.
  • Die Parameter für diverse Einstellungen lassen sich für ein anderes Setup schnell anpassen.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Arbeitsschritte für die erste Version…:

  • Starte mit einer neuen Blender-Datei.
  • Erstelle auch das erste Python-Script »clock_ctrl.py« mit Deinem Lieblingseditor.
  • In Blender schalte die Ansicht von Default auf Scripting um.
  • Importiere das Skript mit dem Namen »clock_ctrl.py«.
  • Speichern wäre an dieser Stelle nicht verkehrt!
  • Drücke Alt+P um das Script auszuführen.
  • Wenn Fehler in der Konsole auftauchen, analysiere die Ausgaben und korrigiere den Quellcode, bis alles fehlerfrei läuft.

Wie sieht das Ergebnis aus?

  1. Du hast keine Fehler mehr in der Konsole!
  2. Der Würfel hat sich in Luft aufgelöst, soll heißen, er wurde gelöscht.
  3. Der Pfad wurde erweitert und enthält auch die Information, in welchem Ordner die Blenderdatei liegt.
../../../_images/berlin-clock-ctrl-delete-mesh.png

Erläuterungen im Detail

Zeilen 0-10 – Dokumentation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Dokumentation ist wichtig, fehlt sie, ist es definitiv ein Bug! Diese Zeilen enthalte grundsätzliche Informationen zur Aufgabe des Skripts.

Zeilen 9-11 – Import

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Python verwendet ein modulares Konzept und bereits existierende Funktionen, Methoden, Module anderer Autoren oder auch die eigenen Erfindungen, können verwendet werden. Hier erfolgt die der Import des Python-Interpreter, wie er in Blender eingebaut ist. Python muss nicht extra installiert werden sondern steht mit dem Modul bpy immer zur Verfügung. Die Module sys und os benötigen wir für die Erweiterung des Pfades.

Zeilen 13 – Variablen initialisieren

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Auf diese Zeile hätte man vielleicht verzichten können, aber es ist eine gute Idee die Variablen zu initalisieren, wie es in anderen Sprachen Pflicht ist.

Das Schlüsselwort None bedeute einfach nur: Es ist nicht definiert!

Zeilen 28-30 – Modul oder Skript?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Hier beginnt, nach den ersten import-Anweisungen und globalen Einstellungen die Abarbeitung des Skripts. In Zeile 28 wird untersucht, ob das Script in ein anderes Script importiert wurde, wie wir es mit bpy, sys und os gemacht haben. Ist das der Fall, werden die folgenden Zeilen ingnoriert. Wird das Skript nicht importiert, also als selbständige Einheit ausgeführt, dann werden die folgenden Zeilen ausgeführt. In unserem Fall wird die Funktion main aufgerufen und natürlich abgearbeitet.

Zeilen 16-17 – Funktionsdefinition

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Mit dem Schlüsselwort dev wird eine Funktion eingeleitet, gefolgt von eine Kommentar, der der Dokumentation dieser Funktion dient.

Zeilen 19-20 – Blender: Objekte auswählen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Hier kommt das Modul bpy zum ersten Mal zum Einsatz. Es werden alle Objekte vom Typ Mesh ausgewäht und in der folgenden Zeile, ohne lange zu zögern, gelöscht.

Zeilen 21-25 – Pfad erweitern

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    
#! bpy

"""
Name: 'clock_ctrl.py'
Blender: 2.8x
Group: 'Example'
Tooltip: 'Control script generating a berlin-clock.'
"""
import bpy
import sys
import os

dir = None


def main():
    """Create and compose a berlin-clock"""

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    dir = os.getcwd()
    if not dir:
        dir = os.path.dirname(bpy.data.filepath)
    if dir not in sys.path:
        sys.path.append(dir)

 
if __name__ == '__main__':
    
    main()

    

Nun noch den Pfad setzen, wenn nicht schon geschehen. Das alles dauert nicht länger als ein Wimpernschlag.

Nachdem alles weggeräumt wurde, kann im nächste Schritt der Neubau beginnen…

Soweit alles klar? Nun das Script ausführen?

Im Texteditor gibt es zwei Optionen:

  1. Ein neues Textdokument erzeugen und darin schreiben oder mit copy&paste Inhalte einfügen.
  2. Ein fertiges Skript laden und dieses ausführen.
  3. Wenn das Skript geladen ist kann es in ein internes Skript umgewandelt werden, als hätten wir begonnen, wie unter 1. beschrieben.
  4. Wenn wir Punkt 3 nicht verwenden, signalisiert uns Blender mit einem kleinen Rettungsring, dass das externe Skript verändert worden ist und neu geladen werden muss. Die Übernahme neuer oder geänderter Inhalte passiert nicht automatisch. Hier ist eine Lösung für diesen Vorgang beschrieben: automatischer Reload

Für Punkt 2 und 4 kann weiterhin ein externer Editor verwendet werden. Für die Punkte 1 und 3. bleibt nur der interne Editor von Blender.

Mit der Tastenkombination Alt+P wird das Skript ausgeführt (alternativ über den Butten oder das Menü).

../../../_images/berlin-clock03.png