def __init__(self): super(LedShow, self).__init__() self.resize(2000, 1500) # WIDGET self._widget = QWidget(self) self.setCentralWidget(self._widget) self._widget.setAttribute(Qt.WA_TranslucentBackground) self._widget.resize(2000, 1500) # VTK self._vtk_widget = QVTKRenderWindowInteractor(self._widget) self._vtk_widget.SetInteractorStyle( all.vtkInteractorStyleMultiTouchCamera()) self._ren_win = self._vtk_widget.GetRenderWindow() self._render = all.vtkRenderer() self._vtk_widget.resize(2000, 1500) # POINTS self._points = Points(render=self._render) self._ren_win.AddRenderer(self._render) self._vtk_widget.Start() # HANDLE self._handle = HandleVideo(rbg_callback=self._rgb_callback, video_path=os.getcwd()) # TIMER self._timer = QTimer() self._timer.start(100) self._timer.timeout.connect(self._render_once)
def __init__(self): super(Vtk, self).__init__() self._screen_size = QApplication.primaryScreen().size() # WIDGET self._widget = QWidget(self) self._widget.setAttribute(Qt.WA_TranslucentBackground) self.setCentralWidget(self._widget) self._widget.resize(self._screen_size) # VTK self._vtk_widget = QVTKRenderWindowInteractor(self._widget) self._vtk_widget.SetInteractorStyle( all.vtkInteractorStyleMultiTouchCamera()) self._vtk_widget.resize(self._screen_size) self._ren_win = self._vtk_widget.GetRenderWindow() self._render = all.vtkRenderer() sw, sh = self._screen_size.width(), self._screen_size.height() self.resize(int(sw * 0.9), int(sh * 0.9)) self.move(int(sw * (1 - 0.8) / 2), int(sh * (1 - 0.8) / 2)) # POINTS self._points = Point(pos=(10, 10, 10), size=1, color=(100, 0, 0)) self._render.AddActor(self._points.actor) for column in range(1): for row in range(1): self._points.points.InsertNextPoint(row * 0.125, 1 - column * 0.016, 0) self._points.points.Modified() # VTK_SHOW self._ren_win.AddRenderer(self._render) self._vtk_widget.Start() self._render.Render()
def __init__(self): super(PointsShow, self).__init__() self._screen_size = QApplication.primaryScreen().size() # WIDGET self._widget = QWidget(self) self._widget.setAttribute(Qt.WA_TranslucentBackground) self.setCentralWidget(self._widget) self._widget.resize(self._screen_size) # VTK self._vtk_widget = QVTKRenderWindowInteractor(self._widget) self._vtk_widget.SetInteractorStyle(all.vtkInteractorStyleMultiTouchCamera()) self._vtk_widget.resize(self._screen_size) self._ren_win = self._vtk_widget.GetRenderWindow() self._render = all.vtkRenderer() sw, sh = self._screen_size.width(), self._screen_size.height() self.resize(int(sw * 0.9), int(sh * 0.9)) self.move(int(sw * (1 - 0.8) / 2), int(sh * (1 - 0.8) / 2)) # POINTS self._points = VtkPoints(size=3, opacity=1) self._render.AddActor(self._points.actor) # LINE self._lines = VtkLine(color=(1, 0, 0), width=4) self._lines.set_point([0.0, 0.0, 0.0]) self._lines.set_point([1.0, 0.0, 0.0]) self._lines.set_line(0, 0) self._render.AddActor(self._lines.actor) # COPY_FUN self.add_points = self._points.add_points self.set_color = self._points.set_color # SHOW self._ren_win.AddRenderer(self._render) self._vtk_widget.Start() self._render.Render()
def __init__(self): self.renderer = vtkRenderer() self.__camera = vtkCamera() self.__render_window = vtkRenderWindow() self.__render_window_interactor = vtkRenderWindowInteractor() self.__interactor_style_trackball_camera = vtkInteractorStyleTrackballCamera( )
def init3dWidget(self): widget3d = QVTKRenderWindowInteractor() widget3d.Initialize() widget3d.Start() self.render = vtk.vtkRenderer() self.render.SetBackground(params.BackgroundColor) widget3d.GetRenderWindow().AddRenderer(self.render) self.interactor = widget3d.GetRenderWindow().GetInteractor() self.interactor.GetInteractorStyle().SetCurrentStyleToTrackballCamera() self.axesWidget = gui_utils.createAxes(self.interactor) return widget3d
def __init__(self): super(PointsDisplay, self).__init__() # WIDGET self.resize(2000, 1000) self._widget = QWidget(self) self._widget.setAttribute(Qt.WA_TranslucentBackground) self.setCentralWidget(self._widget) self._widget.resize(2000, 1000) # VTK_WIDGET self._vtk_widget = QVTKRenderWindowInteractor(self._widget) self._vtk_widget.SetInteractorStyle(all.vtkInteractorStyleMultiTouchCamera()) self._ren_win = self._vtk_widget.GetRenderWindow() self._render = all.vtkRenderer() self._vtk_widget.resize(2000, 1000) # POINTS self._points = Points(render=self._render) self._ren_win.AddRenderer(self._render) self._vtk_widget.Start() # RENDER rgb_dict = dict() for idx, rgb in enumerate(rgb_data): rgb_dict[idx] = rgb new_rgb_dict = rgb_dict self._render.Render() a = list() for i in range(9600): a.append(i) b = np.array(a).reshape(64, 150) c = list(b) for idx, one_list in enumerate(c): if idx % 2 != 0: c[idx] = list(reversed(one_list)) d = np.array(c) cid = 0 for one_list in list(d.T): for id in one_list: new_rgb_dict[id] = rgb_dict[cid] # print(f'new={id} old={cid}') cid += 1 for key, rgb in new_rgb_dict.items(): self._points.set_point_color(key, rgb) self._render.Render()
def __init__(self, render_frequency: float, window_zoom: int = 0.7): super().__init__() self._screen_size = QApplication.primaryScreen().size() self._central_widget = QWidget(self) self._central_widget.setAttribute(Qt.WA_AcceptTouchEvents | Qt.WA_TranslucentBackground) self._central_widget.setWindowFlags(Qt.NoDropShadowWindowHint) self._central_widget.resize(self._screen_size) self._vtk_widget = QVTKRenderWindowInteractor(self._central_widget) self._vtk_widget.SetInteractorStyle( vtk.vtkInteractorStyleMultiTouchCamera()) self._vtk_widget.resize(self._screen_size) self.setCentralWidget(self._central_widget) sw, sh = self._screen_size.width(), self._screen_size.height() self.resize(sw * window_zoom, sh * window_zoom) self.move(sw * (1 - window_zoom) / 2, sh * (1 - window_zoom) / 2) self._central_widget.setFocus() # UI # self._ui = Ui_Form() # self._ui.setupUi(Form=self._central_widget) for widget in self._central_widget.children(): widget.setStyleSheet(f""" QGroupBox {{ background-color: rgba(200, 200, 200, 1); border-radius: 5; }}""") # QT_STYLE self.setWindowFlags(Qt.NoDropShadowWindowHint) self._render = vtk.vtkRenderer() self._ren_win = self._vtk_widget.GetRenderWindow() self._ren_win.AddRenderer(self._render) self._interactor = self._ren_win.GetInteractor() # TIMER self._timer = QTimer() self._timer.setInterval(int(1000 / render_frequency)) self._timer.timeout.connect(self._working) self._is_running = False self.set_render_ena(False)
def DrawDelaunay3D(data: DB.VolumeData, n: int): """ 从规则网格数据data中随机抽取n个点组成非结构化网格数据,然后进行Delaunay三角剖分,绘制出四面体网格 :param data:体数据 :param n:抽取的散乱点个数 :return: """ # unstructuredDataSet = data.RandomUnstructuredDataSet(n) # unstructuredDataSet = unstructuredDataSet[:, 0:3] # # points = vtk.vtkPoints() # points.SetData(numpy2vtk(num_array=unstructuredDataSet, deep=True)) # # polyData = vtk.vtkPolyData() # polyData.SetPoints(points) # 生成一个UnstructuredGrid uGrid = data.GenTetraUnstructuredGrid(n) # uGrid = data.ExtractVoxelsToUnstructuredGrid(n) # 抽取体素 delaunay3d = vtk.vtkDelaunay3D() delaunay3d.SetInputData(uGrid) delaunay3d.Update() # uGrid = vtk.vtkUnstructuredGrid() # uGrid = delaunay3d.GetOutput() dataSetMapper = vtk.vtkDataSetMapper() # dataSetMapper.SetInputConnection(delaunay3d.GetOutputPort()) dataSetMapper.SetInputData(delaunay3d.GetOutput()) dataSetMapper.Update() actor = vtk.vtkActor() actor.SetMapper(dataSetMapper) actor.GetProperty().SetColor(0.5, 0.5, 0.5) actor.GetProperty().EdgeVisibilityOn() # 文本显示actor textActor = vtk.vtkTextActor() textActor.SetInput("points count:" + str(uGrid.GetPoints().GetNumberOfPoints())) textActor.SetDisplayPosition(20, 30) textProp = textActor.GetTextProperty() textProp.BoldOn() textProp.SetFontSize(50) textProp.ShadowOn() textProp.SetColor(0, 0, 0) renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderer.AddActor(textActor) renderer.SetBackground(0.9, 0.9, 0.9) renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) renderWindow.SetSize(3000, 3000) itr = vtk.vtkRenderWindowInteractor() itr.SetRenderWindow(renderWindow) renderWindow.Render() itr.Initialize() itr.Start()
def DrawVTKVolumeRendering(data: DB.VolumeData): # 读数据source lineData = data.dataMatrix.reshape(np.size(data.dataMatrix), order='F') # vtkdataArray = numpy2vtk(num_array=data.dataMatrix.flatten(), array_type=vtk.VTK_FLOAT) vtkdataArray = numpy2vtk(num_array=lineData, array_type=vtk.VTK_FLOAT) # 定义一种source,vtkImageData vtkImageData = vtk.vtkImageData() # 定义vtkImageData的各种属性 vtkImageData.SetDimensions(np.shape(data.dataMatrix)) vtkImageData.SetSpacing(1, 1, 1) vtkImageData.GetPointData().SetScalars(vtkdataArray) # 用vtk读raw数据,数据顺序有问题 # imagereader = vtk.vtkImageReader() # imagereader.SetFileName(data.dataPath) # imagereader.SetFileDimensionality(3) # imagereader.SetDataScalarType(vtk.VTK_UNSIGNED_CHAR) # imagereader.SetDataExtent(0, data.dataDimension[0] - 1, 0, data.dataDimension[1] - 1, 0, data.dataDimension[2] - 1) # imagereader.SetDataSpacing(1, 1, 1) # imagereader.SetDataOrigin(0.0, 0.0, 0.0) # imagereader.Update() # 转换数据类型 # imageCast = vtk.vtkImageCast() # imageCast.SetInputConnection(imagereader.GetOutputPort()) # imageCast.SetOutputScalarTypeToUnsignedShort() # imageCast.ClampOverflowOn() # imageCast.Update() # 验证是否将数据读出来了 # temp = imageCast.GetOutput().GetPointData().GetScalars() # numpy_temp = vtk2numpy(temp) # mapper # 不同的mapper对应不同的体绘制算法 # volumeMapper = vtk.vtkSmartVolumeMapper() volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper() # 体绘制模式选择 # volumeMapper.SetRequestedRenderMode(vtk.vtkSmartVolumeMapper.RayCastRenderMode) # volumeMapper.AutoAdjustSampleDistancesOff() # 关闭自适应采样步长 # volumeMapper.SetSampleDistance(-1) # 光线采样步长,-1会根据数据点间隔自动设置,默认是1 # volumeMapper.InteractiveAdjustSampleDistancesOff() # 关闭在交互的时候降低采样率 # 设置输入的体数据 volumeMapper.SetInputData(vtkImageData) # properties,传递函数、光照等, volumeProperty = vtk.vtkVolumeProperty() volumeProperty.SetInterpolationTypeToLinear() # 三线性插值 # volumeProperty.SetInterpolationType(vtk.VTK_CUBIC_INTERPOLATION) # 三次插值 # 光照设置 # volumeProperty.ShadeOn() # volumeProperty.SetAmbient(0.5) # volumeProperty.SetDiffuse(0.6) # volumeProperty.SetSpecular(0.3) # volumeProperty.SetSpecularPower(10) # 不透明度传递函数 volumeOpacityTF = vtk.vtkPiecewiseFunction() volumeOpacityTF.ClampingOff() volumeOpacityTF.UseLogScaleOn() volumeOpacityTF.AddPoint(0, 0.00) volumeOpacityTF.AddPoint(25, 0.00) volumeOpacityTF.AddPoint(43, 0.01) volumeOpacityTF.AddPoint(55, 0.1) volumeOpacityTF.AddPoint(255, 0.8) volumeProperty.SetScalarOpacity(volumeOpacityTF) # 梯度不透明度传递函数 # volumeGradientTF = vtk.vtkPiecewiseFunction() # volumeGradientTF.AddPoint(10, 0.0) # volumeGradientTF.AddPoint(90, 0.5) # volumeGradientTF.AddPoint(100, 1.0) # volumeProperty.SetGradientOpacity(volumeGradientTF) # 颜色传递函数 volumeColorTF = vtk.vtkColorTransferFunction() volumeColorTF.ClampingOff() volumeColorTF.AddRGBPoint(25, 0, 0.7, 0) volumeColorTF.AddRGBPoint(55, 0, 0, 0.7) volumeColorTF.AddRGBPoint(150, 0.7, 0, 0) volumeColorTF.AddRGBPoint(255, 1, 0, 0) # volumeColorTF.AddRGBPoint(640.00, 0.00, 0.52, 0.30) # volumeColorTF.AddRGBPoint(190.0, 1.00, 1.00, 1.00) # volumeColorTF.AddRGBPoint(800.0, 0.20, 0.20, 0.20) # volumeColorTF.AddRGBPoint(255.0, 0.20, 0.20, 0.20) volumeProperty.SetColor(volumeColorTF) # actor volumeActor = vtk.vtkVolume() volumeActor.SetMapper(volumeMapper) volumeActor.SetProperty(volumeProperty) # camera # Camera = vtk.vtkCamera() # Camera.SetPosition(0, 5, 5) # Camera.SetFocalPoint(0, 0, 0) # renderer ren = vtk.vtkRenderer() ren.AddVolume(volumeActor) ren.SetBackground(1.0, 1.0, 1.0) # ren.SetActiveCamera(Camera) ren.ResetCamera() # ren.SetLayer(1) # 画一个球体 # sphereSource = vtk.vtkSphereSource() # sphereSource.SetRadius(1) # sphereSource.SetCenter(0.0, 0.0, 0.0) # # sphereMapper = vtk.vtkDataSetMapper() # sphereMapper.SetInputConnection(sphereSource.GetOutputPort()) # # sphereActor = vtk.vtkActor() # sphereActor.SetMapper(sphereMapper) # # sphereRenderer = vtk.vtkRenderer() # sphereRenderer.AddActor(sphereActor) # sphereRenderer.SetBackground(0.7, 0.7, 0.7) # sphereRenderer.SetLayer(0) # window win = vtk.vtkRenderWindow() # win.SetNumberOfLayers(2) win.AddRenderer(ren) # win.AddRenderer(sphereRenderer) win.SetSize(3000, 3000) win.SetWindowName("VolumeRendering PipeLine") # interactor itr = vtk.vtkRenderWindowInteractor() itr.SetRenderWindow(win) # camera = ren.GetActiveCamera() # # camera.GetPosition() # camera.GetFocalPoint() # # 靠近 # camera.SetPosition(camera.GetPosition()[0], # camera.GetPosition()[1], # camera.GetPosition()[2] - 60) # 改变摄像机的角度 # n = 20 # 生成的角度数量 # pern = 360 / n # for i in range(0, n): # ren.GetActiveCamera().Azimuth(pern) # 每次转动pern角度 # win.Render() # SaveScreenShot(win, "change_"+str(i)) win.Render() itr.Initialize() itr.Start()
def DrawVTKMarshingCubes(data: DB.VolumeData, t): # # 1. 读取数据 # cube = vtk.vtkCubeSource() # cube.Update() # 记得加这句不加看不到模型 # # 2. 建图(将点拼接成立方体) # cube_mapper = vtk.vtkPolyDataMapper() # cube_mapper.SetInputData(cube.GetOutput()) # # 3. 根据2创建执行单元 # cube_actor = vtk.vtkActor() # cube_actor.SetMapper(cube_mapper) # # cube_actor.GetProperty().SetColor(1.0, 0.0, 0.0) # # 4. 渲染(将执行单元和背景组合在一起按照某个视角绘制) # renderer = vtk.vtkRenderer() # renderer.SetBackground(0.0, 0.0, 0.0) # 背景只有一个所以是Set() # renderer.AddActor(cube_actor) # 因为actor有可能为多个所以是add() # # # 5. 显示渲染窗口 # render_window = vtk.vtkRenderWindow() # render_window.SetWindowName("My First Cube") # render_window.SetSize(400, 400) # render_window.AddRenderer(renderer) # 渲染也会有可能有多个渲染把他们一起显示 # # 6. 创建交互控键(可以用鼠标拖来拖去看三维模型) # interactor = vtk.vtkRenderWindowInteractor() # interactor.SetRenderWindow(render_window) # interactor.Initialize() # render_window.Render() # interactor.Start() # 从numpy得到vtk的数组数据类型 vtkdataArray = numpy2vtk(num_array=data.dataMatrix.ravel(), deep=True, array_type=vtk.VTK_FLOAT) # 定义一种source,vtkImageData vtkImageData = vtk.vtkImageData() # 定义vtkImageData的各种属性 vtkImageData.SetDimensions(np.shape(data.dataMatrix)) vtkImageData.SetSpacing(1, 1, 1) vtkImageData.GetPointData().SetScalars(vtkdataArray) # 从vtkImageData返回numpy数组的过程 # vtkPointData_temp=vtkImageData.GetPointData() # vtkFloatArray_temp=vtkPointData_temp.GetScalars() # numpy_temp=vtk2numpy(vtkFloatArray_temp) # res=numpy_temp==self.dataMatrix.flatten() # print(res) # 定义vtkMarchingCubes这个filter vtkMC = vtk.vtkMarchingCubes() vtkMC.SetInputData(vtkImageData) # 设置输入数据(vtkImageData) vtkMC.SetNumberOfContours(1) # 设置等值面的数量 vtkMC.SetValue(0, t) # 设置等值面的值(等值面索引,等值面值) # 1原始版本 vtkMC.ComputeGradientsOn() # 计算梯度 vtkMC.ComputeNormalsOff() # 计算法向量时,绘图质量反而下降 vtkMC.ComputeScalarsOff() # 开关无影响 vtkNorm = vtk.vtkVectorNorm() # vtkNorm.SetInputConnection(vtkMC.GetOutputPort()) vtkNorm.Update() cubeMapper = vtk.vtkDataSetMapper() cubeMapper.SetInputConnection(vtkNorm.GetOutputPort()) # 2使用vtkMarchingCubes计算标量值 # vtkMC.ComputeGradientsOn() # vtkMC.ComputeNormalsOff() # vtkMC.ComputeScalarsOn() # # cubeMapper = vtk.vtkDataSetMapper() # cubeMapper.SetInputConnection(vtkMC.GetOutputPort()) # 3不计算标量值 # vtkMC.ComputeGradientsOn() # vtkMC.ComputeNormalsOn() # vtkMC.ComputeScalarsOff() # # cubeMapper = vtk.vtkDataSetMapper() # cubeMapper.SetInputConnection(vtkMC.GetOutputPort()) cubeActor = vtk.vtkActor() cubeActor.SetMapper(cubeMapper) cubeCamera = vtk.vtkCamera() cubeCamera.SetPosition(1, 1, 1) cubeCamera.SetFocalPoint(0, 0, 0) Render = vtk.vtkRenderer() Render.AddActor(cubeActor) Render.SetActiveCamera(cubeCamera) Render.ResetCamera() Render.SetBackground(0.7, 0.7, 0.7) Win = vtk.vtkRenderWindow() Win.AddRenderer(Render) Win.SetSize(3000, 3000) Inter = vtk.vtkRenderWindowInteractor() Inter.SetRenderWindow(Win) # 设置小的坐标系,跟随交互改变 axes = vtk.vtkAxesActor() widet = vtk.vtkOrientationMarkerWidget() widet.SetOrientationMarker(axes) # 设置谁讲被在挂件中显示 widet.SetOutlineColor(0.5, 0.5, 0.5) # 挂件被选中时的外框颜色 widet.SetInteractor(Inter) # 选择vtkRenderWindowInteractor widet.SetViewport(0, 0, 0.3, 0.3) # 挂件显示的位置和大小,(xmin,ymin,xmax,ymax) widet.SetEnabled(1) # 使能 widet.InteractiveOn() # 交互开 # Win.Render() Inter.Start()
def __init__(self): stl_writer = vtk.vtkSTLWriter() append_poly = vtk.vtkAppendPolyData() reader1 = vtk.vtkSTLReader() reader1.SetFileName(file1) reader1.Update() reader2 = vtk.vtkSTLReader() reader2.SetFileName(file2) reader2.Update() mapper1 = vtk.vtkPolyDataMapper() mapper1.SetInputData(vtk.vtkPolyData()) mapper2 = vtk.vtkPolyDataMapper() mapper2.SetInputData(vtk.vtkPolyData()) actor1 = vtk.vtkActor() actor1.SetMapper(mapper1) actor2 = vtk.vtkActor() actor2.SetMapper(mapper2) actor1.GetMapper().SetInputData(reader1.GetOutput()) actor2.GetMapper().SetInputData(reader2.GetOutput()) h_center = actor2.GetCenter() c_center = actor1.GetCenter() c_h = actor1.GetBounds()[2] x = h_center[0] - c_center[0] y = 0.07 - c_h z = h_center[2] - c_center[2] actor1.SetPosition(x, y, z) # append_poly.AddInputData(reader1.GetOutput()) # append_poly.AddInputData(reader2.GetOutput()) reader1.FastDelete() reader2.FastDelete() render = vtk.vtkRenderer() ren_win = vtk.vtkRenderWindow() ren_win.AddRenderer(render) ren_win.SetSize(2000, 2000) i_ren = vtk.vtkRenderWindowInteractor() i_ren.SetInteractorStyle(vtk.vtkInteractorStyleMultiTouchCamera()) i_ren.SetRenderWindow(ren_win) render.AddActor(actor1) render.AddActor(actor2) ren_win.Render() actors = render.GetActors() actor_items = actors.GetNumberOfItems() actors.InitTraversal() for i in range(actor_items): actor = actors.GetNextActor() position = list(actor.GetPosition()) actor.SetPosition(position[0], position[1], position[2]) mapper = actor.GetMapper() poly = mapper.GetInput() if position != (0, 0, 0): # 如果发生平移则把每个点的坐标都做一下平移 points = poly.GetPoints() sum_pts = points.GetNumberOfPoints() for x in range(sum_pts): pos_point = list(points.GetPoint(x)) for y in range(3): pos_point[y] += position[y] points.SetPoint(x, pos_point) append_poly.AddInputData(poly) append_poly.Update() filter = vtk.vtkTriangleFilter() filter.SetInputConnection(append_poly.GetOutputPort()) stl_writer.SetFileName('STL/1.stl') stl_writer.SetInputConnection(filter.GetOutputPort()) stl_writer.Update() stl_writer.Write() i_ren.Start()
def __init__(self): append_poly = vtk.vtkAppendPolyData() reader1 = vtk.vtkSTLReader() reader1.SetFileName(file1) reader1.Update() reader2 = vtk.vtkSTLReader() reader2.SetFileName(file2) reader2.Update() mapper1 = vtk.vtkPolyDataMapper() mapper1.SetInputData(vtk.vtkPolyData()) mapper2 = vtk.vtkPolyDataMapper() mapper2.SetInputData(vtk.vtkPolyData()) actor1 = vtk.vtkActor() actor1.SetMapper(mapper1) actor2 = vtk.vtkActor() actor2.SetMapper(mapper2) actor1.GetMapper().SetInputData(reader1.GetOutput()) actor2.GetMapper().SetInputData(reader2.GetOutput()) h_center = actor2.GetCenter() c_center = actor1.GetCenter() c_h = actor1.GetBounds()[2] x = h_center[0] - c_center[0] y = 0.07 - c_h z = h_center[2] - c_center[2] actor1.SetPosition(x, y, z) # append_poly.AddInputData(reader1.GetOutput()) # append_poly.AddInputData(reader2.GetOutput()) # reader1.FastDelete() # reader2.FastDelete() render = vtk.vtkRenderer() ren_win = vtk.vtkRenderWindow() ren_win.AddRenderer(render) ren_win.SetSize(2000, 2000) i_ren = vtk.vtkRenderWindowInteractor() i_ren.SetInteractorStyle(vtk.vtkInteractorStyleMultiTouchCamera()) i_ren.SetRenderWindow(ren_win) actor_list = [actor1, actor2] for actor in actor_list: position = list(actor.GetPosition()) actor.SetPosition(position[0], position[1], position[2]) mapper = actor.GetMapper() poly = mapper.GetInput() if position != (0, 0, 0): points = poly.GetPoints() sum_pts = points.GetNumberOfPoints() for x in range(sum_pts): pos_point = list(points.GetPoint(x)) for y in range(3): pos_point[y] += position[y] points.SetPoint(x, pos_point) append_poly.AddInputData(poly) append_poly.Update() mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(append_poly.GetOutput()) actor = vtk.vtkActor() actor.SetMapper(mapper) render.AddActor(actor) ren_win.Render() i_ren.Start()
def utils_view_3D(path): class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): def __init__(self, parent=None): self.parent = vtk.vtkRenderWindowInteractor() if (parent is not None): self.parent = parent self.AddObserver("KeyPressEvent", self.keyPress) def keyPress(self, obj, event): key = self.parent.GetKeySym() if key == 'Up': gradtfun.AddPoint(-100, 1.0) gradtfun.AddPoint(10, 1.0) gradtfun.AddPoint(20, 1.0) volumeProperty.SetGradientOpacity(gradtfun) # 下面这一行是关键,实现了actor的更新 renWin.Render() if key == 'Down': tfun.AddPoint(1129, 0) tfun.AddPoint(1300.0, 0.1) tfun.AddPoint(1600.0, 0.2) tfun.AddPoint(2000.0, 0.1) tfun.AddPoint(2200.0, 0.1) tfun.AddPoint(2500.0, 0.1) tfun.AddPoint(2800.0, 0.1) tfun.AddPoint(3000.0, 0.1) # 下面这一行是关键,实现了actor的更新 renWin.Render() def StartInteraction(): renWin.SetDesiredUpdateRate(10) def EndInteraction(): renWin.SetDesiredUpdateRate(0.001) def ClipVolumeRender(obj): obj.GetPlanes(planes) volumeMapper.SetClippingPlanes(planes) ds = sitk.ReadImage(path) data = sitk.GetArrayFromImage(ds) spacing = ds.GetSpacing() srange = [np.min(data), np.max(data)] img_arr = vtkImageImportFromArray() img_arr.SetArray(data) img_arr.SetDataSpacing(spacing) origin = (0, 0, 0) img_arr.SetDataOrigin(origin) # 设置vtk数据的坐标系原点 img_arr.Update() ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) # 把一个空的渲染器添加到一个空的窗口上 renWin.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # 把上面那个窗口加入交互操作 iren.SetInteractorStyle( KeyPressInteractorStyle(parent=iren)) # 在交互操作里面添加这个自定义的操作例如up,down min = srange[0] max = srange[1] diff = max - min inter = 4200 / diff shift = -min shifter = vtk.vtkImageShiftScale() # 对偏移和比例参数来对图像数据进行操作 数据转换,之后直接调用shifter shifter.SetShift(shift) shifter.SetScale(inter) shifter.SetOutputScalarTypeToUnsignedShort() shifter.SetInputData(img_arr.GetOutput()) shifter.ReleaseDataFlagOff() shifter.Update() tfun = vtk.vtkPiecewiseFunction() # 不透明度传输函数---放在tfun tfun.AddPoint(1600, 0) tfun.AddPoint(2200.0, 0.3) tfun.AddPoint(2500.0, 0.1) tfun.AddPoint(3000.0, 0.5) gradtfun = vtk.vtkPiecewiseFunction() # 梯度不透明度函数---放在gradtfun gradtfun.AddPoint(10, 0) gradtfun.AddPoint(90, 0.5) gradtfun.AddPoint(100, 1.0) ctfun = vtk.vtkColorTransferFunction() # 颜色传输函数---放在ctfun ctfun.AddRGBPoint(0.0, 0.1, 0.0, 0.0) ctfun.AddRGBPoint(1280.0, 0.5, 0.2, 0.3) ctfun.AddRGBPoint(2200.0, 0.9, 0.2, 0.3) ctfun.AddRGBPoint(3024.0, 0.5, 0.5, 0.5) volumeMapper = vtk.vtkGPUVolumeRayCastMapper() volumeMapper.SetInputData(shifter.GetOutput()) volumeProperty = vtk.vtkVolumeProperty() volumeProperty.SetColor(ctfun) volumeProperty.SetScalarOpacity(tfun) volumeProperty.SetGradientOpacity(gradtfun) volumeProperty.SetInterpolationTypeToLinear() volumeProperty.ShadeOn() newvol = vtk.vtkVolume() newvol.SetMapper(volumeMapper) newvol.SetProperty(volumeProperty) outline = vtk.vtkOutlineFilter() outline.SetInputConnection(shifter.GetOutputPort()) outlineMapper = vtk.vtkPolyDataMapper() outlineMapper.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(outlineMapper) ren.AddActor(outlineActor) ren.AddVolume(newvol) ren.SetBackground(0, 0, 0) renWin.SetSize(600, 600) planes = vtk.vtkPlanes() boxWidget = vtk.vtkBoxWidget() boxWidget.SetInteractor(iren) boxWidget.SetPlaceFactor(1.0) boxWidget.PlaceWidget(0, 0, 0, 0, 0, 0) boxWidget.InsideOutOn() boxWidget.AddObserver("StartInteractionEvent", StartInteraction) boxWidget.AddObserver("InteractionEvent", ClipVolumeRender) boxWidget.AddObserver("EndInteractionEvent", EndInteraction) outlineProperty = boxWidget.GetOutlineProperty() outlineProperty.SetRepresentationToWireframe() outlineProperty.SetAmbient(1.0) outlineProperty.SetAmbientColor(1, 1, 1) outlineProperty.SetLineWidth(9) selectedOutlineProperty = boxWidget.GetSelectedOutlineProperty() selectedOutlineProperty.SetRepresentationToWireframe() selectedOutlineProperty.SetAmbient(1.0) selectedOutlineProperty.SetAmbientColor(1, 0, 0) selectedOutlineProperty.SetLineWidth(3) ren.ResetCamera() iren.Initialize() renWin.Render() iren.Start()
mapper.EmissiveOff() mapper.SetScaleFactor(0.0) actor = all.vtkActor() actor.SetMapper(mapper) colors_array = all.vtkUnsignedCharArray() colors_array.SetNumberOfComponents(3) for i in range(1000): color = (i * 0.1, 0, 0) colors_array.InsertNextTuple3(*color) points.InsertNextPoint([0.1 * i, 0.1 * i, 0]) points.Modified() poly.GetPointData().SetScalars(colors_array) render = all.vtkRenderer() render.AddActor(actor) ren_win = all.vtkRenderWindow() ren_win.AddRenderer(render) ren_win.SetSize(500, 500) # colors_array.Reset() # for i in range(0, 1000): # colors_array.InsertNextTuple3(0, 255, 0) # colors_array.Modified() ren_win.Render() i_ren = all.vtkRenderWindowInteractor() i_ren.SetRenderWindow(ren_win) i_ren.Initialize() i_ren.Start()
def create_vtk(xx, yy, zz, points, min_val, max_val, num_colors): point_cloud = VtkPointCloud() for point in points: point_cloud.add_point(point) mapper = point_cloud.actor.GetMapper() lut = vtk.vtkLookupTable() lut.SetTableRange(min_val, max_val) lut.SetHueRange(0.6667, 0.0) lut.Build() mapper.SetLookupTable(lut) mapper.SetScalarRange(min_val, max_val) cube = vtk.vtkCubeSource() xlen = 0.1 ylen = 0.1 zlen = 0.1 cube.SetXLength(xlen) cube.SetYLength(ylen) cube.SetZLength(zlen) glyph = vtk.vtkGlyph3D() glyph.SetInputData(point_cloud.pd) point_cloud.pd.GetPointData().SetActiveScalars("Obj") point_cloud.pd.GetPointData().SetScalars(point_cloud.obj) glyph.SetSourceConnection(cube.GetOutputPort()) glyph.ScalingOff() cb_actor = vtk.vtkScalarBarActor() cb_actor.SetTitle("Obj") cb_actor.SetLookupTable(lut) cb_actor.SetWidth(0.05) cb_actor.SetPosition(0.92, 0.15) cb_actor.VisibilityOn() lut.SetNumberOfColors(num_colors) glyph.Update() mapper.SetInputConnection(glyph.GetOutputPort()) axes_actor = vtk.vtkAxesActor() axes_actor.SetXAxisLabelText("x") axes_actor.SetYAxisLabelText("y") axes_actor.SetZAxisLabelText("z") axes_actor.GetXAxisCaptionActor2D().GetTextActor().SetTextScaleModeToNone() axes_actor.GetYAxisCaptionActor2D().GetTextActor().SetTextScaleModeToNone() axes_actor.GetZAxisCaptionActor2D().GetTextActor().SetTextScaleModeToNone() label_size = 20 axes_actor.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetFontSize( label_size) axes_actor.GetYAxisCaptionActor2D().GetCaptionTextProperty().SetFontSize( label_size) axes_actor.GetZAxisCaptionActor2D().GetCaptionTextProperty().SetFontSize( label_size) renderer = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(renderer) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) renderer.AddActor(point_cloud.actor) renderer.AddActor(cb_actor) renderer.AddActor(axes_actor) renWin.Render() camera = vtk.vtkCamera() renderer.SetActiveCamera(camera) camera.SetParallelProjection(True) camera.SetPosition(20, 0, 0) iren.Start()
def DrawVTKUnstructuredVolumeRendering(volume: vtk.vtkUnstructuredGrid): # triFilter = vtk.vtkDataSetTriangleFilter() # triFilter.SetInputData(volume) # triFilter.Update() delaunay3d = vtk.vtkDelaunay3D() delaunay3d.SetInputData(volume) delaunay3d.Update() # 把非结构化网格体数据保存为.vtk文件,可以用paraview显示 writer = vtk.vtkUnstructuredGridWriter() writer.SetInputData(delaunay3d.GetOutput()) writer.SetFileName("MyUnstructuredGrid.vtk") writer.Write() # 显示 volumeMapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() volumeMapper.SetInputData(delaunay3d.GetOutput()) # volumeMapper.SetRayCastFunction(vtk.vtkUnstructuredGridBunykRayCastFunction()) # 对数据有要求 # volumeMapper.SetRayIntegrator(None) # properties,传递函数、光照等, volumeProperty = vtk.vtkVolumeProperty() volumeProperty.SetInterpolationTypeToLinear() # 三线性插值 # volumeProperty.SetInterpolationType(vtk.VTK_CUBIC_INTERPOLATION) # 三次插值 # volumeProperty.ShadeOn() # volumeProperty.SetAmbient(0.5) # volumeProperty.SetDiffuse(0.6) # volumeProperty.SetSpecular(0.3) # volumeProperty.SetSpecularPower(10) # 不透明度传递函数 # todo:传递函数不合适 volumeOpacityTF = vtk.vtkPiecewiseFunction() volumeOpacityTF.AddPoint(600, 0.00) # volumeOpacityTF.AddPoint(255, 0.10) # volumeOpacityTF.AddPoint(833, 0.20) volumeOpacityTF.AddPoint(800, 0.3) volumeOpacityTF.AddPoint(1000, 0) volumeProperty.SetScalarOpacity(volumeOpacityTF) # 梯度不透明度传递函数 # volumeGradientTF = vtk.vtkPiecewiseFunction() # volumeGradientTF.AddPoint(10, 0.0) # volumeGradientTF.AddPoint(90, 0.5) # volumeGradientTF.AddPoint(100, 1.0) # volumeProperty.SetGradientOpacity(volumeGradientTF) # 颜色传递函数 volumeColorTF = vtk.vtkColorTransferFunction() volumeColorTF.AddRGBPoint(0.0, 0.00, 0.00, 0.00) volumeColorTF.AddRGBPoint(256.0, 0.00, 0.00, 0.00) # volumeColorTF.AddRGBPoint(640.00, 0.00, 0.52, 0.30) # volumeColorTF.AddRGBPoint(190.0, 1.00, 1.00, 1.00) # volumeColorTF.AddRGBPoint(800.0, 0.20, 0.20, 0.20) # volumeColorTF.AddRGBPoint(255.0, 0.20, 0.20, 0.20) volumeProperty.SetColor(volumeColorTF) # actor volumeActor = vtk.vtkVolume() volumeActor.SetMapper(volumeMapper) volumeActor.SetProperty(volumeProperty) # camera # Camera = vtk.vtkCamera() # Camera.SetPosition(0, 5, 5) # Camera.SetFocalPoint(0, 0, 0) # renderer ren = vtk.vtkRenderer() ren.AddVolume(volumeActor) ren.SetBackground(1.0, 1.0, 1.0) # ren.SetActiveCamera(Camera) ren.ResetCamera() # ren.SetLayer(1) # 画一个球体 # sphereSource = vtk.vtkSphereSource() # sphereSource.SetRadius(1) # sphereSource.SetCenter(0.0, 0.0, 0.0) # # sphereMapper = vtk.vtkDataSetMapper() # sphereMapper.SetInputConnection(sphereSource.GetOutputPort()) # # sphereActor = vtk.vtkActor() # sphereActor.SetMapper(sphereMapper) # # sphereRenderer = vtk.vtkRenderer() # sphereRenderer.AddActor(sphereActor) # sphereRenderer.SetBackground(0.7, 0.7, 0.7) # sphereRenderer.SetLayer(0) # window win = vtk.vtkRenderWindow() # win.SetNumberOfLayers(2) win.AddRenderer(ren) # win.AddRenderer(sphereRenderer) win.SetSize(3000, 3000) win.SetWindowName("VolumeRendering PipeLine") # interactor itr = vtk.vtkRenderWindowInteractor() itr.SetRenderWindow(win) # camera = ren.GetActiveCamera() # # camera.GetPosition() # camera.GetFocalPoint() # # 靠近 # camera.SetPosition(camera.GetPosition()[0], # camera.GetPosition()[1], # camera.GetPosition()[2] - 60) # 改变摄像机的角度 # n = 20 # 生成的角度数量 # pern = 360 / n # for i in range(0, n): # ren.GetActiveCamera().Azimuth(pern) # 每次转动pern角度 # win.Render() # SaveScreenShot(win, "change_"+str(i)) win.Render() itr.Initialize() itr.Start()
@staticmethod def axis(): actor = vtk.vtkAxesActor() actor.SetTotalLength(0.5, 0.5, 0.5) actor.SetShaftType(0) actor.SetCylinderRadius(0.01) actor.GetXAxisCaptionActor2D().SetWidth(0.01) actor.GetYAxisCaptionActor2D().SetWidth(0.01) actor.GetZAxisCaptionActor2D().SetWidth(0.01) return actor if __name__ == '__main__': test = Test() test.load_floor_file(file_path='STL/1.stl') # test.load_car_file(file_path='STL/FTAlpha2020.stl') test.splicing() render = vtk.vtkRenderer() render.AddActor(test.floor_actor) render.AddActor(test.car_actor) render.AddActor(test.axis()) ren_win = vtk.vtkRenderWindow() ren_win.AddRenderer(render) ren_win.SetSize(2000, 2000) ren_win.Render() i_ren = vtk.vtkRenderWindowInteractor() i_ren.SetInteractorStyle(vtk.vtkInteractorStyleMultiTouchCamera()) i_ren.SetRenderWindow(ren_win) i_ren.Start()
def __init__(self, ren_win: all.vtkRenderWindow): self._ren_win = ren_win self._renderer = all.vtkRenderer() self._ren_win.AddRenderer(self._renderer) self._interactor = self._ren_win.GetInteractor()