Artikel zum Lesen, wenn Blenders Python-Skriptcode in 2.80 nicht funktioniert

Guten Morgen Python! Alle, modellierst du heute gut?

Apropos, als ich versuchte, Blender mit einem Python-Skript auszuführen, litt ich unter einem mysteriösen Fehler. Als Ergebnis des Kampfes wurde festgestellt, dass die Ursache ** Änderung der API-Spezifikation ** war. Sie können sich vorstellen, dass der größte Teil des derzeit im Internet veröffentlichten Codes (für 79 2.79 oder früher) ** nicht nur durch Kopieren ** funktioniert.

Für den aktuell veröffentlichten Code funktioniert dies also mit 2.80! Ich werde eine modifizierte Version davon veröffentlichen. Nachdem ich den Code vor und nach der Änderung angeordnet habe, erkläre ich in der Form, dass das geänderte Teil auf diese Weise geändert wird, indem ich auf die entsprechende Referenz verweise. Die wichtigsten Änderungen sind für alle Codes ungefähr gleich, daher ist sie wahrscheinlich für alle nützlich, die einen Fehler in einem anderen Code erhalten.

Die Leute, die den Code geschrieben haben, sind überhaupt nicht schlecht, aber es gibt keine Hilfe dafür, weil sich die Spezifikationen geändert haben. Der sich entwickelnde Mixer ist auch nicht schlecht. Wenn Menschen leiden, wenn niemand schlecht ist ... werde ich diese Sünde tragen.

Erstes Beispiel

Blender x Python macht es einfach 3DCG!

image.png

Es ist ein Skript zum Erstellen des obigen Netzes.

Code

Original

2.79



import bpy
import math

#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)

#world
bpy.context.scene.world.horizon_color=(0.0,0.0,0.0)

#plane_add
for i in range(0,100):
    bpy.ops.mesh.primitive_plane_add(radius = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))

for item in bpy.context.scene.objects:
    if item.type == 'MESH':
        bpy.context.scene.objects.active = bpy.data.objects[item.name]
        bpy.ops.object.modifier_add(type='WIREFRAME')
        bpy.context.object.modifiers['Wireframe'].thickness = 0.0025
        bpy.context.object.modifiers['Wireframe'].use_boundary = True

#lamp add
bpy.ops.object.lamp_add(type='HEMI',location=(0.0,0.0,2.0))

#camera add
bpy.ops.object.camera_add(location=(5.0,0.0,0.0))
bpy.data.objects['Camera'].rotation_euler = (math.pi*1/2, 0, math.pi*1/2)

#render
bpy.context.scene.render.resolution_x = 1000
bpy.context.scene.render.resolution_y = 1000
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.camera = bpy.context.object
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = "tmp/plane.png "
bpy.ops.render.render(write_still=True)

Nach der veränderung

2.80


import bpy
import math

#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)

#plane_add
for i in range(0,100):
    bpy.ops.mesh.primitive_plane_add(size = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))

for item in bpy.context.scene.objects:
    if item.type == 'MESH':
        bpy.context.view_layer.objects.active = bpy.data.objects[item.name]
        bpy.ops.object.modifier_add(type='WIREFRAME')
        bpy.context.object.modifiers['Wireframe'].thickness = 0.0025
        bpy.context.object.modifiers['Wireframe'].use_boundary = True

#lamp add
bpy.ops.object.light_add(location=(0.0,0.0,2.0))

#camera add
bpy.ops.object.camera_add(location=(5.0,0.0,0.0))
bpy.data.objects['Camera'].rotation_euler = (math.pi*1/2, 0, math.pi*1/2)

#render
bpy.context.scene.render.resolution_x = 1000
bpy.context.scene.render.resolution_y = 1000
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.camera = bpy.context.object
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = "tmp/plane.png "
bpy.ops.render.render(write_still=True)

Änderungen

2.79


    bpy.ops.mesh.primitive_plane_add(radius = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))

2.80


    bpy.ops.mesh.primitive_plane_add(size = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))

Ebenenprimitiv hinzugefügt. "Radius", der angibt, dass die Skala in "Größe" geändert wird.

Anwendbare Referenz: https://docs.blender.org/api/current/bpy.ops.mesh.html?highlight=primitive%20plane#bpy.ops.mesh.primitive_plane_add

image.png

2.79


        bpy.context.scene.objects.active = bpy.data.objects[item.name]

2.80


        bpy.context.view_layer.objects.active = bpy.data.objects[item.name]

