Script en Python sous Blinder

fredbubu65 Messages postés 13 Statut Membre -  
fredbubu65 Messages postés 13 Statut Membre -
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 :

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)

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") # A changer par : D -> DME... ? (Viewpoint)
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") # A changer par : D -> DME... ? (Viewpoint)
if bpy.context.object.mode == "EDIT":
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)


Je ne pense pas que je dois ouvrir mes 3000 pièces dans BLINDER ?!

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

--
Frédéric.

2 réponses

  1. fredbubu65 Messages postés 13 Statut Membre
     
    Pour information, lorsque j'exécute mon script, j'ai la ligne 28 en erreur :
    "if bpy.context.object.mode == "EDIT":"

    Pourquoi ?
    0
    1. fredbubu65 Messages postés 13 Statut Membre
       
      Pour la ligne en erreur, j'ai trouvé la solution. Mon Script fonctionne bien, mais malgré le nombre de fichiers dans mon dossier spécifique, il tient compte que du premier fichier. Je pense qu'il faudrait faire un "Foreach" mais je ne sais pas si ça pourrait être une solution. Je met mon script qui fonctionne ci-dessous :

      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): # listdir est une méthode qui permet de récupérer ts les eléments d'un dossier

      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 tous les objects de la scène

      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 -> 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.editmode_toggle()
      bpy.ops.object.mode_set (mode = 'EDIT')
      bpy.ops.mesh.remove_doubles(use_unselected=False, threshold=9.999999747378752e-05) # Supprime les doublons

      filepath = os.path.join(output_dir, wrl_file)
      bpy.ops.export_scene.vrml2(filepath=filepath)

      print("\n" + "======> Le fichier : " + wrl_file + " a ete bien copie" + "\n")
      0
  2. fredbubu65 Messages postés 13 Statut Membre
     
    C'est bon j'ai trouvé la solution. Du coup, je l'a met ci-dessous ça pourra aider des personnes :

    #----------------------------------------------------------------------------------------------------------------
    # Programme Python pour le logiciel 'Blender'
    # Le BUT : Diminuer la taille des fichiers 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"):

    # Permet de supprimer tous les objects de la scène
    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')
    # Supprime les doublons
    bpy.ops.mesh.remove_doubles(use_unselected=False, threshold=9.999999747378752e-05)

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


    0