Articles à lire lorsque le code de script Python de Blender ne fonctionne pas dans 2.80

Bonjour Python! Tout le monde, modélisez-vous bien aujourd'hui!

En parlant de cela, lorsque j'ai essayé d'exécuter Blender avec un script Python, je souffrais d'une erreur mystérieuse. En raison de difficultés, il a été constaté que la cause était un ** changement de spécification de l'API **. Vous pouvez penser que la plupart du code actuellement publié sur le net (pour ≒ 2.79 ou antérieur) ** ne fonctionne pas simplement en copiant **.

Donc, pour le code actuellement publié, cela fonctionnera avec 2.80! Je vais en publier une version modifiée. Après avoir arrangé le code avant et après le changement, j'expliquerai sous la forme que la partie modifiée est modifiée comme ceci en se référant à la référence correspondante. Les principaux changements sont à peu près les mêmes pour tous les codes, c'est donc probablement utile pour quiconque obtient une erreur dans un autre code.

Les gens qui ont écrit le code ne sont pas du tout mauvais, mais cela ne sert à rien car les spécifications ont changé. Le Blender en évolution n'est pas mal non plus. Si les gens souffrent alors que personne n'est mauvais ... Je porterai ce péché.

Premier exemple

Blender x Python facilite la 3DCG!

image.png

C'est un script pour créer le maillage ci-dessus.

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)

Après le changement

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)

changements

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))

Ajout d'une primitive d'avion. «Rayon» indiquant que l'échelle est modifiée en «taille».

Référence applicable: 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]

Sélectionnez l'objet actif. La partie qui était à l'origine bpy.context.scene ~ doit être remplacée par bpy.context.view_layer ~. Je ne sais pas exactement comment l'utiliser car l'API de scene reste, mais voici la référence [par ici](https://docs.blender.org/api/current/bpy.types.Scene" Il ne semble pas y avoir d'autre choix que de lire .html) et d'étudier.

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))

Ajout de lampe. Renommé «lampe» en «lumière». De plus, la lumière de type «HEMI» (hémisphère) a disparu.

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)

Aucune API alternative n'a été trouvée pour cela. Dans GUI

image.png

Vous pouvez le modifier en opérant ici. Il existe une API appelée bpy.context.scene.world.color, mais elle ne change pas même si je le spécifie. C'est hors de portée. Si vous souhaitez le reproduire, veuillez le modifier manuellement. Excusez-moi…….

Deuxième exemple

Introduction au script python de Blender_Part 01

image.png

Il s'agit d'un script qui génère le maillage ci-dessus sans utiliser de primitives.

Code source

original

2.79


import bpy

#Supprimer le cube par défaut
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()

#Définir les coordonnées des sommets
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)
]

#Définir un visage à l'aide de cet indice
#Chaque face est définie par une séquence de quatre entiers
#La face triangulaire doit avoir les mêmes premier et quatrième sommets
faces=[
    (2,1,0,3),
    (0,1,4,0),
    (1,2,4,1),
    (2,3,4,2),
    (3,0,4,3)
]

#Créer un nouveau maillage
me          = bpy.data.meshes.new("PyramidMesh")
#Créer un objet avec un maillage
ob          = bpy.data.objects.new("Pyramid", me)
#Placez l'objet à la position du curseur 3D
ob.location = bpy.context.scene.cursor_location
#Lier des objets à la scène
bpy.context.scene.objects.link(ob)
#Remplissez les sommets, les côtés et les faces du maillage
me.from_pydata(coords,[],faces)
#Mettre à jour le maillage avec de nouvelles données
me.update(calc_edges=True)

Après le changement

2.80


import bpy

#Supprimer le cube par défaut
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()

#Définir les coordonnées des sommets
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)
]

#Définir un visage à l'aide de cet indice
#Chaque face est définie par une séquence de quatre entiers
#La face triangulaire doit avoir les mêmes premier et quatrième sommets
faces=[
    (2,1,0,3),
    (0,1,4,0),
    (1,2,4,1),
    (2,3,4,2),
    (3,0,4,3)
]

#Créer un nouveau maillage
me          = bpy.data.meshes.new("PyramidMesh")
#Créer un objet avec un maillage
ob          = bpy.data.objects.new("Pyramid", me)
#Placez l'objet à la position du curseur 3D
ob.location = bpy.context.scene.cursor.location
#Lier des objets à la scène
bpy.context.scene.collection.objects.link(ob)
#Remplissez les sommets, les côtés et les faces du maillage
me.from_pydata(coords,[],faces)
#Mettre à jour le maillage avec de nouvelles données
me.update(calc_edges=True)

changements

2.79


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

2.80


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

