Bonjour,

J'ai fais un script en Python sur Blender qui fonctionne et qui diminue la taille de tous mes fichiers dans un répertoire spécifique et qui me les met dans un autre répertoire une fois les étapes "d'allègement effectué".
Maintenant ce que je souhaite ajouter à ce script c'est de mettre chacune des pièces en couleur, mais je n'y arrive pas.
Mon script ci-dessous :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Créé par fdu, le 16/01/2019 en Python 3.4
# VERSION FINALE
 
#----------------------------------------------------------------------------------------------------------------
# Programme Python pour le logiciel 'Blender'
# Le BUT : Diminuer la taille de tous les fichiers d'un dossier et transférer ces nouveaux fichiers dans un autre dossier.
# Gain en terme de taille : 25-30% de gain par rapport à ceux de départ
#----------------------------------------------------------------------------------------------------------------
 
import bpy
from mathutils import Vector, Matrix, Quaternion, Euler, Color
from os import *
 
import os  # Bibliothèque indispensable pr la gestion de fichiers ou de dossiers: Lister, créer, etc
 
input_dir = "C:\\Users\\fdu\\Documents\\MesDocumentsPersos\\Programmation\\Python\\vrml-De-Base\\"
output_dir = "C:\\Users\\fdu\\Documents\\MesDocumentsPersos\\Programmation\\Python\\vrmlAllegeCouleur2\\"
 
for wrl_file in listdir(input_dir):
 
    if wrl_file.endswith(".wrl"):
        # Savoir dans quel context on est
        #print(bpy.context.mode)
 
        filepath = path.join(input_dir, wrl_file)
        print("Le fichier est : ", filepath)
        bpy.ops.import_scene.x3d(filepath=filepath, filter_glob="*.wrl")
 
        object_all = bpy.context.scene.objects
        for ob in object_all:
            ob.select = ob.name.startswith("Viewpoint") # Viewpoint : CAMERAS
        bpy.ops.object.delete(use_global=False)
 
        object_all = bpy.context.scene.objects
        for ob in object_all:
            ob.select = ob.name.startswith("Shape_IndexedFaceSet") # Shape_IndexedFaceSet -> Nom de chaque pièce composant le wrl / Pr les petits fichiers, remplacer par "Viewpoint"
 
        bpy.context.scene.objects.active = bpy.data.objects["Shape_IndexedFaceSet"] # Pr les petits fichiers, remplacer par "Viewpoint"
        bpy.ops.object.join()
 
        # Une fois que le fichier est join, C A D, en une seule pièce , on applique la couleur
            # RAJOUT pour test COULEUR
        bpy.ops.object.select_all(action='INVERT')
        #bpy.ops.object.mode_set(mode='EDIT')
        #bpy.context.space_data.context = 'MATERIAL' #--> Pb avec cette ligne
        bpy.ops.material.new()
        bpy.context.object.active_material.diffuse_color=(0.0540246, 1, 0.0371847)   # Couleur verte flash --> Cette ligne ne fonctionne pas pour appliquer la couleur
            # FIN RAJOUT
 
        bpy.ops.object.mode_set (mode = 'EDIT')
        bpy.ops.mesh.remove_doubles(use_unselected=False, threshold=9.999999747378752e-05) # Supprime les doublons
 
        filepath2 = os.path.join(output_dir, wrl_file)
        bpy.ops.export_scene.vrml2(filepath=filepath2)
 
        # Repasser en mode Object
        bpy.ops.object.mode_set (mode = 'OBJECT')
        # Supprimer toute la scene pour le prochain tour de boucle
        bpy.ops.object.select_by_type(type='MESH')
        bpy.ops.object.delete(use_global=False)
 
        for item in bpy.data.meshes:
            bpy.data.meshes.remove(item)
 
 
print("\n" + "======> Le dernier fichier de la liste sélectionnée : " + wrl_file + " a ete bien copié" + "\n")
J'ai mis des commentaires sur la partie COULEUR que je souhaite modifier. Manuellement j'arrive à appliquer de la couleur dans l'onglet 'MATERIAL', j'applique la couleur, ma pièce se met bien en couleur, je regarde le code que me génère Blender, mais quand je met ces lignes dans mon script, ça ne fonctionne pas. J'ai la ligne bpy.context.space_data.context = 'MATERIAL' qui se met en erreur car effectivement 'space_data' n'a pas de 'context' dans sa liste comme propriété (si on le teste dans la console d'en bas)

Et si je met que la ligne (avec les autres en commentaire) : bpy.context.object.active_material.diffuse_color=(0.0540246, 1, 0.0371847) , j'ai l'erreur suivante dans la console de Blender :

'AttributeError: 'NoneType' object has no attribute 'active_material'
En fait, pour être clair, c'est des pièces en ".wrl" ===> Pièces 3D

J'essai donc d'appliquer une couleur à celles-ci, en plus de la diminution de leurs tailles.

Je me suis rendu compte que si j'enregistre ma pièce 3D en ".blend", celle-ci s'enregistre bien avec la couleur, mais si je l'enregistre en ".wrl", la couleur n'est pas pris en compte !

Est ce que quelqu'un pourrait m'aider ?