Parameters en functies

Doelen

objImage Je hebt geleerd over de structuur van een script en hoe je deze moet uitvoeren. Nu gaan we een nieuwe functie met parameters schrijven. Dit verhoogt de flexibiliteit van je eigen code en programma’s.

Instructies / Taken

  1. Voer de scripts uit de onderstaande omschrijving uit en kijk naar de uitvoer in de 3D-view.

  2. Herschrijf het laatste script; de uitvoerfunctie moet tekst neerzetten op een gegeven positie in de 3D-view. Gebruik een tweede parameter voor deze taak.

  3. Hoe roep je de functie aan voor de mascotte van Blender, een aap met de naam “Suzanne”?

bprint – uitvoer in de 3D-view

Hoe kun je tekst maken in een 3D wereld? Nu we weten hoe functies werken kunnen we er een gaan toevoegen. Laten we een nieuwe functie maken bprint (waar de b staat voor Blender): een functie die tekst aan een 3D-wereld toevoegt.

  • Open Blender en navigeer naar de Python console.

  • Je kunt verder gaan met het .blend bestand van de vorige tutorial of beginnen met een nieuw .blend bestand, de keuze is aan jou.

    • Als je een .blend bestand wilt openen gebruik je File -> Open in het bovenste menu.

    • Als je met een nieuw bestand wilt beginnen kies je File -> New in het bovenste menu.

  • Maak een nieuw script:

    • Als je al een script hebt gemaakt kun je op het +-teken drukken naast de bestandsnaam.

    • Als je nog geen script hebt druk je op new naast de bestandsnaam.

  • Kopieer het volgende in je console:

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

def bprint():
    "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="If in doubt, just do it")
    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()
  • Optioneel: Sla je script extern op.

  • Sla je .blend-bestand op.

Wanneer we nu een andere tekst willen printen kunnen we een nieuwe functie maken en ervoor zorgen dat deze een andere tekst print.

  • Maak een nieuw script door op het +-teken te drukken naast de bestandsnaam.

  • Geef het een naam die eindigt op “.py”.

  • Probeer het volgende script:

In de 3D-view ziet het er als volgt:

../../_images/blender-python-text-result.jpg
  • Optioneel, je kunt je Python script extern opslaan met Text -> Save As.

  • Sla je .blend bestand op met File -> Save.

Als je een andere tekst wilt printen kunnen we een nieuwe functie toevoegen die de nieuwe tekst printen in de 3D-view. Als we nog 10 extra verschillende teksten willen printen, kunnen we nog 10 extra functies schrijven. Dit is een vervelend taakje.

Er is een andere manier om dit te doen en dat is door gebruik te maken van parameters. Kijk naar het volgende script:

  • Voeg een nieuwe script toe en geef deze een passende naam.

  • Plak de onderstaande code in het script.

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

def bprint(print_text):
    "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=print_text)
    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")
  • Optioneel: Sla je script extern op.

  • Sla je .blend-bestand op.

Definiëren van parameters

De definitie van de nieuwe functie bprint definieert een parameter »print_text«. Deze parameter representeert de tekst die moet worden geprint. Door gebruik te maken van parameters kunnen we functies maken die algemener zijn. Je kunt nu elke tekst aan de functie bprint meegeven om deze tekst te printen zonder dat je er een nieuwe functie voor hoeft te maken.

def bprint(print_text):

De naam van de parameter(s) kun je zelf kiezen. Parameters worden tussen de ronde haakjes achter de naam van de functie gezet.

Optionele parameters

Als je een functie maakt zoals in het bovenstaande voorbeeld dan kun je de functie niet aanroepen zonder een argument mee te geven aan de functie. Als je een parameter optioneel wilt maken kun je de parameter een standaardwaarde geven. Als die parameter niet wordt meegegeven als argument bij het aanroepen van de functie wordt de standaardwaarde gebruikt. Dit is handig wanneer veel parameters wel kunnen worden gebruikt, maar niet verplicht zijn. Voorbeelden van optionele parameters:

def my_functions(location=(0,0,0))
def my_function(rotation=(0,1,1))
def my_function(text='hello world')

Een optionele parameter is gedefinieerd door een sleutel-waarde-paar zoals je in bovenstaande voorbeelden ziet.

Blender showcase voor parameters

Laten we kijken naar een voorbeeld in Blender. Allereerst moet je het Info-scherm in Blender vergroten:

../../_images/blender-python-info-window.jpg

Je kunt dit scherm zien door de rand van het Python Scripting scherm naar beneden te slepen.

Je kunt nu alle functies die worden aangeroepen zien voor alle dingen die in de 3D view gebeuren. Als je een cilinder toevoegt, door het menu Add » Mesh » Cylinder te gebruiken, zul je een lange aanroep van een functie zien. Je kan een regel selecteren door met de rechtermuisknop op de regel te klikken, daarna kan je de regel kopiëren en plakken in je tekst scherm.

../../_images/blender-python-add-cylinder.jpg

Om ervoor te zorgen dat deze ASCII-lintworm beter te lezen is zijn alle parameters op aparte regels gezet:

bpy.ops.mesh.primitive_cylinder_add(radius=1,
                                    depth=2,
                                    view_align=False,
                                    enter_editmode=False,
                                    location=(0, 0, 0),
                                    layers=(True,
                                    False, False, False, False,
                                    False, False, False, False,
                                    False, False, False, False,
                                    False, False, False, False,
                                    False, False, False))

De meeste regels zijn optioneel, de kortste versie is:

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

En met beter leesbare parameter waardes:

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

Je hebt nu een nieuwe manier gevonden om bruikbare en/of nieuwe functies in Blender te ontdekken.