Exemplo n.º 1
0
    def __init__(self):
        self.renderer = vtkRenderer()

        self.__camera = vtkCamera()
        self.__render_window = vtkRenderWindow()
        self.__render_window_interactor = vtkRenderWindowInteractor()
        self.__interactor_style_trackball_camera = vtkInteractorStyleTrackballCamera(
        )
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
    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()
Exemplo n.º 8
0
    @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()
Exemplo n.º 9
0
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()
Exemplo n.º 10
0
transfo.Translate(x, y, z)

filter = vtk.vtkTransformPolyDataFilter()
filter.SetInputConnection(textSource.GetOutputPort())
filter.SetTransform(transfo)
filter.Update()

# Create a mapper and actor
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(filter.GetOutputPort())

actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(1.0, 0.0, 0.0)

# Create a renderer, render window, and interactor
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

renderer.AddActor(actor)
renderer.AddActor(vtk.vtkAxesActor())
renderer.SetBackground(0.4, 0.3, 0.2)

renderWindow.Render()
style = vtk.vtkInteractorStyleMultiTouchCamera()
renderWindowInteractor.SetInteractorStyle(style)
renderWindowInteractor.Start()
Exemplo n.º 11
0
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()
Exemplo n.º 12
0
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()
Exemplo n.º 13
0
            # 下面这一行是关键,实现了actor的更新
            renWin.Render()

def StartInteraction():
    renWin.SetDesiredUpdateRate(10)

def EndInteraction():
    renWin.SetDesiredUpdateRate(0.001)


def ClipVolumeRender(obj):
    obj.GetPlanes(planes)
    volumeMapper.SetClippingPlanes(planes)

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             #体数据极差
# slope = 4000 / diff
# inter = -slope * min
# shift = inter / slope
# print(min, max, slope, inter, shift)  #这几个数据后面有用
diff = max - min  # 体数据极差
inter = 4200 / diff
shift = -min