Hoofdstuk 108Python
De console, scripting-basis, de operator-geschiedenis in de Info-editor, bpy.data tegenover bpy.context
Elke knop in Blender roept uiteindelijk Python-code aan. Dat maakt Blender volledig scriptbaar: van kleine automatiseringen tot complete add-ons. Dit hoofdstuk behandelt de instapkennis — genoeg om zelf iets te bouwen en om te begrijpen wat een add-on doet.
RECCONCEPT00:00:00:00schooliumDe Python Console — direct uitproberen
De Python Console (hoofdstuk 46 behandelt de editor zelf) is een live Python-interpreter met de bpy-module al ingeladen. Typ bpy.data.objects en je krijgt de lijst van alle objecten in het bestand; typ bpy.data.objects['Cube'].location.x = 2 en de kubus springt meteen naar die positie in de viewport — er is geen los “uitvoeren”-commando nodig, elke regel werkt meteen door.
Tab-completion (Tab-toets) toont welke attributen en methodes beschikbaar zijn op een object — de snelste manier om de API te verkennen zonder de documentatie erbij te houden.
RECRENDER · EEVEE00:00:00:001280×800bpy.data tegenover bpy.context
bpy.data is de volledige, ondubbelzinnige inhoud van het .blend-bestand: alle objecten, materialen, scènes, meshes — ongeacht wat er nu op het scherm staat of geselecteerd is. bpy.data.objects['Cube'] verwijst altijd naar precies dat ene object, wat er ook actief of zichtbaar is. Dit is de juiste ingang voor een script dat betrouwbaar met specifieke data moet werken.
bpy.context is de huidige situatie: wat is actief (context.object), wat is geselecteerd (context.selected_objects), welke modus is actief (context.mode), welke editor heeft de muis erboven. Veel bpy.ops-operators (de functies achter knoppen, zoals bpy.ops.mesh.bevel()) werken via de context — ze doen iets met “het huidige object” of “de huidige selectie”, en falen soms stil of met een foutmelding als de context niet klopt (bijvoorbeeld een mesh-operator aanroepen terwijl je niet in Edit Mode zit).
Vuistregel: voor **data opvragen of wijzigen met een vast doel**, gebruik bpy.data. Voor **een operator uitvoeren zoals een gebruiker een knop zou indrukken**, gebruik bpy.ops, met de context correct gezet.
RECCONCEPT00:00:00:00schooliumDe Info-editor: de operator-geschiedenis lezen
De Info-editor (hoofdstuk 47) houdt een log bij van elke uitgevoerde operator, in de vorm van de echte Python-aanroep die erachter zit. Voer je een handeling uit via de muis — bijvoorbeeld een bevel met Ctrl+B — dan verschijnt in de Info-editor een regel als bpy.ops.mesh.bevel(offset=0.05, segments=3, ...). Dat is de snelste manier om te ontdekken hoe een operator heet en welke argumenten hij verwacht: de handeling zelf uitvoeren en aflezen wat Blender daarvan noteerde, in plaats van de documentatie door te zoeken.
Regels uit de Info-editor kan je selecteren en kopiëren, rechtstreeks in een script plakken — dat is precies hoe de meeste kleine automatiseringsscripts ontstaan: een handeling met de hand doen, de gegenereerde regel oppikken, en die vervolgens in een lus over meerdere objecten laten lopen.
RECRENDER · EEVEE00:00:00:001280×800Een script uitvoeren: Text Editor, Run Script, en de Scripting-workspace
Voor iets langer dan een paar regels open je de Text Editor (hoofdstuk 45, meteen beschikbaar in de Scripting-workspace), typ of plak je Python-code, en druk je op Run Script (of Alt+P met de cursor in de tekst). Fouten verschijnen in de Info-editor en op de systeemconsole (Window → Toggle System Console op Windows) — hou die open tijdens het testen, want de foutmelding in de UI zelf is vaak maar één regel.
Voor iets dat blijvend beschikbaar moet zijn (een eigen operator, paneel of menu-item) verpak je de code als add-on: een los .py-bestand met een bl_info-dictionary bovenaan en register()/unregister()-functies — hetzelfde patroon dat elke bestaande add-on gebruikt.
RECRENDER · EEVEE00:00:00:001280×800Zelf proberen: alle kubussen in de scène hernoemen via Python
Open start_python_scripting.blend: een scène met een dozijn kubussen met standaardnamen. Schrijf in de Text Editor een script dat ze allemaal hernoemt naar Kubus_01, Kubus_02, ... in volgorde van hun X-positie.
- 1Open de Scripting-workspace, maak een nieuwe tekst aan.
- 2Haal alle objecten van type MESH op via bpy.data.objects, filter op naam of type.
- 3Sorteer de lijst op object.location.x.
- 4Loop erover met enumerate() en zet object.name = 'Kubus_%02d' % (i+1).
- 5Run Script, controleer het resultaat in de Outliner.