Script en Python sous Blinder
Bonjour à tous,
Voici mon problème.
J'essaie de faire fonctionner un script qui me semble "assez correct", du moins, correspondant à ce que je souhaite faire, mais il ne fonctionne pas.
En effet, je souhaite diminuer la taille de fichiers ".wrl" (pièces 3D) en automatisant cela sur plus de 3000 fichiers.
Les étapes je sais les faire de façon manuelle, j'obtiens bien un fichier moins lourd, mais je souhaite automatiser cette tâche en l'automatisant grâce à un script pour 3000 pièces.
En effet, chacune de ces pièces se composent de plusieurs élements.
Les étapes manuelles sont les suivantes :
- Conversion en un seul object ("Object Mode" sous Blinder).
- JOIN
- Je rechange de mode, "Edit Mode"
- Je sélectionne "Remove Doubles"
- Et je sauvegarde ma pièce. Je gagne environ 25-30% de la taille.
Mon Script est le suivant :
Code:
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
| import bpy
from mathutils import Vector, Matrix, Quaternion, Euler, Color
from os import *
input_dir = "C:\\Users\\fdu\\Documents\\MesDocumentsPersos\\Programmation\\Python\\vrml-De-Base\\"
output_dir = "C:\\Users\\fdu\\Documents\\MesDocumentsPersos\\Programmation\\Python\\vrml-Allege\\"
for wrl_file in listdir(input_dir):
if wrl_file.endswith(".wrl"):
object_all = bpy.context.scene.objects
for ob in object_all:
ob.select = True
bpy.ops.object.delete(use_global=False) # Permet de supprimer les caméras (servent à rien)
filepath = path.join(input_dir, wrl_file)
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 -> Chaque pièce composant le wrl
if bpy.context.object.mode == "EDIT": # PB sur cette ligne à l'exécution
bpy.ops.object.editmode_toggle()
bpy.ops.object.join()
if bpy.context.object.mode == "OBJECT":
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.remove_doubles(use_unselected=False, threshold=9.999999747378752e-05)
filepath = os.path.join(output_dir, wrl_file)
bpy.ops.export_scene.vrml2(filepath=filepath) |
J'ai mis en commentaire la ligne sur laquelle j'ai une erreur.
Est-ce que quelqu'un peut m'aider car il faut dire que je débute totalement sur ce logiciel ainsi qu'en Python.
Merci d'avance ;)
Version Finale - CA FONCTIONNE
J'ai trouvé la solution :
Code:
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
| # Créé par fdu, le 16/01/2019 en Python 3.4
# VERSION FINALE
#----------------------------------------------------------------------------------------------------------------
# Programme Python pour le logiciel 'Blender'
# Le BUT : Diminuer la taille des fichiers ".WRL" d'un dossier et transférer les nouveaux 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\\vrml-Allege\\"
for wrl_file in listdir(input_dir):
if wrl_file.endswith(".wrl"):
# Savoir dans quel context on est
#print(bpy.context.mode) -> Fonctionne mais j'enlève un MAX de print() -> A l'execution peut etre + rapide
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
bpy.context.scene.objects.active = bpy.data.objects["Shape_IndexedFaceSet"]
bpy.ops.object.join()
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 fichier : " + wrl_file + " a ete bien copie" + "\n") |
Voilà, j'espère que ça pourra servir à d'autres :)