Diminuer taille fichier .wrl

Ici on parle des scripts

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Diminuer taille fichier .wrl

Message par bubu31 » 14 Jan 2019, 09:17

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 : Tout sélectionner
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)


Le BUT de ce script c'est d'aller chercher 3000 fichier .wrl (image 3D) dans un dossier, de faire les étapes décrites ci-dessus, et une fois ces étapes faîtes pour chaque fichier, de les mettre dans un autre dossier. (input_dir et output_dir)

Ce script a été fait par un collègue à moi que j'ai modifié un peu, mais comme je suis débutant en programmation, et plus précisemment en Python, je ne vois pas comment faire.

Si quelqu'un à déjà essayer de dimuner la taille d'un dossier/Fichier, ça serait cool qui m'aiguille un peu.
Merci d'avance.
bubu31
 
Message(s) : 2
Inscription : 14 Jan 2019, 09:10

Re: Diminuer taille fichier .wrl

Message par lapineige » 14 Jan 2019, 10:24

Déjà après coup tu peux voir si une compression des fichiers (dans une archive, avec un algorithme efficace type LZMA, XZ, … en format .7z, tar.gz…) est efficace.

Il manque des indentations dans ton code, il est difficile à lire/comprendre.

Qu'est-ce qui ne fonctionne pas ?
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3711
Inscription : 25 Juin 2014, 07:06

Re: Diminuer taille fichier .wrl

Message par bubu31 » 17 Jan 2019, 11:18

C'est bon j'ai réussi à le faire fonctionner. Ci-dessous mon code fonctionnel :

Code : Tout sélectionner
# 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 les nouveaux compressés 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

         # Permet de supprimer tous les objects de la scène
        #print("first")
        filepath = path.join(input_dir, wrl_file)
        print("Le fichier est : ", filepath)
        bpy.ops.import_scene.x3d(filepath=filepath, filter_glob="*.wrl")
        #print("second")
        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)

        #print("third")
        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
        #print("Passe dans le mode EDIT" + "\n")
        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")
bubu31
 
Message(s) : 2
Inscription : 14 Jan 2019, 09:10


Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)

cron