Search code examples
pythoncsvscriptingexport-to-csvparaview

writing plotOverline csv data from paraview for all time steps with python script


I am trying to extract the data (as csv) from a line for all the time steps with the PlotOverLine filter in Paraview. In the GUI, I load the foam file, use the PlotOverLine filter and save the spread sheet view as csv file and click the next button in the animation panel to load the next time step and repeat the above for the remaining time steps at the same location of the line source.(since its transient data, I need data over all the time steps at a fixed location.) I used the following script.

try: paraview.simple    
except: from paraview.simple import *
paraview.simple._DisableFirstRenderCameraReset()

my_foam = FindSource("case.foam") #loading my case file
SetActiveSource(my_foam)
tsteps = my_foam.TimestepValues # trying to read all time step directories
for TimeStepNum in range(0,len(tsteps)): # the loop?
  view = GetActiveView()
  view.ViewTime = tsteps[TimeStepNum]
  Render()
  
  PlotOverLine1 = PlotOverLine( Source="High Resolution Line Source" )
  DataRepresentation7 = Show()

  PlotOverLine1.Source.Point1 = [-0.052, 0.0, 0.0] #my fixed location
  PlotOverLine1.Source.Point2 = [0.0, 0.0, 0.0]
  source = PlotOverLine1
  writer = CreateWriter("file_%d.csv" %(TimeStepNum), source)
  writer.FieldAssociation = "Points"
  writer.UpdatePipeline()
  Render()
  del writer

Say If I have 5 time steps, the script when run as a macro on Paraview, produces file_0 to file_5.csv however, file_1 to file_4 have 'nan' as data in them instead of actual values. Where as, the file_0 and file_5 have the values as they should be. I am a newbie don't know where I am going wrong! Not sure if the time step is getting updated before plotting the next line data. Any help would be appreciated! There should be an easier way to update timesteps and then use the same filter at the same location I guess.


Solution

  • I finally managed to get it right. So, the problem with the previous script is though it was moving on to the next time step once the PlotOverLine was complete, it was trying to pick a line within the line. I just tweaked the way the time loop takes place by initially creating a fixed line and then looping over the remaining time steps (which is how it should be done!). The working script:

    try: paraview.simple
    except: from paraview.simple import *
    paraview.simple._DisableFirstRenderCameraReset()
    
    my_foam = FindSource("case.foam")
    SetActiveSource(my_foam)
    
    tsteps = my_foam.TimestepValues
    PlotOverLine1 = PlotOverLine( Source="High Resolution Line Source" )
    DataRepresentation7 = Show()
    
    PlotOverLine1.Source.Point1 = [-0.052, 0.0, 0.0]
    PlotOverLine1.Source.Point2 = [0.0, 0.0, 0.0]
    
    source = PlotOverLine1
    
    for TimeStepNum in range(0,len(tsteps)):
        view = GetActiveView()
        view.ViewTime = tsteps[TimeStepNum]
        Render()
        writer = CreateWriter("file_%d.csv" %(TimeStepNum), source)
        writer.FieldAssociation = "Points"
        writer.UpdatePipeline()
        Render()
        del writer
    

    This works perfectly!