2015-07-07 6 views
0

Я хотел бы сгенерировать график зависимости vtkUnstructuredGrid от компонента вектора. Я могу сделать это, читая vtu-файл, созданный в приведенном ниже коде в paraview, где я могу выбрать, например. y-компонента вектора смещения. Однако я не могу понять, как это сделать непосредственно в скрипте python. Установив переменную 'component' равную 0, я получаю x-компонент, как и ожидалось. Кажется, я не могу выбрать какой-либо другой компонент для отображения.plot vtk vector component as color map

Возможно, с помощью фильтра вычислений и создания нового скалярного массива возможна одна возможность, но я уверен, что есть более простой способ. Любая помощь приветствуется.

import vtk 

grid = vtk.vtkUnstructuredGrid() 
points = vtk.vtkPoints() 
cells = vtk.vtkCellArray() 
disp = vtk.vtkFloatArray() 
disp.SetNumberOfComponents(3) 
disp.SetName('displacement') 

N = 11 
delta = 10./(N-1) 
for kz in range(N): 
    for ky in range(N): 
     for kx in range(N): 
      points.InsertNextPoint(kx*delta,ky*delta,kz*delta) 
      disp.InsertNextTuple3(kx,kx*ky,ky**2+kz**2) 
grid.SetPoints(points) 
pdata = grid.GetPointData() 
pdata.AddArray(disp) 

inel = [0,1,N+1,N,N**2,N**2+1,N**2+N+1,N**2+N] 
for kz in range(N-1): 
    for ky in range(N-1): 
     for kx in range(N-1): 
      anEle = vtk.vtkHexahedron() 
      for kk in range(8): 
       anEle.GetPointIds().SetId(kk,inel[kk]+kx+N*ky+N**2*kz) 
      cells.InsertNextCell(anEle) 
grid.SetCells(vtk.VTK_HEXAHEDRON,cells) 

if 1==11: 
    writer = vtk.vtkXMLUnstructuredGridWriter(); 
    writer.SetDataModeToAscii() 
    writer.SetFileName('bricks.vtu') 
    writer.SetInput(grid) 
    writer.Write() 

else: 
    grid.GetPointData().SetActiveScalars('displacement') 

    # create a rendering window and renderer 
    ren = vtk.vtkRenderer() 
    renWin = vtk.vtkRenderWindow() 
    renWin.AddRenderer(ren) 

    # create a renderwindowinteractor 
    iren = vtk.vtkRenderWindowInteractor() 
    iren.SetRenderWindow(renWin) 

    # mapper 
    mapper = vtk.vtkDataSetMapper() 
    mapper.SetInput(grid) 
    component = 1 
    vrange = grid.GetPointData().GetArray(0).GetRange(component) 
    mapper.SetScalarRange(vrange) 

    # actor 
    actor = vtk.vtkActor() 
    actor.SetMapper(mapper) 
    p=actor.GetProperty() 
    p.SetEdgeVisibility(True) 

    # assign actor to the renderer 
    ren.AddActor(actor) 

    ######################################################################### 
    #    Define view 
    ######################################################################### 
    ViewSize = [1253, 817] 
    CenterOfRotation = [5.0, 5.0, 5.0] 
    CameraPosition = [23, 20, 30] 
    CameraFocalPoint = [5,5,5] 
    CameraViewUp = [0,1,0] 
    CameraParallelScale = 9 
    Background = [0.9,0.9,0.9] 

    renWin.SetSize(ViewSize) 
    camera = ren.GetActiveCamera() 
    camera.SetFocalPoint(CenterOfRotation) 
    camera.SetPosition(CameraPosition) 
    camera.SetFocalPoint(CameraFocalPoint) 
    camera.SetViewUp(CameraViewUp) 
    camera.SetParallelScale(CameraParallelScale) 
    ren.SetBackground(Background) 

    ######################################################################### 
    #    Add color bar 
    ######################################################################### 
    cmap = vtk.vtkDiscretizableColorTransferFunction() 
    cmap.AddRGBPoint(vrange[0],1,0,0) 
    cmap.AddRGBPoint(vrange[1],1,1,1) 
    cmap.SetNumberOfValues(20) 
    cmap.SetDiscretize(True) 
    cmap.SetVectorModeToComponent() 
    cmap.SetVectorComponent(component) 

    mapper.SetLookupTable(cmap) 
    scalarBar = vtk.vtkScalarBarActor() 
    scalarBar.SetLookupTable(cmap) 
    scalarBar.SetTitle('displacement') 
    ren.AddActor2D(scalarBar) 


    renderLarge = vtk.vtkWindowToImageFilter() 
    renderLarge.SetInput(renWin) 
    renderLarge.SetMagnification(4) 

    writer = vtk.vtkPNGWriter() 
    writer.SetInputConnection(renderLarge.GetOutputPort()) 
    writer.SetFileName('bricks.png') 
    renWin.SetOffScreenRendering(True) 
    renWin.Render() 
    writer.Write() 

ответ

0

Возможно, уже слишком поздно. Тем не менее, одним из способов извлечь определенный компонент является использование метода vtkDataArray.CopyComponent(). Я прикладываю небольшой кусочек кода python, чтобы делать то, что вы хотите.

# initialise a new vtkFloatArray to copy any component from disp 
dispSelComponent = vtk.vtkFloatArray() 


N = 11 
delta = 10./(N-1) 
for kz in range(N): 
    for ky in range(N): 
     for kx in range(N): 
      points.InsertNextPoint(kx*delta,ky*delta,kz*delta) 
      disp.InsertNextTuple3(kx,kx*ky,ky**2+kz**2) 
grid.SetPoints(points) 


noTuples = disp.GetNumberOfTuples() 
noComponents = disp.GetNumberOfComponents() 
dispSelComponent.SetNumberOfTuples(noTuples) 
dispSelComponent.SetNumberOfComponents(1) 
wantedComp = 2 
dispSelComponent.CopyComponent(0, disp, wantedComp) 

pdata = grid.GetPointData() 
pdata.AddArray(dispSelComponent) 

Я надеюсь, что это сработает для вас.

+0

благодарит за вашу помощь. это небольшое улучшение от заполнения нового массива в цикле. 'для k в диапазоне (vector.GetNumberOfTuples()): scalar.InsertNextTuple1 (vector.GetTuple (k) [comp])' – mululu