Пример #1
0
 def __init__(self, renderer):
     self.__renderer = renderer
     self.__reader = vtkStructuredGridReader()
     self.__mapper = vtkDataSetMapper()
     self.__lookup_table = vtkLookupTable()
     self.__property = vtkProperty()
     self.__actor = vtkActor()
Пример #2
0
 def __init__(self, renderer):
     """"init setting up variables"""
     self.__renderer = renderer
     self.__gridReader = vtkUnstructuredGridReader()
     self.__mapper = vtkDataSetMapper()
     self.__property = vtkProperty()
     self.__actor = vtkActor()
Пример #3
0
 def __init__(self, renderer):
     self.__renderer = renderer
     self.__reader = vtkStructuredGridReader()
     self.__mapper = vtkDataSetMapper()
     self.__lookup_table = vtkLookupTable()
     self.__property = vtkProperty()
     self.__actor = vtkActor()
     self.__points = vtkPointSource()
     self.__rungeKutta = vtkRungeKutta4()
     self.__streamer = vtkStreamTracer()
Пример #4
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()
Пример #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()
Пример #6
0
    __unstructured_grid = vtkUnstructuredGrid()
    __points = vtkPoints()

    # Set Data in points
    __points.SetData(nptovtk(__coordinaten))
    #__points.SetVectors(nptovtk(__vectors))

    # set Points in Grid
    __unstructured_grid.SetPoints(__points)
    print(__points)
    #add array
    __unstructured_grid.GetPointData().SetVectors(nptovtk(__vectors))

    __actor = vtkActor()
    __reader = vtkUnstructuredGridReader()
    __mapper = vtkDataSetMapper()

    __mapper.SetInputData(__unstructured_grid)
    __actor.SetMapper(__mapper)

    #region arrow
    __arrow = vtkArrowSource()
    __arrow.SetTipLength(0.25)
    __arrow.SetTipRadius(0.1)
    __arrow.SetTipResolution(10)

    __glyph = vtkGlyph3D()
    __glyph.SetSourceConnection(__arrow.GetOutputPort())
    __glyph.SetInputData(__unstructured_grid)
    __glyph.SetVectorModeToUseVector()
    __glyph.SetColorModeToColorByScalar()