C'est une commande sur l'objet dans la scène courante, mais comme une hiérarchie appelée «collection» a été ajoutée sous «scène», il est nécessaire de la refléter. Il y a aussi des «objets» directement sous la «scène», et si tel est le cas, une erreur se produira lorsque «lier» ou «désengager» l'objet, ce qui est le premier meurtre. ʻAttribute Error: De nombreuses personnes peuvent avoir été criées par l'erreur'bpy_prop_collection'object has no attribute'link'`.

2.79


ob.location = bpy.context.scene.cursor_location

2.80


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

Spécifiez la position du curseur. En 2.79 et au-dessous, il y avait une API appelée curosr_location, mais en 2.80, il semble qu'il y ait une structure hiérarchique avec emplacement sous curseur.

Référence applicable: 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)

Identique à l'histoire de collection plus tôt.

Conseils pour trouver une API utilisable

Dans cette situation, il y a trop de changements et les informations requises sont encore petites, il est donc nécessaire de rechercher une API utilisable par vous-même. Dans de tels moments

image.png

Appuyer sur les touches «Ctrl» + «Espace» sur la console Python de Blender fera apparaître une liste de commandes candidates (si vous tapez à mi-chemin, les candidats seront réduits en conséquence), ce qui peut être utile. ..

Ayons une bonne vie dans Blender 2.80.

Recommended Posts

Articles à lire lorsque le code de script Python de Blender ne fonctionne pas dans 2.80
Quand matplotlib ne fonctionne pas avec python2.7
[Sous-processus] Lorsque vous souhaitez exécuter un autre programme Python en code Python
Épingler le répertoire actuel au répertoire de script en Python
Exemple de script pour piéger les signaux en Python
Comment utiliser BigQuery en Python
Pour référencer des variables d'environnement en Python dans Blender
Pour faire fonctionner la station d'horodatage en Python
Script Python pour convertir la latitude et la longitude en code de maillage
Notes personnelles sur le code doc Python dans Sphinx
Matériel à lire lors de la mise en route de Python
Convertir le code de maillage cubique en WKT en Python
Je suis tombé sur un code de caractère lors de la conversion de CSV en JSON avec Python
Je veux écrire en Python! (1) Vérification du format de code
Lire DXF avec python
Lorsque send_keys ne fonctionne pas
Points à garder à l'esprit lors du développement d'un robot d'exploration en Python
Modèle de script python pour lire le contenu du fichier
Comment connaître le répertoire actuel en Python dans Blender
Réécrire le code Python2 en Python3 (2to3)
Un mémorandum lors de l'écriture de code expérimental ~ Se connecter en python
Un mémorandum pour exécuter un script python dans un fichier bat
Points à garder à l'esprit lors de la copie de listes Python
Préparation au contrôle des objets rhino avec des scripts dans Grasshopper / Python
Je veux travailler avec un robot en python.
Choses à noter lors de l'initialisation d'une liste en Python
Que contient cette variable (lorsque le script Python est en cours d'exécution)
Comment passer des arguments lors de l'appel d'un script python depuis Blender sur la ligne de commande
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
Articles à voir lorsque l'installation de Python + OpenCV échoue
[Efficacité du travail] Comment changer les noms de fichiers par lots avec Python
Points à garder à l'esprit lors du traitement des chaînes en Python2
Comment lire un csv contenant uniquement des entiers en Python
Points à garder à l'esprit lors du traitement des chaînes en Python 3
Je veux faire quelque chose avec Python à la fin
[Python3] Code qui peut être utilisé lorsque vous souhaitez redimensionner des images dossier par dossier
Quand j'essaye de pousser avec heroku, ça ne marche pas
[R] [Python] Memo pour lire plusieurs fichiers csv dans plusieurs fichiers zip
Conseils pour coder courts et faciles à lire en Python
Que faire lorsque "SSL: CERTIFICATE_VERIFY_FAILED _ssl.c: 1056" apparaît en Python
Précautions lors de l'utilisation de Python avec AtCoder
Choses à garder à l'esprit lors de l'utilisation de cgi avec python.
Je veux pouvoir exécuter Python avec VS Code
[Python] Pourquoi pserve ne fonctionne pas
Connectez-vous au site Web en Python
Lire du XML avec un espace de noms spécifié en Python
Lire les e-mails Outlook avec Python
Attention lorsque os.mkdir en Python
Parler avec Python [synthèse vocale]
Générer du code QR en Python
API Blender Python dans Houdini (Python 3)
Comment développer en Python
Code de caractère appris en Python
Générez 8 * 8 (64) cubes avec Blender Python
Convertir le code python 3.x en python 2.x
Lire la sortie Fortran avec python
Publier sur Slack en Python
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
Choses à surveiller lors de l'utilisation d'arguments par défaut en Python
Comment ne pas échapper au japonais en traitant avec JSON en Python