ae_parameter

Übersicht: Python & Blender


Lernziel

Nach dem erläutert wurde, wie ein Skript grundsätzlich aufgebaut ist, schreiben wir ein neues Script und erweitern den Funktionsaufruf durch die Verwendung von Parametern. Das macht eine Funktion noch felxibler.

Handlungsanweisungen

Aufgaben:
  1. Erstelle ein neues Skript und benenne es bprint.py.

  2. Überprüfe ob es den Text im 3D Fenster ausgibt.

  3. Ändere das Skript, so dass ein weiterer Parameter übergeben wird, die Ausgabe soll an einer anderen Position erfolgen.

  4. Ändere das Skript, so dass ein benannter Parameter übergeben wird, die Ausgabe soll rotiert erfolgen.

  5. Wie kann ich »Suzanne«, das Maskottchen von Blender, erzeugen?

    /blender-basics/a-scripts/script-start-100.png

bprint -- Ausgabe in die 3D-View

Wie kann die Ausgabe in der Konsole, durch eine Ausgabe in der 3D-View von Blender ersetzt werden. Mit einer selbst geschriebenen Funktion kann die fehlende Möglichkeit ergänzt werden. Mit der Funktion bprint (b steht für Blender) wird dieses Ziel erreicht.

Hier das komplette Skript:

blender-basics/a-scripts/bprint.py (Source)

#!bpy
"""
Name: 'bprint.py'
Blender: 2.7x
Group: 'Experiment'
Tooltip: 'Output of text in a scene'
"""

import bpy


def bprint(text_to_print):
    """Places a given text in the 3D view """

    bpy.ops.object.text_add(location=(0, 0, 0), rotation=(0, 0, 0))
    bpy.ops.object.editmode_toggle()
    bpy.ops.font.delete()
    bpy.ops.font.text_insert(text=text_to_print)
    bpy.ops.object.editmode_toggle()


if __name__ == '__main__':
    # Stop edit mode
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='OBJECT')

    # delete all mesh objects from a scene
    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()

    # delete all text objects from a scene
    bpy.ops.object.select_by_type(type='FONT')
    bpy.ops.object.delete()

    # call the new function
    bprint("If in doubt, just do it")

Parameter definieren

In unserer Vorlage verwenden wir einen Parameter für die Funktion print:

print(__name__)

Auch mit dern neuen Funktion bprint definieren wir einen solchen Parameter. Er bekommt den Namen print_text -- bei der Wahl des Namens, ist dem Programmierer frei in seinen Entscheidungen, nur reservierte Worte sollte er meiden.

blender-basics/a-scripts/bprint.py (Source)

#!bpy
"""
Name: 'bprint.py'
Blender: 2.7x
Group: 'Experiment'
Tooltip: 'Output of text in a scene'
"""

import bpy


def bprint(text_to_print):
    """Places a given text in the 3D view """

    bpy.ops.object.text_add(location=(0, 0, 0), rotation=(0, 0, 0))
    bpy.ops.object.editmode_toggle()
    bpy.ops.font.delete()
    bpy.ops.font.text_insert(text=text_to_print)
    bpy.ops.object.editmode_toggle()


if __name__ == '__main__':
    # Stop edit mode
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='OBJECT')

    # delete all mesh objects from a scene
    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()

    # delete all text objects from a scene
    bpy.ops.object.select_by_type(type='FONT')
    bpy.ops.object.delete()

    # call the new function
    bprint("If in doubt, just do it")
Hinweis: Parameter werden in den runden Klammern nach dem Funktionsnamen platziert.

Optionale Parameter

Wenn Du die Funktion, wie in unserem Beispiel definierst, ist die Übergabe eines Parameter pflicht. Um den Parameter optional zu machen, kann ein Standardwert definiert werden. Fehlt der Parameter beim Funktionsaufruf, wird der Standardwert verwendet. Das ist nützlich, wenn viele Parameter benötigt werden und einige mit ihren Standarwerten beibehalten werden können. Hier ein paar Beispiele für optionale Parameter:

def my_functions(location=(0,0,0))
def my_function(rotation=(0,1,1))
def my_function(text="hello, world")
Hinweis: Ein optionaler Parameter wird als Schlüssel-Wert-Paar definiert, wie in den Beispielen geezeigt.

Ein Beispiel für Parameter

/blender-basics/a-scripts/info-window.png

Wenn das Infofenster vergrößert wurde kann das Protokoll für einen Funktionsaufruf beobachtet werden. Wenn man die Menüfolge Add » Mesh » Cylinder wählt, sieht man einen sehr langen Funktionsaufruf. Die Zeile kann mit einen Klick der rechten Maustaste ausgewählt werden und anschließend mit Kopieren und Einfügen in den eigenen Quellcode übernommen werden.

/blender-basics/a-scripts/long-line.png

Für eine bessere Lesbarkeit sind nachfolgend alle Parameter durch einen Zeilenumbruch auf einzelne Zeilen umgebrochen:

bpy.ops.mesh.primitive_cylinder_add(vertices=32,
                                    radius=1,
                                    depth=2,
                                    end_fill_type='NGON',
                                    view_align=False,
                                    enter_editmode=False,
                                    location=(-4.93998, -5.74176, 4.41665),
                                    rotation=(0, 0, 0),
                                    layers=(True,
                                            False, False, False, False,
                                            False, False, False, False,
                                            False, False, False, False,
                                            False, False, False, False,
                                            False, False, False))

Die meisten Parameter sind optional. Die kürzeste Version sieht dann wie folgt aus:

bpy.ops.mesh.primitive_cylinder_add(location=(-4.93998, -5.74176, 4.41665))

Und nun noch die Parameter etwas lesbarer:

bpy.ops.mesh.primitive_cylinder_add(location=(2, 2, 2))

Nun kennst Du eine weitere Möglichkeit, nützliche Funktionen/Methonden in Blender zu ergründen bzw. zu nutzen.

Kommentare