#============================================================================== # # Project: SharpImage # Module: ThesisHelperVolume.py # Language: IronPython # Author: Dan Mueller # Date: $Date$ # Revision: $Revision$ # # Copyright (c) Queensland University of Technology (QUT) 2008. # All rights reserved. # # This software is distributed WITHOUT ANY WARRANTY; without even # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the above copyright notices for more information. # #============================================================================== # Import the base script class import Script from Script import * clr.AddReference("Tao.OpenGl") from Tao.OpenGl import * from System import String class ThesisHelperVolumeScript(ScriptObject): # ------------------------------------------------------------------------- Name = "ThesisHelperVolume" Help = """Display a form for driving my thesis volume presentation.""" Parameters = """None""" FormDriver = None FormTf = None FormProps = None FormWeights = None Renderer = None ImageValue = None ImageGradient = None ImageExtra1 = None ImageExtra2 = None TfPathNormal = None TfPathBinary = None TfPathGreyscaleExplore = None TfPathGreyscaleScalar = None ShaderPath = "C:/Utils/SharpImage/Build/x64/Release/Scripting/Rendering/" # ------------------------------------------------------------------------- def Run(self): """ The entry-point for this script. """ try: self.Initialise() self.DoWork() except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise() def Initialise(self): """ Initialise the environment for running this script. """ """ NOTE: This function is invoked on the main UI thread. """ try: # Initialise the base class ScriptObject.Initialise( self ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def DoWork(self): """ Perform the main functions of the script. """ """ NOTE: This function is invoked on the main UI thread. """ try: self.StartedWork() # Create driver tool form self.FormDriver = siFormFlowLayout( ) self.FormDriver.Text = "Helper" self.FormDriver.Continue += self.OnContinueClicked self.FormDriver.Cancel += self.OnCancelClicked # Populate driver form self.FormDriver.AddOpenFile( CallTarget1(self.OnOpenFile) ) self.FormDriver.AddButton( "Slice: Axial (RAS)", CallTarget2(self.OnClickedRAS) ) self.FormDriver.AddButton( "Slice: Sagittal (ASL)", CallTarget2(self.OnClickedASL) ) self.FormDriver.AddButton( "Slice: Oblique", CallTarget2(self.OnClickedOblique) ) self.FormDriver.AddButton( "MIP: Normal", CallTarget2(self.OnClickedNormalMIP) ) self.FormDriver.AddButton( "MIP: Thin-slab", CallTarget2(self.OnClickedThinMIP) ) self.FormDriver.AddButton( "MIP: Weighted", CallTarget2(self.OnClickedWeightedMIP) ) self.FormDriver.AddButton( "Volume: Normal", CallTarget2(self.OnClickedNormalDVR) ) self.FormDriver.AddButton( "Volume: Shaded", CallTarget2(self.OnClickedShadedDVR) ) self.FormDriver.AddButton( "Volume: Binary tags", CallTarget2(self.OnClickedBinaryDVR) ) self.FormDriver.AddButton( "Volume: Greyscale: Explore", CallTarget2(self.OnClickedGreyscaleExplore) ) self.FormDriver.AddButton( "Volume: Greyscale: Scalar", CallTarget2(self.OnClickedGreyscaleScalar) ) self.FormDriver.AddCustomControl( 10, None ) self.FormDriver.AddButton( "Edit Transfer Function", CallTarget2(self.OnClickedEditTf) ) self.FormDriver.AddButton( "Edit Weights", CallTarget2(self.OnClickedEditWeights) ) #self.FormDriver.AddButton( "Wireframe", CallTarget2(self.OnClickedWireframe) ) self.FormDriver.AddButton( "Animate1", CallTarget2(self.OnClickedAnimate1) ) self.FormDriver.AddButton( "Animate2", CallTarget2(self.OnClickedAnimate2) ) self.ParentApplication.AddTool( self.FormDriver ) # Let user do work self.ParentApplication.SetApplicationAsReady( 0 ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnContinueClicked(self, sender, args): """ Close the form. """ self.UnregisterEventHandlers() self.FormDriver.Close() self.FinishedWork( True ) self.Finalise( ) def OnCancelClicked(self, sender, args): """ Cancel the script. """ self.UnregisterEventHandlers() self.FormDriver.Close() self.FinishedWork( True ) self.Finalise( ) def UnregisterEventHandlers(self): """ Unregister all the event handlers. """ if (self.FormDriver != None): self.FormDriver.Continue -= self.OnContinueClicked self.FormDriver.Cancel -= self.OnCancelClicked def OnOpenFile( self, filepath ): """Opens the given text file and reads upto four images (Value, Gradient, Extra1, and/or Extra2) from the fully qualified file paths. The types are as follows: Value=SS3, Gradient=UC3, Extra1=UC3, Extra2=F3""" try: # Set application as working self.ParentApplication.SetApplicationAsWorking( ) self.ParentApplication.SetApplicationStatusLabel( "Loading images..." ) # Dispose of existing images if ( self.ImageValue != None ): self.ImageValue.Dispose( ) self.ImageValue = None if ( self.ImageGradient != None ): self.ImageGradient.Dispose( ) self.ImageGradient = None if ( self.ImageExtra1 != None ): self.ImageExtra1.Dispose( ) self.ImageExtra1 = None if ( self.ImageExtra2 != None ): self.ImageExtra2.Dispose( ) self.ImageExtra2 = None # Close and dispose of existing renderer if ( self.Renderer != None ): self.Renderer.Close( ) self.Renderer.Dispose( ) self.Renderer = None # Read Volume (*.vol) file lines = File.ReadAllLines( filepath ) # Extract images and transfer functions (tf) pathValue = None pathGradient = None pathExtra1 = None pathExtra2 = None for i in range(lines.Length): if (lines[i].StartsWith( "Value=" ) ): pathValue = lines[i].Replace( "Value=", "" ) elif (lines[i].StartsWith( "Gradient=" ) ): pathGradient = lines[i].Replace( "Gradient=", "" ) elif (lines[i].StartsWith( "Extra1=" ) ): pathExtra1 = lines[i].Replace( "Extra1=", "" ) elif (lines[i].StartsWith( "Extra2=" ) ): pathExtra2 = lines[i].Replace( "Extra2=", "" ) elif (lines[i].StartsWith( "TfNormal=" ) ): self.TfPathNormal = lines[i].Replace( "TfNormal=", "" ) elif (lines[i].StartsWith( "TfBinary=" ) ): self.TfPathBinary = lines[i].Replace( "TfBinary=", "" ) elif (lines[i].StartsWith( "TfGreyscaleExplore=" ) ): self.TfPathGreyscaleExplore = lines[i].Replace( "TfGreyscaleExplore=", "" ) elif (lines[i].StartsWith( "TfGreyscaleScalar=" ) ): self.TfPathGreyscaleScalar = lines[i].Replace( "TfGreyscaleScalar=", "" ) # Read images if ( pathValue != None and pathValue.Length > 0 ): self.WriteLineToConsole( "Reading " + Path.GetFileName( pathValue ) ) #todo: read information and open with native pixel type self.ImageValue = itkImage_SS3.New( ) self.ImageValue.Read( pathValue ) else: self.ImageValue = None if ( pathGradient != None and pathGradient.Length > 0 ): self.WriteLineToConsole( "Reading " + Path.GetFileName( pathGradient ) ) self.ImageGradient = itkImage_UC3.New( ) self.ImageGradient.Read( pathGradient ) else: self.ImageGradient = None if ( pathExtra1 != None and pathExtra1.Length > 0 ): self.WriteLineToConsole( "Reading " + Path.GetFileName( pathExtra1 ) ) self.ImageExtra1 = itkImage_UC3.New( ) self.ImageExtra1.Read( pathExtra1 ) else: self.ImageExtra1 = None if ( pathExtra2 != None and pathExtra2.Length > 0 ): self.WriteLineToConsole( "Reading " + Path.GetFileName( pathExtra2 ) ) self.ImageExtra2 = itkImage_UC3.New( ) self.ImageExtra2.Read( pathExtra2 ) else: self.ImageExtra2 = None # Set application as ready self.ParentApplication.SetApplicationAsReady( 0 ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedEditTf(self, sender, args): """Displays the transfer function editor for the current function.""" try: if ( self.Renderer == None ): return self.FormTf = siFormTransferFunctionEditor( self.Renderer.TransferFunction ) self.FormTf.Continue += self.OnClickedEditTfContinue self.FormTf.Cancel += self.OnClickedEditTfCancel self.ParentApplication.AddTool( self.FormTf ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedEditTfContinue(self, sender, args): """Handler method for transfer function continue event.""" self.FormTf = None def OnClickedEditTfCancel(self, sender, args): """Handler method for transfer function cancel event.""" self.FormTf = None def OnClickedEditWeights(self, sender, args): """Displays the weights editor for Factor1, Factor2, and Factor3.""" try: if ( self.Renderer == None ): return self.FormWeights = siFormVariableSlider( self.ImageValue ) self.FormWeights.Text = "Weights" self.FormWeights.AddVariable( "Factor1", 1.00, 0.0, 1.0, 0.001 ) self.FormWeights.AddVariable( "Factor2", 1.00, 0.0, 1.0, 0.001 ) self.FormWeights.AddVariable( "Factor3", 1.00, 0.0, 1.0, 0.001 ) self.FormWeights.ValueStringFormat = "00.000" self.FormWeights.Initialise( ) self.FormWeights.VariableChanged += self.OnVariableChanged self.ParentApplication.AddTool( self.FormWeights ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnVariableChanged(self, name, variables): """ Handle the self.IllustrationEditor.VariableChanged event. """ if ( self.Renderer == None ): return self.Renderer.Properties.Factor1 = variables["Factor1"] self.Renderer.Properties.Factor2 = variables["Factor2"] self.Renderer.Properties.Factor3 = variables["Factor3"] def OpenTfFromFile( self, filepath ): """Opens the given transfer function XML file and updates the current volume renderer.""" try: if ( self.Renderer == None ): return if ( filepath == None or filepath.Length == 0 ): return tfFromFile = siTransferFunction.FromXmlFile( filepath ) self.Renderer.TransferFunction.ModifiedEventEnabled = False self.Renderer.TransferFunction.ClearAllParts( ) for part in tfFromFile.Parts: self.Renderer.TransferFunction.AddPartToBack( part ) self.Renderer.TransferFunction.ModifiedEventEnabled = True except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def InitSlices( self, image ): """Show the given image in the current slice renderer. If the current renderer is not a slice renderer, or the current rendderer is None, the current renderer is closed and a new renderer is displayed.""" try: typeRenderer = Type.GetType("SharpImage.Rendering.siGdiSliceRenderer") if ( self.Renderer != None and String.Compare( self.Renderer.TypeName, "GDI Viewer" ) != 0 ): # Close existing renderer self.Renderer.Close( ) self.Renderer.Dispose( ) self.Renderer = None if ( self.Renderer == None ): # Create new slice renderer self.Renderer = self.ParentApplication.ShowImageInNewRenderer( image ) else: # Set input of current renderer self.Renderer.Inputs[0] = image self.Renderer.InitialiseInputs( ) self.Renderer.Repaint( ) self.Renderer.Focus( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def InitVolume( self ): """Show the already open images in the current volume renderer. If the current renderer is not a volume renderer, or the current renderer is None, the current renderer is closed and a new renderer is displayed. The volume properties are left as their default values.""" try: typeRenderer = Type.GetType("SharpImage.Rendering.siVolumeRenderer") if ( self.Renderer != None and String.Compare( self.Renderer.TypeName, "Volume Renderer" ) != 0 ): # Close existing renderer self.Renderer.Close( ) self.Renderer.Dispose( ) self.Renderer = None if ( self.Renderer == None ): # Set application as working self.ParentApplication.SetApplicationAsWorking( ) self.ParentApplication.SetApplicationStatusLabel( "Initialising volume renderer..." ) self.WriteLineToConsole( "Initialising volume renderer..." ) # Create new volume renderer self.Renderer = siVolumeRenderer( self.ParentApplication ) self.Renderer.Properties.RepaintRenderer = False programVert = Path.Combine( self.ShaderPath, "shader-vm.vert" ) programFrag = Path.Combine( self.ShaderPath, "shader-vm.frag" ) self.Renderer.Metadata["VertexProgram"] = programVert self.Renderer.Metadata["FragmentProgram"] = programFrag if ( self.ImageValue != None ): self.ImageValue.Metadata["Value"] = True self.ImageValue.Metadata["TextureInterpolation"] = Gl.GL_LINEAR self.Renderer.Inputs.Add( self.ImageValue ) if ( self.ImageGradient != None ): self.ImageGradient.Metadata["Gradient"] = True self.ImageGradient.Metadata["TextureInterpolation"] = Gl.GL_LINEAR self.Renderer.Inputs.Add( self.ImageGradient ) if ( self.ImageExtra1 != None ): self.ImageExtra1.Metadata["Extra1"] = True self.ImageExtra1.Metadata["TextureInterpolation"] = Gl.GL_NEAREST self.Renderer.Inputs.Add( self.ImageExtra1 ) if ( self.ImageExtra2 != None ): self.ImageExtra2.Metadata["Extra2"] = True self.ImageExtra2.Metadata["TextureInterpolation"] = Gl.GL_NEAREST self.Renderer.Inputs.Add( self.ImageExtra2 ) function = siTransferFunction( itkSize(512,128), "All", "Tag1", "Tag2", "Tag3", "Tag4", "Tag5", "Tag6", "Tag7" ) self.Renderer.Metadata["TransferFunction"] = function self.Renderer.Initialise( ) self.SetVolumeSamplingRate( 1.2, 1.8 ) ambient = Color.FromArgb(255,140,140,140); diffuse = Color.FromArgb(255,140,140,140); specular = Color.FromArgb(255,40,40,40); self.SetVolumeLighting( ambient, diffuse, specular, 20.0 ) self.Renderer.Properties.BoxOutlineEnabled = False self.Renderer.Properties.BoxOutlineColor = Color.FromArgb( 128, 192, 192, 192 ) self.Renderer.Properties.NormalOffset = 0.006 self.Renderer.Properties.Factor1 = 1.00 self.Renderer.Properties.Factor2 = 1.00 self.Renderer.Properties.Factor3 = 1.00 # Set application as ready self.ParentApplication.SetApplicationAsReady( 0 ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def ShowRenderer( self ): """Show the current renderer.""" try: if ( self.Renderer == None ): return self.ParentApplication.ShowRenderer( self.Renderer ) self.Renderer.Form.WindowState = FormWindowState.Maximized except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeSamplingRate( self, low, high ): """Set the volume sampling rate of the current renderer.""" try: if ( self.Renderer == None ): return self.Renderer.Properties.SamplingRate.LowQuality = low; self.Renderer.Properties.SamplingRate.HighQuality = high; except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeGeometry( self, geometry ): """Set the volume proxy geomety of the current renderer. Geometry can either be: ViewAlignedFill, ViewAlignedSingle, ViewAlignedSlab, or Orthogonal.""" try: if ( self.Renderer == None ): return self.Renderer.Properties.GeometryType = geometry except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeBlending( self, blending ): """Set the volume blending type of the current renderer. Bending can either be: BackToFront, MaximumProjection, or MinimumProjection.""" try: if ( self.Renderer == None ): return self.Renderer.Properties.Blending = blending except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeBackColor( self, color ): """Set the volume renderer background colour.""" try: if ( self.Renderer == None ): return self.Renderer.Properties.BackColor = color except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeShader( self, shaderpath, shaderfile ): """Set the volume shader of the current renderer from the given FRAG file.""" try: if ( self.Renderer == None ): return self.Renderer.Properties.FragmentProgramPath = Path.Combine( shaderpath, shaderfile ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeLighting( self, ambient, diffuse, specular, exponent ): """Set the lighting properties for the current volume renderer.""" try: if ( self.Renderer == None ): return self.Renderer.Properties.LightColorAmbient = ambient self.Renderer.Properties.LightColorDiffuse = diffuse self.Renderer.Properties.LightColorSpecular = specular self.Renderer.Properties.LightColorSpecularExponent = exponent except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def SetVolumeTransform( self, transform ): """Set the transform for the current volume renderer.""" try: if ( self.Renderer == None ): return if ( String.Compare( transform, "RAS" ) == 0 ): self.Renderer.Properties.TransformRotation = itkVector( 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ) elif ( String.Compare( transform, "ASL" ) == 0 ): self.Renderer.Properties.TransformRotation = itkVector( 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedRAS(self, sender, args): """Display the current image in a new slice renderer, or sets the input for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedSingle ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeTransform( "RAS" ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-v-copy.frag" ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedASL(self, sender, args): """Display the current image in a new slice renderer, or sets the input for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedSingle ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeTransform( "ASL" ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-v-copy.frag" ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedOblique(self, sender, args): """Display the current image in a new volume renderer for oblique sections, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedSingle ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-v-copy.frag" ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedNormalMIP(self, sender, args): """Display the current image in a new volume renderer for MIP, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.MaximumProjection ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-v-copy.frag" ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedThinMIP(self, sender, args): """Display the current image in a new volume renderer for thin-slab MIP, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = True self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedSlab ) self.SetVolumeBlending( siVolumeBlendEnum.MaximumProjection ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-v-copy.frag" ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedWeightedMIP(self, sender, args): """Display the current image in a new volume renderer for weighted MIP, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.MaximumProjection ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-vt-copy.frag" ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedNormalDVR(self, sender, args): """Display the current image in a new volume renderer for simple DVR, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-vm-simple.frag" ) if ( self.FormTf == None ): self.OpenTfFromFile( self.TfPathNormal ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedShadedDVR(self, sender, args): """Display the current image in a new volume renderer for shaded DVR, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-vm-phong-simple.frag" ) if ( self.FormTf == None ): self.OpenTfFromFile( self.TfPathNormal ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedBinaryDVR(self, sender, args): """Display the current image in a new volume renderer for binary DVR, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-vmt-phong-simple.frag" ) if ( self.FormTf == None ): self.OpenTfFromFile( self.TfPathBinary ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedGreyscaleExplore(self, sender, args): """Display the current image in a new volume renderer for greyscale DVR, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-vmtg-phong-simple.frag" ) if ( self.FormTf == None ): self.OpenTfFromFile( self.TfPathGreyscaleExplore ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedGreyscaleScalar(self, sender, args): """Display the current image in a new volume renderer for greyscale DVR, or sets the input and properties for the current renderer.""" try: self.InitVolume( ) self.Renderer.Properties.RepaintRenderer = False self.Renderer.Properties.BoxOutlineEnabled = False self.SetVolumeGeometry( siVolumeGeometryEnum.ViewAlignedFill ) self.SetVolumeBlending( siVolumeBlendEnum.BackToFront ) self.SetVolumeBackColor( Color.Black ) self.SetVolumeShader( self.ShaderPath, "shader-vmtv-phong-simple.frag" ) if ( self.FormTf == None ): self.OpenTfFromFile( self.TfPathGreyscaleScalar ) self.Renderer.Properties.RepaintRenderer = True self.ShowRenderer( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedAnimate1(self, sender, args): """Animates the volume renderer transfer function between the two functions.""" try: pathStart = String( "C:/DanMueller/Data/Thesis/TPCH-A-TF-CD-Animate-01.xml" ) pathEnd = String( "C:/DanMueller/Data/Thesis/TPCH-A-TF-CD-Animate-02.xml" ) animator = siTransferFunctionAnimator( self.Renderer.TransferFunction ) animator.NumberOfSteps = 20 animator.SetStartAndEndFunctions( pathStart, pathEnd ) animator.Start( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def OnClickedAnimate2(self, sender, args): """Animates the volume renderer transfer function between the two functions.""" try: pathStart = String( "C:/DanMueller/Data/Thesis/TPCH-A-TF-CD-Animate-02.xml" ) pathEnd = String( "C:/DanMueller/Data/Thesis/TPCH-A-TF-CD-Animate-03.xml" ) animator = siTransferFunctionAnimator( self.Renderer.TransferFunction ) animator.NumberOfSteps = 20 animator.SetStartAndEndFunctions( pathStart, pathEnd ) animator.Start( ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( )