Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion: Script en Python sous Blinder [Python 3.X]

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 105
    Points : 23
    Points
    23

    Par défaut 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 : 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
    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

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 12 689
    Points : 20 977
    Points
    20 977

    Par défaut

    Salut,

    Citation Envoyé par fredbubu65 Voir le message
    J'ai mis en commentaire la ligne sur laquelle j'ai une erreur.
    Ca serait bien de poster l'erreur (le tas de lignes appelé traceback) remontée par Python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 105
    Points : 23
    Points
    23

    Par défaut réponse

    Dans les lignes en console concernant l'erreur, y a rien ! Y a juste : "Python script fail, look in the console for now..."

    Seulement, je ne sais pas comment faire et utiliser la console !!! Si quelqu'un peu m'indiquer la démarche pour avoir plus d'infos ça serait cool.

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 12 689
    Points : 20 977
    Points
    20 977

    Par défaut

    Citation Envoyé par fredbubu65 Voir le message
    Seulement, je ne sais pas comment faire et utiliser la console !!! Si quelqu'un peu m'indiquer la démarche pour avoir plus d'infos ça serait cool.
    Vous auriez plus de chance dans un forum Blender ou simplement en ouvrant la documentation de Blender.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 105
    Points : 23
    Points
    23

    Par défaut réponse

    Ok merci ! Je vais attendre un peu avant de fermer cette discussion. Je vais faire un tour sur des forums spécialisés alors, vu qu'il y a personne qui s'y connaît.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2017
    Messages : 20
    Points : 24
    Points
    24

    Par défaut

    si editmode_toggle() passe bien en edit mode (pas sûr) le problème est simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if bpy.context.object.mode == "EDIT": # PB sur cette ligne à l'exécution
                bpy.ops.object.editmode_toggle()
    sur cette partie tu ne passes en edit mode que si tu est déjà en edit mode, je pense que c'et pour ca que ca coince.
    perso j'aurai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if bpy.context.object.mode != "EDIT": # si on est pas en edit mode
                bpy.ops.object.editmode_toggle() # on passe en edit mode...
    voilà j'espère que ça t'aura aidé.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 105
    Points : 23
    Points
    23

    Par défaut réponse-modifs

    C'est bon j'ai trouvé une partie de la solution. En fait, dans mon dossier initial (là où je vais chercher mes fichiers .wrl), ça me prends seulement le 1er. Donc le 1er est bien traité, mon script m'envoie bien celui-ci dans le dossier de destination et la taille a diminuée.
    Pourquoi il ne me prends pas tous les fichiers ?, je ne vois pas d'où peut venir le problème.

    Je mets ci-dessous mon code fonctionnel :

    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
    import bpy
    from mathutils import Vector, Matrix, Quaternion, Euler, Color
    from os import *
     
    import os  # rajouté sinon erreur à l'avant dernière ligne
     
    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 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) 
     
            filepath = os.path.join(output_dir, wrl_file)
            bpy.ops.export_scene.vrml2(filepath=filepath)
    En fait, j'ai pensé à quelque chose. A la fin du code, donc de la boucle générale 'for', rajouter :
    1°) Selectionner tout (bpy.ops.object.select_all(action='INVERT')
    2°) Tout supprimer (bpy.ops.object.delete(use_global=False)) mais ça ne fonctionne pas.

    J'ai eu cette idée dans le but de traiter tous mes fichiers qui se trouvent dans mon dossier et pas seulement que le 1er, mais encore, seulement le 1er est traité de façon correcte.
    C'est à dire, qu'à chaque fois qu'un fichier (.wrl) est traité, il passe au suivant, mais pour passer au suivant il faut le supprimer de Blender, car je pense (je n'en suis pas sûr), que Blender peut ouvrir qu'un seul fichier à la fois !!!

    Si quelqu'un à une idée, ça serait cool.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 105
    Points : 23
    Points
    23

    Par défaut Version Finale - CA FONCTIONNE

    J'ai trouvé la solution :

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] installation d'un script python sous Linux/Mac OS
    Par nekcorp dans le forum Général Python
    Réponses: 14
    Dernier message: 22/02/2015, 02h57
  2. script PHP dans script python sous zope
    Par kck61 dans le forum Zope
    Réponses: 1
    Dernier message: 18/07/2012, 18h25
  3. [Tkinter] Python sous Linux
    Par PMdomine dans le forum Tkinter
    Réponses: 7
    Dernier message: 06/03/2006, 21h56
  4. Réponses: 4
    Dernier message: 10/02/2006, 14h49
  5. probleme apache+module python sous windows
    Par gaussprodada dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 02/11/2004, 22h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo