In der letzten Lektion haben wir gesehen, wie Blender-Kommandos über da bpy
-Modul aus Python-Code ausgeführt werden können. Hierzu wurde ein Python-Skript innerhalb des Text-Editors erstellt und ausgeführt.
Mit Python implementierte Blender-Automatisierung soll in vielen Fällen unabhängig von einer bestimmten Blender-Szene nutzbar sein. Vielmehr ist es wünschenswert, dass ein einmal erzeugtes Skript in allen Szenen, die mit Blender bearbeitet werden, ausgeführt werden kann.
Zu diesem Zweck bietet Blender die Möglichkeit, Python-Skripte so anzulegen, dass diese als Add-ons verwendet werden können. Add-ons in Blender können über den "Add-on"-Tab im "User Preferences" Dialog (Ctrl
-Alt
-U
) geladen, aktiviert, deaktiviert und entladen werden.
Für das Entwickeln in Blender ist es ratsam, ebenfalls im o. g. "User Preferences" Dialog im Tab "Interface" den Haken bei "Developer Extras" zu setzen. Dies aktiviert eine Reihe von Optionen in Blender, die das Entwickeln und Testen von Skript-Code erleichtern. Unter anderem ermöglicht es das Ausführen von nicht per Keyboard-Shortcut oder Menü-Eintrag auslösbaren selbst entwickelten Operationen über die Suchfunktion (Taste "F3").
Da ein Add-on nicht Bestandteil einer bestimmten ".blend"-Datei sein soll, sondern für alle möglichen Dateien, die von einer Blender-Installation bearbeitet werden, zur Verfügung stehen soll, muss das Add-on-Skript losgelöst von einer bestimmten ".blend"-Datei entwickelt werden.
Dazu kann das Python-Skript aus dem ein Blender eingebauten Text-Editor unabhängig von der aktuell geöffneten ".bend"-Datei gespeichert werden. Empfehlenswert ist es allerdings, einen externen Python-Editor (z.B. Visuals Studio Code) zum Editieren der Python-Add-on-Datei zu verwenden
- Erzeugt eine neue Datei "EmptyAddOn.py" und fügt dieser folgenden Code hinzu:
bl_info = {"name": "My Test Addon", "category": "Object"} def register(): print("Hello World") def unregister(): print("Goodbye World")- Erklärt euch, was in dieser Datei passiert.
- Öffnet den "User Preferences" Dialog und ladet das Add-on:
- "Install Add-on from File..." -> Python-Datei auswählen.
- Das Add-on sollte im Supported Level "Community" unter der Category "User" als Object: My Test Addon erscheinen.
- Öffnet die Blender System Console (Blender-Hauptmenü "Window" -> "Open System Console").
- Registriert und Deregistriert das Add-on über die Checkbox neben dem Add-on im "User Preferences" Dialog -> Die o.a.
Folgende Beobachtungen sind bemerkenswert:
- Der minimale Code, um ein Blender-Add-on zu implementieren, ist nicht umfangreich. Es muss noch nicht mal
bpy
importiert werden. - Ein Add-on in Blender kann registriert und deregistriert werden, dazu muss in der Add-on ".py"-Datei eine
register
und eineunregister
Funktion definiert werden. Hier kann Code ausgeführt werden, der bei den entsprechenden Aktionen von Bedeutung ist. - Ein Blender-Add-on-Skript enthält eine beschreibende Struktur
bl_info
in Form eines Dictionary, in dem u.A. der Name des Add-On und die sog. Kategorie, in der das Add-on erscheinen soll, - Die Namen
register
,unregister
undbl_info
haben im Kontext von Blender-Add-ons eine besondere Bedeutung. - Durch die Installation wird das Add-on entweder direkt in das Blender-Installations-Verzeichnis kopiert (z. B.: C:\Programme\Blender Foundation\Blender\2.90\scripts\addons) oder in das Benutzerdaten-Verzeichnis (z. B.: C:\Users\user\AppData\Roaming\Blender Foundation\Blender\2.90\scripts\addons). Um das Add-on wieder rückstandsfrei zu entfernen, muss die Sktipt-Datei von dort gelöscht werden.
- Findet die Stelle auf der Festplatte, an die das Add-on installiert wurde.
Nun soll das Add-on mit der Matrix-Extrude-Funktionlität der letzten Lektion gefüllt werden.
- Installiert das Add-on-Skript MatrixExtrudeAddon.py.
- Stellt sicher dass unter "Edit -> Preferences -> Interface" der Haken für "Developer Extras" gesetzt ist.
- Verwendet das Add-on indem ihr im 3D-View mit der Taste F3 das Kommando-Menü erscheinen lasst und dann durch die Eingabe von
Matrix Extrude
den neuen Matrix-Extrude-Befehl ausführt.- Konnektiert den neuen Matrix-Extrude-Befehl im "User Preferences" Dialog mit einer Tastenkombination Eurer Wahl, in dem ihr den internen Namen des Kommandos
mesh.matrix_extrude
verwendet.
Der Code enthält eine Reihe von bemerkenswerten neuen Eigenschaften.
- Das Dictionary
bl_info
enthält eine Reihe weiterer Einträge. - Die
register
undunregister
Funktionen verwenden nun entsprechende Methoden ausbpy.utils
, um eine selbst definierte Klasse namensMatrixExtrude
zu registrieren. - Die Klasse
MatrixExtrude
enthält eine einzige Methode namensexecute
. Hier befindet sich der Code, der die Matrix-Extrudierung durchführt. execute
gibt ein Objekt mit der Eigenschaft'FINISHED'
zurück.- Die Klasse
MatrixExtrude
erbt vonbpy.types.Operator
. - Daneben enthält die Klasse
MatrixExtrude
die Eigenschaftenbl_idname
,bl_label
undbl_options
.
Mit diesem Add-on wurde nun ein so genannter Operator in Blender erstellt. Sämtliche eingebauten und auch per Add-on hinzugefügten Operatoren sind wiederum über das Modul bpy.ops
abrufbar.
Um Add-ons debuggen zu können, müssen ein paar Voraussetzungen erfüllt sein:
-
Blender muss exakt die .py Datei ausführen, die in Visual Studio Code editiert wird. Add-ons, die im Preferences-Dialog über den Install-Button installiert werden, werden kopiert und sind daher nicht debug-bar.
-
Damit sich der Debugger der Visual Studio Code Python Extension an den innerhalb von Blender ausgeführten Python Interpreter anhängen kann, muss im Kontext des von Blender ausgeführten Python die Python-Extension
ptvsd
(Python for Visual Studio (Code) Debugging) installiert werden. -
In VS Code der Ordner, der den zu debuggenden Code enthält, muss über ein VS Code Workspace geöffnet sein. Den Ordner einfach über "Open Folder" zu öffnen, funktioniert nicht
-
Blender benötigt eine definierte Unterordner-Struktur, um Add-Ons zu finden.
Hier sind die notwendigen Schritte, um die o. g. Voraussetzungen zu erfüllen
-
Der Source-Code muss in folgender Unterverzeichnis-Struktur organisiert sein. Diese Struktur findet sich auch unterhalb der Lektion 04 in den Verzeichnissen BlenderAddons und BlenderAddonsWorkspace:
- <dev root> - <WorkspaceDirectory> - .vscode - launch.json # Enthält das Python-Attach-Debug-Kommando zum Anhängen an Blender - <Workspace>.code-workspace # Enthält den VS-Code Workspace, der das Plugin-Unterverzeichnis referenziert - <AddonDevDirectory> - addons # Name ist Gesetz, sonst findet Blender kein Add-On - addon_direcory # Per Blender-Konvention alles klein, Worte per _ trennen. Hierauf referenziert der VS-Code Workspace - __init__.py # Enthält den Add-on Python Code
-
Die VS Code Python-Extension muss installiert sein
-
PTVSD muss im Kontext von Blender Python installiert werden. Dazu (unter Windows)
- Als Admin eine Konsole öffnen (Windows-Taste, 'cmd', als Administrator ausführen)
- ins Python Unterverzeichnis der Blender-Installation wechseln, z.B.:
> cd "C:\Program Files\Blender Foundation\Blender 2.90\2.90\python\bin"
- Mit verbundenem Internet das ptvsd Paket installieren
(vorher ggf. Pip aktualisieren mit
> python -m pip install ptvsd
python -m pip install --upgrade pip
)
-
Im Python Skript (Datei
__init__.py
):import ptvsd ptvsd.enable_attach()
-
In Blender: "User Preferences" -> "File" -> "Scripts": Pfad zum
<AddOnDevDirectory>
eintragen. Dasaddons
-Unterverzichnis, in dem das zu debuggende Skript liegt, darf nicht mehr Bestandteil des Pfads sein. Blender neu starten und Add-on mittels Häkchen registrieren. -
Breakpoint in der
execute
-Methode setzen -
Per
Attach
das Debugging starten -
In Blender den Add-on-Befehl (Operator) z. B. über
F3
oder verknüpftem Tastaturbefehl ausführen.
Die wenigsten Operatoren sind einfach so ohne weitere Angaben ausführbar. Fast alle Operatoren lassen sich in ihrer Funktionalität durch Parameter beeinflussen. In Blender heißen solche Parameter von Operatoren Properties.
Properties lassen sich ganz einfach als Eigenschaften der Klasse, die den Operator definiert implementieren (also die Klasse, die von bpy.types.Operator
erbt und die eine execute
-Methode definiert). Hierzu können einfach auf Klassenebene Eigenschaften definiert werden, denen ein Aufruf einer der folgenden Funktionen zugewiesen wird.
bpy.props.IntProperty
bpy.props.BoolProperty
bpy.props.FloatProperty
bpy.props.FloatVectorProperty
Im Beispielcode von matrix_extrude_params wurden dem Matrix-Extrude-Operator drei solcher Properties hinzugefügt:
segment_count
scale
undangle
- Registiert das matrix_extrude_params Add-on
- Beobachtet, wie die Properties im unteren Teil des Tool-Tabs (linke Seite des 3D-Editors) erscheinen (ggf. aufklappen) und wie diese interaktiv verändert werden können.
-
Fügt dem Matrix-Extrude-Operator zwei weitere Properties hinzu:
distance
(Float) - Wie weit soll jedes Face pro Extrusionschritt transliert werden?proportional
(bool) - Soll diedistance
pro Extrusionsschritt mitscale
skaliert werden oder soll in jedem Schritt der selbe Abstand verwendet werden?
-
Lest euch die Dokumentation zu
bl_info
im Blender Wiki durch. -
Informiert euch über die Parameter, die beim Anlegen von Operator-Properties angegeben werden können: https://docs.blender.org/api/blender_python_api_2_77_0/bpy.props.html
-
Ersetzt das
angle
Property durch einen FloatVectorProperty, der als Euler-Winkel funktioniert. Dazu müsst ihr die Eulerwinkel, die vom Benutzer in Grad angegeben werden in einen Angle-Axis Wert umrechnen. Das geht mit Hilfe der Blender-Python-Klassenmathutil.Euler
undmathutil.Quaternion
. -
Vollzieht das Debugging mit o.b. Methode nach.