Konvertieren Sie STL mit Python VTK in ein Voxel-Netz

Einführung

Erstellen Sie mit der Signed Distance Function (SDF) ein Voxel-Netz aus STL-CAD-Daten. Die Bibliothek, die ich verwendet habe, ist Pythons VTK. Darüber hinaus basierte der Code vollständig auf dem folgenden Artikel.

Umgebung

Windows 10 home

Anaconda(Python 3.7.6)

VTK 8.2

Paraview 5.4.1 (zur Anzeige von STL- und Voxelnetzen)

CAD-Daten (STL-Daten)

Stanford Dragon.

stanford_dragon_original.png

Quellcode

import vtk

filename = "./dragon.stl"
#STL-Datei lesen
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
reader.Update()

#Poly-Daten extrahieren
poly_data = reader.GetOutput()

#Bestimmen Sie die Maschengröße
cell_dims = [50, 50, 50]#x, y, z

#Erstellen Sie ein Netzgitter
#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)

#Konvertieren Sie strukturelle Gitterdaten in nicht strukturelle Gitterdaten
append = vtk.vtkAppendFilter()
append.AddInputData(structured_base_mesh)
append.Update()
base_mesh = append.GetOutput()

#Finden Sie die Koordinaten des Zentrums von Voxel
cell_centers = vtk.vtkCellCenters()
cell_centers.SetInputData(base_mesh)
cell_centers.Update()

#Erstellen Sie ein Voxel-Netz aus 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)#SDF-Wert hinzufügen

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

#Voxel-Daten als VTK-Datei ausgeben
writer = vtk.vtkXMLDataSetWriter()
writer.SetFileName("closed_voxel.vtu")
writer.SetInputData(extract_cells.GetOutput())
writer.Update()

#Ausgabe von Rasterdaten mit SDF-Werteingabe als VTK-Datei
#writer = vtk.vtkXMLDataSetWriter()
#writer.SetFileName("all_voxel.vtu")
#writer.SetInputData(base_mesh)
#writer.Update()

stanford_dragon_voxel.png

Recommended Posts

Konvertieren Sie STL mit Python VTK in ein Voxel-Netz
Python-Skript zum Konvertieren von Breiten- und Längengrad in Mesh-Code
Konvertieren Sie kubischen Netzcode in Python in WKT
[Python] Datum in Zeichenfolge konvertieren
Konvertieren Sie numpy int64 in python int
[Python] Liste in Pandas konvertieren [Pandas]
Mit Python auf Twitter posten
Starten Sie mit Python zu Selen
Konvertieren Sie das Scratch-Projekt in Python
Konvertieren Sie Python 3.x-Code in Python 2.x.
Konvertieren Sie mit Python für .NET von Pandas DataFrame in System.Data.DataTable
Konvertieren Sie Markdown in Python in PDF
Workflow zum Konvertieren der Formel (Bild) in Python
Konvertieren Sie die Liste mit Python in DataFrame
Python> Liste> Doppelte Liste in einfache Liste konvertieren
[Python] Konvertiert natürliche Zahlen in Ordnungszahlen
Konvertieren Sie die Dezimalzahl in n-ary [Python]
Python> Tupel> Konvertiert doppeltes Tupel in einzelnes Tupel
Erstellen Sie ein Befehlszeilenprogramm, um mit Python Dollar in Yen umzurechnen
[Python] So konvertieren Sie eine Datenbankdatei in CSV
Von Python bis zur Verwendung von MeCab (und CaboCha)
Konvertieren Sie Python> Zwei-Wert-Sequenz in Wörterbuch
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
So konvertieren Sie Python in eine exe-Datei
[Python] Konvertieren Sie CSV-Dateibegrenzer in Tabulatortrennzeichen
In der XML-Datenbank (BaseX) gespeichertes XML-Dokument in das CSV-Format konvertieren (mit Python)
Konvertieren Sie die psd-Datei in Python in png
Konvertieren Sie Excel-Daten mit Python in JSON
Konvertiere Hiragana mit Python (Beta) in Romaji
Konvertieren Sie von Katakana zu Vokal Kana [Python]
Melden Sie sich mit Anforderungen in Python bei Slack an
Python> Tupel in Liste konvertieren> aList = Liste (pi_tuple)
Versuchen Sie, Excel mit Python (Xlwings) zu betreiben.
Speichern Sie BigQuery-Tabellen mithilfe von Python in GCS
Konvertieren Sie den Python-Datumstyp in das RFC822-Format
Einführung in die diskrete Ereignissimulation mit Python # 2
Konvertieren Sie chinesische Zahlen mit Python in arabische Zahlen
In Python von Markdown in HTML konvertieren
Konvertieren Sie die absolute URL in eine relative URL in Python
Beispiel für die Wavelet-Konvertierung von Bildern in Python
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Konvertieren Sie die FBX-Datei in Python in ASCII <-> BINARY
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
Konvertieren Sie die "Anzahl" des Excel-Datums in die Python-Datumszeit
#Monte Carlo-Methode zum Ermitteln des Umfangsverhältnisses mit Python
Konvertieren Sie PDFs mit Python in Massenbilder
Einführung in 4 Möglichkeiten zur Überwachung von Python-Anwendungen mit Prometheus
Ich möchte mit Python eine E-Mail von Google Mail senden.
Konvertieren Sie die SVG-Datei mit Python in png / ico
Konvertieren Sie Windows-Epochenwerte mit Python in das Datum
Konvertieren Sie Daten im JSON-Format in txt (mit yolo)
Konvertieren Sie den exponentiellen Float in Python in str
Konvertieren Sie die Zeichenfolge mit Python in ein zeichenweises Listenformat
[Python] Konvertiert die Zeitanzeige (str-Typ) mit "" "und" '"in Sekunden (float-Typ) mit datetime und timedelta
Auf Python 2.7.9 aktualisiert
Zum HSV konvertieren