Python wrapper for running instances of trisurf-ng
Samo Penic
2017-01-27 20db829c3a764ae1ea8ff79412bc7e0e9a6c92a9
commit | author | age
8ab985 1 import os,sys
SP 2 from . import trisurf
8b7022 3 try:
8ab985 4     from vtk import *
8b7022 5 except:
SP 6     print("Vtk rendering works if you manually install vtk7 for python3")
7     exit(1)
8ab985 8
SP 9 class MultiRender:
10     def __init__(self,args,host):
11         target_runs=getRargetRunIdxList(args)
12         if target_runs==None:
13             target_runs=list(range(1,len(host['runs'])+1))
14         nruns=len(target_runs)
15         #prepare rendering window
16         self.renderer_window = vtkRenderWindow()
17         self.renderer_window.AddRenderer(self.renderer)
18         self.renderer_window.SetSize(1200,600)
19         interactor = vtkRenderWindowInteractor()
20         interactor.SetRenderWindow(self.renderer_window)
21         interactor.Initialize()
22         interactor.AddObserver("TimerEvent", self.RenderUpdate)
23         timerIDR = interactor.CreateRepeatingTimer(1000)
24         self.filename=[]
25         self.renderer=[]
26         i=0
27         for run in target_runs:    
28             #for each target run calculate renderer location
29             r.vtkRenderer()
30             r.SetBackground(0,0,0)
31             p=1.0/float(nruns)
32             x1=i*p
33             x2=(i+1)*p
34             r.SetViewport(x1,0.0,x2,1.0)
35             self.renderer.Append(r)
36             self.renderer_window.AddRenderer(r)
37             i=i+1
38         #call Renderer object with Run, renderer
39         #start endless loop of interactor
40         interactor.Start()
41
42     def lastVTU(self,run):
43         Dir=trisurf.Directory(maindir=run.maindir,simdir=run.subdir)
44         filename=os.path.join("./",Dir.fullpath(),run.getLastVTU())
45         return filename
46
47     def lastActorForRun(self,run):
48         filename=self.lastVTU(run)
49         reader=vtkXMLUnstructuredGridReader()
50         reader.SetFileName(self.filename)
51         reader.Update() # Needed because of GetScalarRange
52         output = reader.GetOutput()
53         scalar_range = output.GetScalarRange()
54         mapper = vtkDataSetMapper()
8b7022 55         mapper.SetInputData(output)
8ab985 56         mapper.SetScalarRange(scalar_range)
SP 57
58         # Create the Actor
59         actor = vtkActor()
60         actor.SetMapper(mapper)
61         return actor
62
63
64
65     def RenderUpdate(self, obj, event):
66         i=0
67         for run in runs:
68             if(self.lastVTU(run)!=self.filename[i]):
69                 #print("updejt")
70                 self.renderer.RemoveActor(self.actor)
71                 self.renderer.RemoveActor(self.textactor)
72                 self.actor=self.lastActor()
73                 self.textactor=self.textActor()
74                 self.renderer.AddActor(self.actor)
75                 self.renderer.AddActor(self.textactor)
76                 self.renderer_window.Render()
77             #self.render.RemoveActor(self.actor)
78             i=i+1    
79         return
80
81
82 class Renderer:
d55834 83     def __init__(self,args,host,run, timestep=-1, scalar_field='vertices_idx'):
8ab985 84         self.host=host
SP 85         self.args=args
f49271 86         self.run=run
5f0a35 87         self.timestep=timestep
d55834 88         self.scalar_field=scalar_field
8ab985 89         self.renderer = vtkRenderer()
SP 90         self.actor=self.lastActor()
91         self.textactor=self.textActor()
92         self.renderer.AddActor(self.actor)
93         self.renderer.AddActor(self.textactor)
6d7192 94         self.renderer.SetBackground(81/255, 87/255, 110/255) # Set background to nicely grey
8ab985 95         # Create the RendererWindow
SP 96         self.renderer_window = vtkRenderWindow()
97         self.renderer_window.AddRenderer(self.renderer)
6d7192 98         self.renderer_window.SetSize(800,800)
8ab985 99     
f49271 100 #        self.renderer.SetViewport(0.0,0.0,0.5,1.0)
SP 101 #        rend=vtk.vtkRenderer()
102 #        rend.AddActor(self.actor)
103 #        rend.SetViewport(0.5,0.0,1.0,1.0)
104 #        self.renderer_window.AddRenderer(rend)    
8ab985 105 # Set up a check for aborting rendering.
SP 106         # Create the RendererWindowInteractor and display the vtk_file
107         interactor = vtkRenderWindowInteractor()
108         interactor.SetRenderWindow(self.renderer_window)
109         interactor.Initialize()
427578 110         interactor.AddObserver("TimerEvent", self.RenderUpdate)
f49271 111         timerIDR = interactor.CreateRepeatingTimer(10000)
8ab985 112         interactor.Start()
SP 113         return
114
115     def lastVTU(self):
f49271 116         #Dir=trisurf.Directory(maindir=self.host['runs'][self.run].maindir,simdir=self.host['runs'][self.run].subdir)
SP 117         Dir=self.run.Dir
118         #print(self.run.getLastVTU())
119         filename=os.path.join("./",Dir.fullpath(),self.run.getLastVTU())
120         #filename=os.path.join("./",Dir.fullpath(),self.host['runs'][self.run].getLastVTU())
8ab985 121         return filename
SP 122
123     def textActor(self):
124         textactor=vtkTextActor()
125         textactor.SetInput(self.filename)
126         tp=textactor.GetTextProperty()
127         tp.SetColor(1,1,1)
128         tp.SetFontSize(11)
129         textactor.SetDisplayPosition(20,30)
130         return textactor
131
132     def lastActor(self):
5f0a35 133         if(self.timestep<0):
SP 134             self.filename=self.lastVTU()
135         else:
136             self.filename=os.path.join("./",self.run.Dir.fullpath(),'timestep_{:06d}.vtu'.format(self.timestep))
8ab985 137         reader=vtkXMLUnstructuredGridReader()
SP 138         reader.SetFileName(self.filename)
139         reader.Update() # Needed because of GetScalarRange
140         output = reader.GetOutput()
d55834 141         output.GetPointData().SetActiveScalars(self.scalar_field)
8ab985 142         scalar_range = output.GetScalarRange()
SP 143         mapper = vtkDataSetMapper()
8b7022 144         mapper.SetInputData(output)
8ab985 145         mapper.SetScalarRange(scalar_range)
d55834 146         
SP 147         #color lookuptables
148         #lut = vtk.vtkLookupTable()
149         #lut.SetHueRange(0.5, 0.6)
150         #lut.SetSaturationRange(0, 1)
151         #lut.SetValueRange(0, 1)
152         #mapper.SetLookupTable(lut)
8ab985 153
6d7192 154         #advanced lookuptables...
SP 155         lut = vtk.vtkLookupTable()
156         lutNum = 256
157         lut.SetNumberOfTableValues(lutNum)
158         ctf = vtk.vtkColorTransferFunction()
159         ctf.SetColorSpaceToDiverging()
160         ctf.AddRGBPoint(0.0, 0.230, 0.299, 0.754)
161         ctf.AddRGBPoint(1.0, 0.706, 0.016, 0.150)
162         for ii,ss in enumerate([float(xx)/float(lutNum) for xx in range(lutNum)]):
163             cc = ctf.GetColor(ss)
164             lut.SetTableValue(ii,cc[0],cc[1],cc[2],1.0)
165         mapper.SetLookupTable(lut)
8ab985 166         # Create the Actor
SP 167         actor = vtkActor()
168         actor.SetMapper(mapper)
169         return actor
170
171
172     def RenderUpdate(self, obj, event):
173         if(self.lastVTU()!=self.filename):
174             #print("updejt")
175             self.renderer.RemoveActor(self.actor)
176             self.renderer.RemoveActor(self.textactor)
177             self.actor=self.lastActor()
178             self.textactor=self.textActor()
179             self.renderer.AddActor(self.actor)
180             self.renderer.AddActor(self.textactor)
181             self.renderer_window.Render()
182         #self.render.RemoveActor(self.actor)
183         
184         return