在 VTK 中可视化 networkx 图但没有渲染?

问题描述

我在尝试运行此代码时没有收到任何错误,但是没有呈现任何内容并且只出现一个空白屏幕。请让我知道我哪里出错了。 node_pos 是一个字典,其中所有节点坐标都以节点编号为键,G 是 networkx 图对象 G。此代码改编自 2005 年其他地方的代码,因此必须更新一些过时的 VTK 属性

def draw_nxvtk(G,node_pos):

      # set node positions 
      np={} 
      for n in G.nodes():
                
                np[n]=node_pos[n] 
          
      nodePoints = vtk.vtkPoints() 
   
      i=0 
      
      for (x,y,z) in np.values(): 
                nodePoints.InsertPoint(i,x,z) 
                i=i+1 
   
      # Create a polydata to be glyphed. 
      inputData = vtk.vtkpolyData() 
      inputData.SetPoints(nodePoints) 
   
      # Use sphere as glyph source. 
      balls = vtk.vtkSphereSource() 
      balls.SeTradius(.05) 
      balls.SetPhiResolution(20) 
      balls.SetThetaResolution(20) 
   
      glyPHPoints = vtk.vtkGlyph3D() 
      glyPHPoints.SetInputData(inputData) 
      glyPHPoints.SetSourceData(balls.Getoutput()) 
   
      glyphMapper = vtk.vtkpolyDataMapper() 
      glyphMapper.SetInputData(glyPHPoints.Getoutput()) 
  
      glyph = vtk.vtkActor() 
      glyph.SetMapper(glyphMapper) 
      glyph.Getproperty().SetDiffuseColor(plum) 
      glyph.Getproperty().Setspecular(.3) 
      glyph.Getproperty().SetspecularPower(30) 
   
      # Generate the polyline for the spline. 
      points = vtk.vtkPoints() 
      edgeData = vtk.vtkpolyData() 
   
      # Edges 
   
      lines = vtk.vtkCellArray() 
      i=0 
      for e in G.edges: 
                
                u=e[0] 
                v=e[1] 
                
                lines.InsertNextCell(2) 
                
                for n in (u,v): 
                          (x,z)=node_pos[n] 
                          points.InsertPoint(i,z) 
                          lines.InsertCellPoint(i) 
                          i=i+1 

      edgeData.SetPoints(points) 
      edgeData.SetLines(lines) 
   
      
      Tubes = vtk.vtkTubeFilter() 
      Tubes.SetNumberOfSides(16) 
      Tubes.SetInputData(edgeData) 
      Tubes.SeTradius(.01) 
      
      profileMapper = vtk.vtkpolyDataMapper() 
      profileMapper.SetInputData(Tubes.Getoutput()) 
   
       
      profile = vtk.vtkActor() 
      profile.SetMapper(profileMapper) 
      profile.Getproperty().SetDiffuseColor(banana) 
      profile.Getproperty().Setspecular(.3) 
      profile.Getproperty().SetspecularPower(30) 
   
   
      ren = vtk.vtkRenderer() 
      renWin = vtk.vtkRenderWindow() 
      renWin.AddRenderer(ren) 
  
      iren = vtk.vtkRenderWindowInteractor() 
      iren.SetRenderWindow(renWin) 
    
      ren.AddActor(glyph) 
      ren.AddActor(profile) 
   
      renWin.SetSize(1000,1000) 
   
      iren.Initialize() 
      renWin.Render() 
      iren.Start() 

解决方法

您错过了以下几行:

    balls.Update()

    glyphPoints.Update()

    Tubes.Update()