Je veux lire les fichiers VTK pour effectuer un traitement. Étant donné que je dois effectuer ce traitement à la fois sur Linux et Windows, il m'est plus facile de le faire avec Python3. Par conséquent, Linux et Windows ont tous deux Python3 (3.6.0) et son module VTK (version 8.1.2).

Je crée le MWE pour mettre en évidence le problème :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from vtk import *
import sys
import os


if __name__ == "__main__":
    pathFile1 = os.getcwd()+'/Output_253.vtk'
    print(pathFile1)

    if os.path.exists(pathFile1):

        # Creation of variables with the right type to read STRUCTURES_POINTS VTK files
        readerVTK1 = vtk.vtkStructuredPointsReader()

        # We put the content of our files in our variables
        readerVTK1.SetFileName(pathFile1)
        readerVTK1.Update()

        # We read our variables datas, hence we have our VTK files datas in these variables
        dataVTK1 = readerVTK1.GetOutput()

        # We check if the dimensions are not zeros
        if dataVTK1.GetDimensions()!=(0,0,0):
            (dimX,dimY,dimZ) = dataVTK1.GetDimensions()
            print((dimX,dimY,dimZ))
        else :
            print('dimensions are null... Problem !')
    else:
        print(' [WARN]   ','the file you are looking for do not exist')
        print(' pathFile1: ', pathFile1 )

Le fichier Output_253.vtk en référence dans le script peut être téléchargé via le lien :ici

Ensuite, lorsque j'exécute ce script sous Linux, j'obtiens '(1000,1,1)' qui coïncide avec l'en-tête du fichier et avec le reste de mon traitement. Sous Windows, j'obtiens 'dimensions are null... Problem !'.

J'ai essayé de réinstaller le module VTK sous Windows, mais j'ai le même problème.

C'est un bug ? Ou y a-t-il un moyen de contourner le problème ? Ou des idées ?

3
R. N 17 mars 2019 à 20:25

2 réponses

Meilleure réponse

Grâce aux conseils de L.C. J'ai pu déterminer que le problème venait du chemin et de son encodage. En effet, il contient des espaces et des accents. Cela conduit à un mauvais encodage lorsque le chemin est donné à la fonction C++ vtkDataReader.cxx.

Une solution de contournement simple consiste à remplacer le répertoire par le dossier contenant le fichier ou le dernier dossier sans accent. Dans le cas présent, simplement en changeant la définition du chemin en pathFile1='./Output_253.vtk', le problème est résolu.

1
R. N 25 mars 2019 à 15:09

Jetez un œil à la classe vtkStructuredPointsWriter, dans la doc, il est écrit :

Avertissement Les fichiers binaires écrits sur un système peuvent ne pas être lisibles sur d'autres systèmes.

C'est probablement la cause de votre problème (éditez votre fichier dans un éditeur de texte, c'est binaire) :

https://vtk.org/doc/nightly/html/classvtkStructuredPointsWriter.html

Donc, pour résoudre ce problème:

  • lire le fichier sous Linux (comme il semble fonctionner)

  • utiliser un vtkStructuredPointsWriter pour réécrire une nouvelle version du fichier mais n'oubliez pas de mettre le rédacteur en mode ASCII (en appelant SetFileTypeToASCII())

Par exemple, vous pouvez le convertir en ASCII avec ce script python :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from vtk import *
import sys
import os


if __name__ == "__main__":
    pathFile1 = os.getcwd()+'/Output_253.vtk'
    print(pathFile1)

    if os.path.exists(pathFile1):

        # Creation of variables with the right type to read STRUCTURES_POINTS VTK files
        readerVTK1 = vtk.vtkStructuredPointsReader()

        # We put the content of our files in our variables
        readerVTK1.SetFileName(pathFile1)
        readerVTK1.Update()

        # We read our variables datas, hence we have our VTK files datas in these variables
        dataVTK1 = readerVTK1.GetOutput()

        pathFile2 = os.getcwd()+'/Output_253_ASCII.vtk'
        writer = vtk.vtkStructuredPointsWriter()
        writer.SetFileName(pathFile2)
        writer.SetFileTypeToASCII()
        writer.SetInputData(dataVTK1)
        writer.Write()

    else:
        print(' [WARN]   ','the file you are looking for do not exist')
        print(' pathFile1: ', pathFile1 )

Vous pouvez vérifier les versions Python et VTK que vous utilisez lors de l'exécution de votre script avec ce code :

import platform
import vtk

print(platform.python_version())
print(platform.python_version_tuple())
print(vtk.vtkVersion.GetVTKSourceVersion())

Comme cela fonctionne sur ma configuration, je vous suggère de vérifier le chemin (mettre tout p.ex. dans c:\temp et tester si cela fonctionne !).

2
L.C. 25 mars 2019 à 13:47