vtkView works for 'cell' data, but currently not for 'face' and 'edge'.

This commit is contained in:
Gudni Karl Rosenkjaer
2013-11-10 23:52:39 -08:00
parent e5a3e8de7d
commit 47a4716d95
2 changed files with 130 additions and 20 deletions
+83 -7
View File
@@ -55,7 +55,8 @@ class vtkTools(object):
vtkDoubleArr = npsup.numpy_to_vtk(item[1],deep=1)
vtkDoubleArr.SetName(item[0])
vtkObj.GetCellData().AddArray(vtkDoubleArr)
vtkObj.GetCellData().SetActiveScalars(model.keys()[0])
return vtkObj
@staticmethod
@@ -117,6 +118,8 @@ class vtkTools(object):
vtkDoubleArr = npsup.numpy_to_vtk(item[1],deep=1)
vtkDoubleArr.SetName(item[0])
vtkObj.GetCellData().AddArray(vtkDoubleArr)
vtkObj.GetCellData().SetActiveScalars(model.keys()[0])
vtkObj.Update()
return vtkObj
@@ -177,17 +180,18 @@ class vtkTools(object):
vtkDoubleArr = npsup.numpy_to_vtk(item[1],deep=1)
vtkDoubleArr.SetName(item[0])
vtkObj.GetCellData().AddArray(vtkDoubleArr)
vtkObj.GetCellData().SetActiveScalars(model.keys()[0])
return vtkObj
@staticmethod
def makeRenderWindow(ren):
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.SetRenderWindow(renwin)
return iren
return iren, renwin
@staticmethod
@@ -195,6 +199,7 @@ class vtkTools(object):
renwin = iren.GetRenderWindow()
renwin.Finalize()
iren.TerminateApp()
del iren, renwin
@staticmethod
@@ -206,9 +211,80 @@ class vtkTools(object):
actor.SetMapper(mapper)
actor.GetProperty().SetColor(0,0,0)
actor.GetProperty().SetRepresentationToWireframe()
return actor
@staticmethod
def makeVTKLODActor(vtkObj,clipper):
"""Make LOD vtk Actor"""
selectMapper = vtk.vtkDataSetMapper()
selectMapper.SetInputConnection(clipper.GetOutputPort())
selectMapper.SetScalarVisibility(1)
selectMapper.SetColorModeToMapScalars()
selectMapper.SetScalarModeToUseCellData()
selectMapper.SetScalarRange(clipper.GetInputDataObject(0,0).GetCellData().GetArray(0).GetRange())
selectActor = vtk.vtkLODActor()
selectActor.SetMapper(selectMapper)
selectActor.GetProperty().SetEdgeColor(1,0.5,0)
selectActor.GetProperty().SetEdgeVisibility(0)
selectActor.VisibilityOn()
selectActor.SetScale(1.01, 1.01, 1.01)
return selectActor
@staticmethod
def setScalar2View(vtkObj,scalarName):
""" Sets the sclar to view """
useArr = vtkObj.GetCellData().GetArray(scalarName)
if useArr == None:
raise IOError('Nerty array {:s} in the vtkObject'.format(scalarName))
vtkObj.GetCellData().SetActiveScalars(scalarName)
@staticmethod
def makeRectiVTKVOIThres(vtkObj):
"""Make volume of interest and threshold for rectilinear grid."""
cellCore = vtk.vtkExtractRectilinearGrid()
cellCore.SetInput(vtkObj)
cellCore.SetVOI(vtkObj.GetExtent())
cellThres = vtk.vtkThreshold()
cellThres.AllScalarsOn()
cellThres.SetInputConnection(cellCore.GetOutputPort())
cellThres.ThresholdByUpper(-1)
cellThres.Update()
return cellThres.GetOutput(), cellCore.GetOutput()
@staticmethod
def makePlaneClipper(vtkObj):
"""Makes a plane and clipper """
plane = vtk.vtkPlane()
clipper = vtk.vtkClipDataSet()
clipper.SetInputConnection(vtkObj.GetProducerPort())
clipper.SetClipFunction(plane)
clipper.InsideOutOff()
return clipper, plane
@staticmethod
def makePlaneWidget(vtkObj,iren,plane,actor):
"""Make an interactive planeWidget"""
# Callback function
def movePlane(obj, events):
obj.GetPlane(intPlane)
intActor.VisibilityOn()
# Associate the line widget with the interactor
planeWidget = vtk.vtkImplicitPlaneWidget()
planeWidget.SetInteractor(iren)
planeWidget.SetPlaceFactor(1.25)
planeWidget.SetInput(vtkObj)
planeWidget.PlaceWidget()
#planeWidget.AddObserver("InteractionEvent", movePlane)
planeWidget.SetScaleEnabled(0)
planeWidget.SetEnabled(1)
planeWidget.SetOutlineTranslation(0)
planeWidget.GetPlaneProperty().SetOpacity(0.1)
return planeWidget
@staticmethod
def startRenderWindow(iren):
""" Start a vtk rendering window"""
+47 -13
View File
@@ -28,14 +28,25 @@ class vtkView(object):
self.name = 'VTK figure of SimPEG model'
self._mesh = mesh
# Set vtk object containers
self._cell = None
self._faces = None
self._edges = None
self._readPropertyDictionary(propdict)
# Setup hidden properties
self._ren = None
self._iren = None
self._renwin = None
self._core = None
self._viewobj = None
self._plane = None
self._clipper = None
self._widget = None
self._actor = None
self._lut = None
def _readPropertyDictionary(self,propdict):
"""
Reads the property and assigns to the object
@@ -68,27 +79,50 @@ class vtkView(object):
import SimPEG.visulize.vtk.vtkTools as vtkSP
# Make a renderer
ren = vtk.vtkRenderer()
self._ren = vtk.vtkRenderer()
# Make renderwindow. Returns the interactor.
iren = vtkSP.makeRenderWindow(ren)
self._iren, self._renwin = vtkSP.makeRenderWindow(self._ren)
# Sort out the actor
if imageType == 'cell':
actor = vtkSP.makeVTKActor(self._cell)
self._vtkobj, self._core = vtkSP.makeRectiVTKVOIThres(self._cell)
elif imageType == 'face':
actor = vtkSP.makeVTKActor(self._face)
self._vtkobj, self._core = vtkSP.makeRectiVTKVOIThres(self._face)
elif imageType == 'edge':
actor = vtkSP.makeVTKActor(self._edge)
actor.GetProperty().SetRepresentationToSurface()
self._vtkobj, self._core = vtkSP.makeRectiVTKVOIThres(self._edge)
else:
raise(Exception,"{:s} is not a vailid imageType. Has to be 'cell':'face':'edge'".format(imageType))
raise Exception("{:s} is not a vailid imageType. Has to be 'cell':'face':'edge'".format(imageType))
ren.AddActor(actor)
ren.SetBackground(.5,.5,.5)
vtkSP.startRenderWindow(iren)
global intPlane, intActor
self._clipper, intPlane = vtkSP.makePlaneClipper(self._vtkobj)
intActor = vtkSP.makeVTKLODActor(self._vtkobj,self._clipper)
self._widget = vtkSP.makePlaneWidget(self._vtkobj,self._iren,self._clipper.GetClipFunction(),self._actor)
# Callback function
self._plane = intPlane
self._actor = intActor
def movePlane(obj, events):
global intPlane, intActor
obj.GetPlane(intPlane)
intActor.VisibilityOn()
vtkSP.closeRenderWindow(iren)
self._widget.AddObserver("InteractionEvent",movePlane)
lut = vtk.vtkLookupTable()
lut.SetNumberOfColors(256)
lut.SetHueRange(0,0.66667)
lut.Build()
self._lut = lut
self._actor.GetMapper().SetLookupTable(lut)
# Set renderer options
self._ren.SetBackground(.5,.5,.5)
self._ren.AddActor(self._actor)
# Start the render Window
vtkSP.startRenderWindow(self._iren)
# Close the window when exited
vtkSP.closeRenderWindow(self._iren)