defslice_vtk(polydata, layerThk): """slice model with VTK into layers
:param polydata: vtkPolyData,输入模型 :param layerThk: float,层高 :return: 切片列表 """ # 平面相交切片 plane = vtk.vtkPlane() cutter = vtk.vtkCutter() cutter.SetInputData(polydata) cutter.SetCutFunction(plane) cutter.SetSortByToSortByCell() # 按切片层数进行排序 _, _, _, _, zMin, zMax = polydata.GetBounds() i, z = 0, zMin + layerThk while z < zMax: cutter.SetValue(i, z) z += layerThk i += 1 # 提取轮廓 stripper = vtk.vtkStripper() stripper.SetInputConnection(cutter.GetOutputPort()) stripper.JoinContiguousSegmentsOn() stripper.Update()
# numberOfLines = stripper.GetOutput().GetNumberOfLines() points = stripper.GetOutput().GetPoints() cells = stripper.GetOutput().GetLines() cells.InitTraversal() indices = vtk.vtkIdList() lineCount = 0 contours = [] while cells.GetNextCell(indices): # print("Line {0}:".format(lineCount)) contour = [] for i inrange(indices.GetNumberOfIds()): point = points.GetPoint(indices.GetId(i)) contour.append((point[0], point[1], point[2])) # print("\t({0:0.6f} ,{1:0.6f}, {2:0.6f})".format(point[0], point[1], point[2])) contours.append(contour) lineCount += 1
return stripper, contours2Layers(contours)
defcontours2Layers(contours): layers = [] for contour in contours: layer = next((c for c in layers if (contour[0][2] == c[0][0][2])), []) ifnot layer: layers.append(layer) layer.append(contour) return layers
# Add the actors to the renderer. renderer.AddActor(model) renderer.AddActor(lines) renderer.SetBackground(backgroundColor)
# This starts the event loop and as a side effect causes an # initial render. renderWindow.Render() interactor.Start()
if __name__ == "__main__": main()
在上面代码中,为了将得到的轮廓按照所属切片层进行归类管理,使用如下函数进行实现。
1 2 3 4 5 6 7 8
defcontours2Layers(contours): layers = [] for contour in contours: layer = next((c for c in layers if (contour[0][2] == c[0][0][2])), []) ifnot layer: layers.append(layer) layer.append(contour) return layers