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.
Windows 10 home
Anaconda(Python 3.7.6)
VTK 8.2
Paraview 5.4.1 (utilisé pour afficher le maillage STL et voxel)
Dragon de Stanford.
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()
Recommended Posts