diff --git a/SimPEG/visulize/vtk/vtkTools.py b/SimPEG/visulize/vtk/vtkTools.py index 3840a1bc..50387a14 100644 --- a/SimPEG/visulize/vtk/vtkTools.py +++ b/SimPEG/visulize/vtk/vtkTools.py @@ -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""" diff --git a/SimPEG/visulize/vtk/vtkView.py b/SimPEG/visulize/vtk/vtkView.py index 20bcdaa8..bb1c4f60 100644 --- a/SimPEG/visulize/vtk/vtkView.py +++ b/SimPEG/visulize/vtk/vtkView.py @@ -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)