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.
Windows 10 home
Anaconda(Python 3.7.6)
VTK 8.2
Paraview 5.4.1 (zur Anzeige von STL- und Voxelnetzen)
Stanford Dragon.
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()
Recommended Posts