Convertir STL en maillage Voxel à l'aide de Python VTK

introduction

Créez un maillage Voxel à partir de données CAO STL à l'aide de la fonction de distance signée (SDF). La bibliothèque que j'ai utilisée est le VTK de Python. De plus, le code était entièrement basé sur l'article suivant.

environnement

Windows 10 home

Anaconda(Python 3.7.6)

VTK 8.2

Paraview 5.4.1 (utilisé pour afficher le maillage STL et voxel)

Données CAO (données STL)

Dragon de Stanford.

stanford_dragon_original.png

Code source

import vtk

filename = "./dragon.stl"
#Lire le fichier stl
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
reader.Update()

#Extraire les données Poly
poly_data = reader.GetOutput()

#Déterminez la taille du maillage
cell_dims = [50, 50, 50]#x, y, z

#Créer une grille maillée
#x_min:0 x_max:1, y_min:2,y_max:3,z_min:4,z_max:5
bounds = poly_data.GetBounds()
mesh_pitch = [(bounds[1] - bounds[0])/cell_dims[0],
              (bounds[3] - bounds[2])/cell_dims[1],
              (bounds[5] - bounds[4])/cell_dims[2]]
mins = [bounds[0], bounds[2], bounds[4]]

points = vtk.vtkPoints()
for ix in range(cell_dims[0]+1):
    for iy in range(cell_dims[1]+1):
        for iz in range(cell_dims[2]+1):
            x = ix * mesh_pitch[0] + mins[0]
            y = iy * mesh_pitch[1] + mins[1]
            z = iz * mesh_pitch[2] + mins[2]
            points.InsertNextPoint(x,y,z)
structured_base_mesh = vtk.vtkStructuredGrid()
structured_base_mesh.SetExtent(0, cell_dims[0], 0, cell_dims[1], 0, cell_dims[2])
structured_base_mesh.SetPoints(points)

#Conversion des données de grille structurelle en données de grille non structurelles
append = vtk.vtkAppendFilter()
append.AddInputData(structured_base_mesh)
append.Update()
base_mesh = append.GetOutput()

#Trouver les coordonnées du centre de Voxel
cell_centers = vtk.vtkCellCenters()
cell_centers.SetInputData(base_mesh)
cell_centers.Update()

#Créer un maillage Voxel à partir de STL
center_points = cell_centers.GetOutput().GetPoints()
cell_list = vtk.vtkIdList()
sdf = vtk.vtkImplicitPolyDataDistance()
sdf.SetInput(poly_data)
distance_sdf = vtk.vtkDoubleArray()
distance_sdf.SetName("sdf")
for idx in range(center_points.GetNumberOfPoints()):
    current_center = center_points.GetPoint(idx)
    distance = sdf.FunctionValue(current_center)
    distance_sdf.InsertNextValue(distance)
    if distance <= 0:
        cell_list.InsertNextId(idx)

base_mesh.GetCellData().SetScalars(distance_sdf)#Ajouter une valeur SDF

extract_cells = vtk.vtkExtractCells()
extract_cells.SetInputData(base_mesh)
extract_cells.SetCellList(cell_list)
extract_cells.Update()

#Sortie des données Voxel sous forme de fichier VTK
writer = vtk.vtkXMLDataSetWriter()
writer.SetFileName("closed_voxel.vtu")
writer.SetInputData(extract_cells.GetOutput())
writer.Update()

#Sortie des données de grille avec l'entrée de valeur SDF sous forme de fichier VTK
#writer = vtk.vtkXMLDataSetWriter()
#writer.SetFileName("all_voxel.vtu")
#writer.SetInputData(base_mesh)
#writer.Update()

stanford_dragon_voxel.png

Recommended Posts

Convertir STL en maillage Voxel à l'aide de Python VTK
Script Python pour convertir la latitude et la longitude en code de maillage
Convertir le code de maillage cubique en WKT en Python
[python] Convertir la date en chaîne
Convertir numpy int64 en python int
[Python] Convertir la liste en Pandas [Pandas]
Publier sur Twitter en utilisant Python
Commencez à Selenium en utilisant python
Convertir le projet Scratch en Python
Convertir le code python 3.x en python 2.x
Conversion de Pandas DataFrame en System.Data.DataTable à l'aide de Python pour .NET
Convertir Markdown en PDF en Python
Workflow pour convertir une formule (image) en python
Convertir la liste en DataFrame avec python
Python> liste> Convertir une double liste en une seule liste
[Python] Convertit les nombres naturels en nombres ordinaux
Convertir décimal en n-aire [python]
Python> tuple> Convertir un double tuple en un seul tuple
Créez un outil de ligne de commande pour convertir des dollars en yens en utilisant Python
[Python] Comment convertir un fichier db en csv
De Python à l'utilisation de MeCab (et CaboCha)
Convertir Python> séquence de deux valeurs en dictionnaire
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
Comment convertir Python en fichier exe
[Python] Convertit les délimiteurs de fichier csv en délimiteurs de tabulation
Convertir un document XML stocké dans une base de données XML (BaseX) au format CSV (en utilisant Python)
Convertir un fichier psd en png en Python
Convertir des données Excel en JSON avec python
Convertir Hiragana en Romaji avec Python (bêta)
Conversion de katakana en voyelle kana [python]
Connectez-vous à Slack à l'aide de requêtes en Python
Convertissez des données FX 1 minute en données 5 minutes avec Python
python> Convertir le tuple en liste> aList = list (pi_tuple)
Essayez d'utiliser Excel en utilisant Python (Xlwings)
Vider les tables BigQuery dans GCS à l'aide de Python
Convertir le type de date Python au format RFC822
Introduction à la simulation d'événements discrets à l'aide de Python # 2
Convertir des nombres chinois en nombres arabes avec Python
Convertir de Markdown en HTML en Python
Convertir une URL absolue en URL relative en Python
Exemple de conversion en ondelettes d'images en Python
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
Convertir le fichier FBX en ASCII <-> BINARY en Python
Convertir un PDF en image (JPEG / PNG) avec Python
Convertir le «nombre» de date Excel en date / heure Python
Méthode #Monte Carlo pour trouver le rapport de circonférence en utilisant Python
Convertissez des PDF en images en masse avec Python
Présentation de 4 façons de surveiller les applications Python à l'aide de Prometheus
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
Convertir un fichier svg en png / ico avec Python
Convertir les valeurs d'époque Windows à ce jour avec python
Convertir les données au format json en txt (en utilisant yolo)
Convertir un float exponentiel en str en Python
Convertir une chaîne au format de liste caractère par caractère avec python
[Python] Convertit l'affichage de l'heure (type str) en utilisant "" "et" '"en secondes (type float) avec datetime et timedelta
Mis à jour vers Python 2.7.9
Convertir en HSV