import os,sys
|
from . import trisurf
|
try:
|
from vtk import *
|
except:
|
print("Vtk rendering works if you manually install vtk7 for python3")
|
# exit(1)
|
|
class MultiRender:
|
def __init__(self,args,host):
|
target_runs=getRargetRunIdxList(args)
|
if target_runs==None:
|
target_runs=list(range(1,len(host['runs'])+1))
|
nruns=len(target_runs)
|
#prepare rendering window
|
self.renderer_window = vtkRenderWindow()
|
self.renderer_window.AddRenderer(self.renderer)
|
self.renderer_window.SetSize(1200,600)
|
interactor = vtkRenderWindowInteractor()
|
interactor.SetRenderWindow(self.renderer_window)
|
interactor.Initialize()
|
interactor.AddObserver("TimerEvent", self.RenderUpdate)
|
timerIDR = interactor.CreateRepeatingTimer(1000)
|
self.filename=[]
|
self.renderer=[]
|
i=0
|
for run in target_runs:
|
#for each target run calculate renderer location
|
r.vtkRenderer()
|
r.SetBackground(0,0,0)
|
p=1.0/float(nruns)
|
x1=i*p
|
x2=(i+1)*p
|
r.SetViewport(x1,0.0,x2,1.0)
|
self.renderer.Append(r)
|
self.renderer_window.AddRenderer(r)
|
i=i+1
|
#call Renderer object with Run, renderer
|
#start endless loop of interactor
|
interactor.Start()
|
|
def lastVTU(self,run):
|
Dir=trisurf.Directory(maindir=run.maindir,simdir=run.subdir)
|
filename=os.path.join("./",Dir.fullpath(),run.getLastVTU())
|
return filename
|
|
def lastActorForRun(self,run):
|
filename=self.lastVTU(run)
|
reader=vtkXMLUnstructuredGridReader()
|
reader.SetFileName(self.filename)
|
reader.Update() # Needed because of GetScalarRange
|
output = reader.GetOutput()
|
scalar_range = output.GetScalarRange()
|
mapper = vtkDataSetMapper()
|
mapper.SetInputData(output)
|
mapper.SetScalarRange(scalar_range)
|
|
# Create the Actor
|
actor = vtkActor()
|
actor.SetMapper(mapper)
|
return actor
|
|
|
|
def RenderUpdate(self, obj, event):
|
i=0
|
for run in runs:
|
if(self.lastVTU(run)!=self.filename[i]):
|
#print("updejt")
|
self.renderer.RemoveActor(self.actor)
|
self.renderer.RemoveActor(self.textactor)
|
self.actor=self.lastActor()
|
self.textactor=self.textActor()
|
self.renderer.AddActor(self.actor)
|
self.renderer.AddActor(self.textactor)
|
self.renderer_window.Render()
|
#self.render.RemoveActor(self.actor)
|
i=i+1
|
return
|
|
|
class Renderer:
|
def __init__(self,args,host,run, timestep=-1, scalar_field='vertices_idx'):
|
self.host=host
|
self.args=args
|
self.run=run
|
self.timestep=timestep
|
self.scalar_field=scalar_field
|
self.renderer = vtkRenderer()
|
self.actor=self.lastActor()
|
self.textactor=self.textActor()
|
self.renderer.AddActor(self.actor)
|
self.renderer.AddActor(self.textactor)
|
self.renderer.SetBackground(81/255, 87/255, 110/255) # Set background to nicely grey
|
# Create the RendererWindow
|
self.renderer_window = vtkRenderWindow()
|
self.renderer_window.AddRenderer(self.renderer)
|
self.renderer_window.SetSize(800,800)
|
|
# self.renderer.SetViewport(0.0,0.0,0.5,1.0)
|
# rend=vtk.vtkRenderer()
|
# rend.AddActor(self.actor)
|
# rend.SetViewport(0.5,0.0,1.0,1.0)
|
# self.renderer_window.AddRenderer(rend)
|
# Set up a check for aborting rendering.
|
# Create the RendererWindowInteractor and display the vtk_file
|
interactor = vtkRenderWindowInteractor()
|
interactor.SetRenderWindow(self.renderer_window)
|
interactor.Initialize()
|
interactor.AddObserver("TimerEvent", self.RenderUpdate)
|
timerIDR = interactor.CreateRepeatingTimer(10000)
|
interactor.Start()
|
return
|
|
def lastVTU(self):
|
#Dir=trisurf.Directory(maindir=self.host['runs'][self.run].maindir,simdir=self.host['runs'][self.run].subdir)
|
Dir=self.run.Dir
|
#print(self.run.getLastVTU())
|
filename=os.path.join("./",Dir.fullpath(),self.run.getLastVTU())
|
#filename=os.path.join("./",Dir.fullpath(),self.host['runs'][self.run].getLastVTU())
|
return filename
|
|
def textActor(self):
|
textactor=vtkTextActor()
|
textactor.SetInput(self.filename)
|
tp=textactor.GetTextProperty()
|
tp.SetColor(1,1,1)
|
tp.SetFontSize(11)
|
textactor.SetDisplayPosition(20,30)
|
return textactor
|
|
def lastActor(self):
|
if(self.timestep<0):
|
self.filename=self.lastVTU()
|
else:
|
self.filename=os.path.join("./",self.run.Dir.fullpath(),'timestep_{:06d}.vtu'.format(self.timestep))
|
reader=vtkXMLUnstructuredGridReader()
|
reader.SetFileName(self.filename)
|
reader.Update() # Needed because of GetScalarRange
|
output = reader.GetOutput()
|
output.GetPointData().SetActiveScalars(self.scalar_field)
|
scalar_range = output.GetScalarRange()
|
mapper = vtkDataSetMapper()
|
mapper.SetInputData(output)
|
mapper.SetScalarRange(scalar_range)
|
|
#color lookuptables
|
#lut = vtk.vtkLookupTable()
|
#lut.SetHueRange(0.5, 0.6)
|
#lut.SetSaturationRange(0, 1)
|
#lut.SetValueRange(0, 1)
|
#mapper.SetLookupTable(lut)
|
|
#advanced lookuptables...
|
lut = vtk.vtkLookupTable()
|
lutNum = 256
|
lut.SetNumberOfTableValues(lutNum)
|
ctf = vtk.vtkColorTransferFunction()
|
ctf.SetColorSpaceToDiverging()
|
ctf.AddRGBPoint(0.0, 0.230, 0.299, 0.754)
|
ctf.AddRGBPoint(1.0, 0.706, 0.016, 0.150)
|
for ii,ss in enumerate([float(xx)/float(lutNum) for xx in range(lutNum)]):
|
cc = ctf.GetColor(ss)
|
lut.SetTableValue(ii,cc[0],cc[1],cc[2],1.0)
|
mapper.SetLookupTable(lut)
|
# Create the Actor
|
actor = vtkActor()
|
actor.SetMapper(mapper)
|
return actor
|
|
|
def RenderUpdate(self, obj, event):
|
if(self.lastVTU()!=self.filename):
|
#print("updejt")
|
self.renderer.RemoveActor(self.actor)
|
self.renderer.RemoveActor(self.textactor)
|
self.actor=self.lastActor()
|
self.textactor=self.textActor()
|
self.renderer.AddActor(self.actor)
|
self.renderer.AddActor(self.textactor)
|
self.renderer_window.Render()
|
#self.render.RemoveActor(self.actor)
|
|
return
|
|
|
class RenderVTUFile(Renderer):
|
def __init__(self,args,filename=None,scalar_field='vertices_idx'):
|
self.filename=filename
|
Renderer.__init__(self,args,host=None, run=None, timestep=-1, scalar_field=scalar_field)
|
|
def lastVTU(self):
|
if(self.filename):
|
return self.filename
|
else:
|
raise Exception('No file specified')
|