Wählen Sie das aktive Objekt aus. Der Teil, der ursprünglich "bpy.context.scene" war, sollte in "bpy.context.view_layer" geändert werden. Ich bin mir nicht sicher, wie ich es genau verwenden soll, da die API von "scene" erhalten bleibt, aber hier ist die Referenz [hier](https://docs.blender.org/api/current/bpy.types.Scene ". Es scheint keine andere Wahl zu geben, als .html zu lesen und zu studieren.

2.79


bpy.ops.object.lamp_add(type='HEMI',location=(0.0,0.0,2.0))

2.80


bpy.ops.object.light_add(location=(0.0,0.0,2.0))

Zugabe von Lampe. Umbenannt in "Lampe" in "Licht". Auch das Licht vom Typ "HEMI" (Hemisphäre) ist verschwunden.

https://docs.blender.org/api/current/bpy.ops.object.html?highlight=light%20add#bpy.ops.object.light_add

image.png


#world
bpy.context.scene.world.horizon_color=(0.0,0.0,0.0)

Hierfür wurde keine alternative API gefunden. In der GUI

image.png

Sie können es ändern, indem Sie hier arbeiten. Es gibt eine API namens "bpy.context.scene.world.color", die sich jedoch nicht ändert, selbst wenn ich dies spezifiziere. Dies ist unerreichbar. Wenn Sie es reproduzieren möchten, ändern Sie es bitte manuell. Entschuldigung…….

Zweites Beispiel

Einführung in Blender Python script_Part 01

image.png

Dies ist ein Skript, das das obige Netz ohne Verwendung von Grundelementen generiert.

Quellcode

Original

2.79


import bpy

#Standardwürfel entfernen
def delete_all():
    for item in bpy.context.scene.objects:
        bpy.context.scene.objects.unlink(item)

    for item in bpy.data.objects:
        bpy.data.objects.remove(item)

    for item in bpy.data.meshes:
        bpy.data.meshes.remove(item)

    for item in bpy.data.materials:
        bpy.data.materials.remove(item)

delete_all()

#Scheitelpunktkoordinaten definieren
coords=[
    (-1.0, -1.0, -1.0),
    ( 1.0, -1.0, -1.0),
    ( 1.0,  1.0, -1.0),
    (-1.0,  1.0, -1.0),
    ( 0.0,  0.0,  1.0)
]

#Definieren Sie ein Gesicht mit diesem Index
#Jede Fläche wird durch eine Folge von vier ganzen Zahlen definiert
#Die dreieckige Fläche muss den gleichen ersten und vierten Eckpunkt haben
faces=[
    (2,1,0,3),
    (0,1,4,0),
    (1,2,4,1),
    (2,3,4,2),
    (3,0,4,3)
]

#Erstellen Sie ein neues Netz
me          = bpy.data.meshes.new("PyramidMesh")
#Erstellen Sie ein Objekt mit einem Netz
ob          = bpy.data.objects.new("Pyramid", me)
#Platzieren Sie das Objekt an der 3D-Cursorposition
ob.location = bpy.context.scene.cursor_location
#Verknüpfen Sie Objekte mit der Szene
bpy.context.scene.objects.link(ob)
#Füllen Sie die Oberseiten, Seiten und Flächen des Netzes
me.from_pydata(coords,[],faces)
#Aktualisieren Sie das Netz mit neuen Daten
me.update(calc_edges=True)

Nach der veränderung

2.80


import bpy

#Standardwürfel entfernen
def delete_all():
    for item in bpy.context.scene.objects:
        bpy.context.scene.collection.objects.unlink(item)

    for item in bpy.data.objects:
        bpy.data.objects.remove(item)

    for item in bpy.data.meshes:
        bpy.data.meshes.remove(item)

    for item in bpy.data.materials:
        bpy.data.materials.remove(item)

delete_all()

#Scheitelpunktkoordinaten definieren
coords=[
    (-1.0, -1.0, -1.0),
    ( 1.0, -1.0, -1.0),
    ( 1.0,  1.0, -1.0),
    (-1.0,  1.0, -1.0),
    ( 0.0,  0.0,  1.0)
]

#Definieren Sie ein Gesicht mit diesem Index
#Jede Fläche wird durch eine Folge von vier ganzen Zahlen definiert
#Die dreieckige Fläche muss den gleichen ersten und vierten Eckpunkt haben
faces=[
    (2,1,0,3),
    (0,1,4,0),
    (1,2,4,1),
    (2,3,4,2),
    (3,0,4,3)
]

#Erstellen Sie ein neues Netz
me          = bpy.data.meshes.new("PyramidMesh")
#Erstellen Sie ein Objekt mit einem Netz
ob          = bpy.data.objects.new("Pyramid", me)
#Platzieren Sie das Objekt an der 3D-Cursorposition
ob.location = bpy.context.scene.cursor.location
#Verknüpfen Sie Objekte mit der Szene
bpy.context.scene.collection.objects.link(ob)
#Füllen Sie die Oberseiten, Seiten und Flächen des Netzes
me.from_pydata(coords,[],faces)
#Aktualisieren Sie das Netz mit neuen Daten
me.update(calc_edges=True)

Änderungen

2.79


        bpy.context.scene.objects.unlink(item)

2.80


        bpy.context.scene.collection.objects.unlink(item)

Es ist ein Befehl über das Objekt in der aktuellen Szene, aber da unter "Szene" eine Hierarchie namens "Sammlung" hinzugefügt wurde, ist es notwendig, sie wiederzugeben. Es gibt auch "Objekte" direkt unter "Szene", und wenn dies der Fall ist, tritt ein Fehler auf, wenn das Objekt "verknüpft" oder "getrennt" wird, was das erste Töten ist. Viele Leute wurden möglicherweise durch den Fehler "AttributeError:" bpy_prop_collection "geweint. Das Objekt hat kein Attribut" link ".

2.79


ob.location = bpy.context.scene.cursor_location

2.80


ob.location = bpy.context.scene.cursor.location

Geben Sie die Cursorposition an. In 2.79 und darunter gab es eine API namens "curosr_location", aber in 2.80 scheint es eine hierarchische Struktur mit "location" unter "cursor" zu geben.

Anwendbare Referenz: https://docs.blender.org/api/current/bpy.types.View3DCursor.html

image.png

2.79


bpy.context.scene.objects.link(ob)

2.80


bpy.context.scene.collection.objects.link(ob)

Gleich wie die Geschichte von "Sammlung" früher.

Tipps zum Finden einer verwendbaren API

In dieser Situation gibt es zu viele Änderungen und die erforderlichen Informationen sind immer noch klein. Daher muss nach einer API gesucht werden, die von Ihnen selbst verwendet werden kann. Zu solchen Zeiten

image.png

Durch Drücken der Tasten "Strg" + "Leertaste" auf der Python-Konsole von Blender wird eine Liste der Kandidatenbefehle angezeigt (wenn Sie zur Hälfte eingeben, werden die Kandidaten entsprechend eingegrenzt), was nützlich sein kann. ..

Lassen Sie uns ein gutes Leben in Blender 2.80 haben.

Recommended Posts

Artikel zum Lesen, wenn Blenders Python-Skriptcode in 2.80 nicht funktioniert
Wenn matplotlib nicht mit python2.7 funktioniert
[Unterprozess] Wenn Sie ein anderes Python-Programm in Python-Code ausführen möchten
Pin aktuelles Verzeichnis an Skriptverzeichnis in Python
Beispielskript zum Überfüllen von Signalen in Python
So arbeiten Sie mit BigQuery in Python
Verweisen auf Umgebungsvariablen in Python in Blender
So betreiben Sie die Zeitstempelstation in Python
Python-Skript zum Konvertieren von Breiten- und Längengrad in Mesh-Code
Persönliche Notizen zum Dokumentieren von Python-Code in Sphinx
Materialien zum Lesen, wenn Sie mit Python beginnen
Konvertieren Sie kubischen Netzcode in Python in WKT
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Lesen Sie DXF mit Python
Wenn send_keys nicht funktioniert
Dinge, die Sie bei der Entwicklung von Crawlern in Python beachten sollten
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
Wie Sie das aktuelle Verzeichnis in Python in Blender kennen
Schreiben Sie Python2-Code in Python3 um (2to3)
Ein Memorandum beim Schreiben von experimentellem Code ~ Anmelden in Python
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Dinge, die Sie beim Kopieren von Python-Listen beachten sollten
Vorbereiten der Steuerung von Nashornobjekten mit Skripten in Grasshopper / Python
Ich möchte mit einem Roboter in Python arbeiten.
Beachten Sie beim Initialisieren einer Liste in Python
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Übergeben von Argumenten beim Aufrufen von Python-Skripten über Blender in der Befehlszeile
Beenden bei Verwendung von Python in Terminal (Mac)
Artikel, die angezeigt werden, wenn die Installation für Python + OpenCV fehlschlägt
[Arbeitseffizienz] So ändern Sie Dateinamen im Stapel mit Python
Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python2 beachten sollten
Lesen von CSVs, die in Python nur Ganzzahlen enthalten
Dinge, die Sie bei der Verarbeitung von Zeichenfolgen in Python 3 beachten sollten
Ich möchte am Ende etwas mit Python machen
[Python3] Code, der verwendet werden kann, wenn Sie die Größe von Bildern Ordner für Ordner ändern möchten
Wenn ich versuche, mit Heroku zu pushen, funktioniert es nicht
[R] [Python] Memo zum Lesen mehrerer CSV-Dateien in mehreren Zip-Dateien
Tipps zum Codieren kurz und einfach in Python zu lesen
Was tun, wenn in Python "SSL: CERTIFICATE_VERIFY_FAILED _ssl.c: 1056" angezeigt wird?
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
Ich möchte Python mit VS-Code ausführen können
[Python] Warum pserve nicht funktioniert
Melden Sie sich auf der Website in Python an
Lesen Sie XML mit dem in Python angegebenen Namespace
Lesen Sie Outlook-E-Mails mit Python
Achtung bei os.mkdir in Python
Sprechen mit Python [Text zu Sprache]
Generieren Sie QR-Code in Python
Blender Python API in Houdini (Python 3)
Wie man in Python entwickelt
In Python gelernter Zeichencode
Generieren Sie 8 * 8 (64) Cubes mit Blender Python
Konvertieren Sie Python 3.x-Code in Python 2.x.
Lesen Sie die Fortran-Ausgabe mit Python
Post an Slack in Python
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
Dinge, auf die Sie achten müssen, wenn Sie Standardargumente in Python verwenden
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht