def initialize(self):
     self.layoutManager=slicer.app.layoutManager()
     self.threeDWidget=self.layoutManager.threeDWidget(0)
     self.threeDView=self.threeDWidget.threeDView()
     self.renderWindow=self.threeDView.renderWindow()
     self.renderers=self.renderWindow.GetRenderers()
     self.renderer=self.renderers.GetFirstRenderer()
     
     self.polydata = vtk.vtkPolyData()
     self.points = vtk.vtkPoints()
     self.planeSource = vtk.vtkPlaneSource()
     self.mapper = vtk.vtkPolyDataMapper()
     self.actor = vtk.vtkActor()
     self.renderer.AddViewProp(self.actor)
     self.renderWindow.AddRenderer(self.renderer)
예제 #2
0
    def initialize(self):
        self.layoutManager = slicer.app.layoutManager()
        self.threeDWidget = self.layoutManager.threeDWidget(0)
        self.threeDView = self.threeDWidget.threeDView()
        self.renderWindow = self.threeDView.renderWindow()
        self.renderers = self.renderWindow.GetRenderers()
        self.renderer = self.renderers.GetFirstRenderer()

        self.polydata = vtk.vtkPolyData()
        self.points = vtk.vtkPoints()
        self.planeSource = vtk.vtkPlaneSource()
        self.mapper = vtk.vtkPolyDataMapper()
        self.actor = vtk.vtkActor()
        self.renderer.AddViewProp(self.actor)
        self.renderWindow.AddRenderer(self.renderer)
예제 #3
0
  def test_ShadedModels1(self):
    """ Ideally you should have several levels of tests.  At the lowest level
    tests should exercise the functionality of the logic with different inputs
    (both valid and invalid).  At higher levels your tests should emulate the
    way the user would interact with your code and confirm that it still works
    the way you intended.
    One of the most important features of the tests is that it should alert other
    developers when their changes will have an impact on the behavior of your
    module.  For example, if a developer removes a feature that you depend on,
    your test should break so they know that the feature is needed.
    """

    self.delayDisplay("Starting the test")

    import SampleData
    sampleDataLogic = SampleData.SampleDataLogic()
    print("Getting MR Head Volume")
    mrHeadVolume = sampleDataLogic.downloadMRHead()

    resize = vtk.vtkImageResize()
    resize.SetInputDataObject(mrHeadVolume.GetImageData())
    resize.SetOutputDimensions(256,256,128)
    resize.Update()


    tdw = slicer.qMRMLThreeDWidget()
    tdw.setMRMLScene(slicer.mrmlScene)
    tdw.setMRMLViewNode(slicer.util.getNode("*ViewNode*"))
    tdw.show()

    from vtkSlicerShadedActorModuleLogicPython import *

    shadedActor=vtkOpenGLShadedActor()
    tdv = tdw.threeDView()
    rw = tdv.renderWindow()
    rens = rw.GetRenderers()
    ren = rens.GetItemAsObject(0)
    ren.AddActor(shadedActor)
    mapper = vtk.vtkPolyDataMapper()
    shadedActor.SetMapper(mapper)
    shadedActor.SetVertexShaderSource("""
      #version 120
      attribute vec3 vertexAttribute;
      attribute vec2 textureCoordinateAttribute;
      varying vec4 interpolatedColor;
      varying vec3 interpolatedTextureCoordinate;
      void main()
      {
        interpolatedColor = vec4(0.5) + vec4(vertexAttribute, 1.);
        interpolatedTextureCoordinate = vec3(textureCoordinateAttribute, .5);
        gl_Position = vec4(vertexAttribute, 1.);
      }
    """)

    shadedActor.SetFragmentShaderSource("""
      #version 120
      varying vec4 interpolatedColor;
      varying vec3 interpolatedTextureCoordinate;
      uniform sampler3D volumeSampler;
      void main()
      {
        gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );
        gl_FragColor = interpolatedColor;
        vec4 volumeSample = texture3D(volumeSampler, interpolatedTextureCoordinate);
        volumeSample *= 100;
        gl_FragColor = mix( volumeSample, interpolatedColor, 0.5);
        
        vec4 integratedRay = vec4(0.);
        for (int i = 0; i < 256; i++) {
          vec3 samplePoint = vec3(interpolatedTextureCoordinate.st, i/256.);
          vec4 volumeSample = texture3D(volumeSampler, samplePoint);
          integratedRay += volumeSample;
        }
        gl_FragColor = integratedRay;
      }
    """)
    shadedActor.SetTextureImageData(resize.GetOutputDataObject(0))
    #shadedActor.SetTextureImageData(mrHeadVolume.GetImageData())
    sphereSource = vtk.vtkSphereSource()
    mapper.SetInputConnection(sphereSource.GetOutputPort())
    actor = vtk.vtkActor()
    actor.SetScale(20,20,20)
    actor.SetMapper(mapper)
    ren.AddActor(actor)
    rw.Render()

    wti = vtk.vtkWindowToImageFilter()
    wti.SetInput(rw)
    iv = vtk.vtkImageViewer()
    iv.SetColorLevel(128)
    iv.SetColorWindow(256)
    iv.SetInputConnection(wti.GetOutputPort())
    iv.Render()

    extensionManager = vtk.vtkOpenGLExtensionManager()
    extensionManager.SetRenderWindow(rw)
    extensionManager.Update()
    print(extensionManager) 
    print(extensionManager.GetDriverGLVendor()) 
    print(extensionManager.GetDriverGLVersion()) 
    print(extensionManager.GetDriverGLRenderer()) 

    slicer.modules.ShadedModelsWidget.tdw = tdw
    slicer.modules.ShadedModelsWidget.iv = iv
 def planeLandmarks(self, Landmark1Value, Landmark2Value, Landmark3Value, slider, sliderOpacity):
     self.initialize()
     # Limit the number of 3 landmarks to define a plane
     # Keep the coordinates of the landmarks
     listCoord = list()
     fidNode = slicer.mrmlScene.GetNodeByID('vtkMRMLMarkupsFiducialNode1')
     self.coord = numpy.zeros(3)
     if Landmark1Value != "List of fiducials":
         fidNode.GetNthFiducialPosition(int(Landmark1Value)-1, self.coord)
         listCoord.append(self.coord)
     
     print self.coord
     print listCoord
     
     r1 = self.coord[0]
     a1 = self.coord[1]
     s1 = self.coord[2]
     
     # Limit the number of 3 landmarks to define a plane
     # Keep the coordinates of the landmarks
     listCoord = list()
     fidNode = slicer.mrmlScene.GetNodeByID('vtkMRMLMarkupsFiducialNode1')
     self.coord = numpy.zeros(3)
     if Landmark2Value != "List of fiducials":
         fidNode.GetNthFiducialPosition(int(Landmark2Value)-1, self.coord)
         listCoord.append(self.coord)
     
     print self.coord
     print listCoord
     
     r2 = self.coord[0]
     a2 = self.coord[1]
     s2 = self.coord[2]
     
     # Limit the number of 3 landmarks to define a plane
     # Keep the coordinates of the landmarks
     listCoord = list()
     fidNode = slicer.mrmlScene.GetNodeByID('vtkMRMLMarkupsFiducialNode1')
     self.coord = numpy.zeros(3)
     if Landmark3Value != "List of fiducials":
         fidNode.GetNthFiducialPosition(int(Landmark3Value)-1, self.coord)
         listCoord.append(self.coord)
     
     print self.coord
     print listCoord
     
     r3 = self.coord[0]
     a3 = self.coord[1]
     s3 = self.coord[2]
     
     
     A = (r1,a1,s1)
     B = (r2,a2,s2)
     C = (r3,a3,s3)
     # Vn = Vectorial Product (AB, BC)
     # Normal N = Vn/norm(Vn)
     
     points = vtk.vtkPoints()
     points.InsertNextPoint(r1,a1,s1)
     points.InsertNextPoint(r2,a2,s2)
     points.InsertNextPoint(r3,a3,s3)
     
     polydata = vtk.vtkPolyData()
     polydata.SetPoints(points)
     
     centerOfMass = vtk.vtkCenterOfMass()
     centerOfMass.SetInputData(polydata)
     centerOfMass.SetUseScalarsAsWeights(False)
     centerOfMass.Update()
     
     G = centerOfMass.GetCenter()
     
     print "Center of mass = ",G
     
     # Vector GA
     GA = numpy.matrix([[0],[0],[0]])
     GA[0] = A[0]-G[0]
     GA[1] = A[1]-G[1]
     GA[2] = A[2]-G[2]
     
     print "GA = ", GA
     
     # Vector BG
     GB = numpy.matrix([[0],[0],[0]])
     GB[0] = B[0]-G[0]
     GB[1] = B[1]-G[1]
     GB[2] = B[2]-G[2]
     
     print "GB = ", GB
     
     # Vector CG
     GC = numpy.matrix([[0],[0],[0]])
     GC[0] = C[0]-G[0]
     GC[1] = C[1]-G[1]
     GC[2] = C[2]-G[2]
     
     print "GC = ", GC
     
     self.N = self.normalLandmarks(GA,GB)
     
     D = numpy.matrix([[0],[0],[0]])
     E = numpy.matrix([[0],[0],[0]])
     F = numpy.matrix([[0],[0],[0]])
     
     
     D[0] = slider*GA[0] + G[0]
     D[1] = slider*GA[1] + G[1]
     D[2] = slider*GA[2] + G[2]
     
     print "Slider value : ", slider
     
     print "D = ",D
     
     E[0] = slider*GB[0] + G[0]
     E[1] = slider*GB[1] + G[1]
     E[2] = slider*GB[2] + G[2]
     
     print "E = ",E
     
     F[0] = slider*GC[0] + G[0]
     F[1] = slider*GC[1] + G[1]
     F[2] = slider*GC[2] + G[2]
     
     print "F = ",F
     
     self.renderWindow.AddRenderer(self.renderer)
     
     planeSource = vtk.vtkPlaneSource()
     planeSource.SetNormal(self.N[0],self.N[1],self.N[2])
     
     planeSource.SetOrigin(D[0],D[1],D[2])
     planeSource.SetPoint1(E[0],E[1],E[2])
     planeSource.SetPoint2(F[0],F[1],F[2])
     
     planeSource.Update()
     
     plane = planeSource.GetOutput()
     
     mapper = vtk.vtkPolyDataMapper()
     mapper.SetInputData(plane)
     
     self.actor.SetMapper(mapper)
     self.actor.GetProperty().SetColor(0, 0.4, 0.8)
     self.actor.GetProperty().SetOpacity(sliderOpacity)
     
     self.renderer.AddActor(self.actor)
     
     self.renderWindow.Render()
예제 #5
0
	def p2pCyl(startPoint, endPoint, radius=10, modName="Cyl", plus=0, Seg=3,
			   color="red", Opacity=1, RotY=0, Tx=0):
		"""12 prisms of point-to-point"""
		cylinderSource = vtk.vtkCylinderSource()
		cylinderSource.SetRadius(radius)
		cylinderSource.SetResolution(Seg)

		rng = vtk.vtkMinimalStandardRandomSequence()
		rng.SetSeed(8775070)  # For testing 8775070

		# Compute a basis
		normalizedX = [0] * 3
		normalizedY = [0] * 3
		normalizedZ = [0] * 3

		# The X axis is a vector from start to end
		vtk.vtkMath.Subtract(endPoint, startPoint, normalizedX)
		length = vtk.vtkMath.Norm(normalizedX) + plus
		#     length = 20
		vtk.vtkMath.Normalize(normalizedX)

		# The Xn axis is an arbitrary vector cross X
		arbitrary = [0] * 3
		for i in range(0, 3):
			rng.Next()
			arbitrary[i] = rng.GetRangeValue(-10, 10)
		vtk.vtkMath.Cross(normalizedX, arbitrary, normalizedZ)
		vtk.vtkMath.Normalize(normalizedZ)

		# The Zn axis is Xn cross X
		vtk.vtkMath.Cross(normalizedZ, normalizedX, normalizedY)
		matrix = vtk.vtkMatrix4x4()
		# Create the direction cosine matrix
		matrix.Identity()
		for i in range(0, 3):
			matrix.SetElement(i, 0, normalizedX[i])
			matrix.SetElement(i, 1, normalizedY[i])
			matrix.SetElement(i, 2, normalizedZ[i])
		# Apply the transforms
		transform = vtk.vtkTransform()
		transform.Translate(startPoint)  # translate to starting point
		transform.Concatenate(matrix)  # apply direction cosines
		transform.RotateZ(-90.0)  # align cylinder to x axis
		transform.Scale(1.0, length, 1.0)  # scale along the height vector
		transform.Translate(0, .5, 0)  # translate to start of cylinder
		transform.RotateY(RotY)
		transform.Translate(Tx, 0, 0)

		# Transform the polydata
		transformPD = vtk.vtkTransformPolyDataFilter()
		transformPD.SetTransform(transform)
		transformPD.SetInputConnection(cylinderSource.GetOutputPort())

		stlMapper = vtk.vtkPolyDataMapper()
		stlMapper.SetInputConnection(transformPD.GetOutputPort())
		vtkNode = slicer.modules.models.logic().AddModel(transformPD.GetOutputPort())
		vtkNode.SetName(modName)
		modelDisplay = vtkNode.GetDisplayNode()
		modelDisplay.SetColor(Helper.myColor(color))
		modelDisplay.SetOpacity(Opacity)
		modelDisplay.SetBackfaceCulling(0)
		# modelDisplay.SetVisibility(1)
		modelDisplay.SetVisibility2D(True)
		# modelDisplay.SetSliceDisplayModeToProjection()
		# dn.SetVisibility2D(True)
		return
  def makeScene(self, sliceLogic):
    sliceNode = sliceLogic.GetBackgroundLayer().GetSliceNode()
    sliceViewName = sliceNode.GetLayoutName()

    if self.sliceViews[sliceViewName]:
      ren = self.renderers[sliceViewName]
      rw = self.sliceViews[sliceViewName].renderWindow()
      ren.SetViewport(self.viewPortStartWidth,0,1,self.viewPortFinishHeight)
      ren.SetLayer(1)

      if self.showHumanModelCheckBox.checked:
        if self.humanActor == None:
          #
          # Making vtk mappers and actors
          #
          # Mappers
          humanMapper = vtk.vtkPolyDataMapper()
          if vtk.VTK_MAJOR_VERSION <= 5:
            humanMapper.SetInput(self.humanNode.GetPolyData())
          else:
            humanMapper.SetInputData(self.humanNode.GetPolyData())

          shortsMapper = vtk.vtkPolyDataMapper()
          if vtk.VTK_MAJOR_VERSION <= 5:
            shortsMapper.SetInput(self.shortsNode.GetPolyData())
          else:
            shortsMapper.SetInputData(self.shortsNode.GetPolyData())

          leftShoeMapper = vtk.vtkPolyDataMapper()
          if vtk.VTK_MAJOR_VERSION <= 5:
            leftShoeMapper.SetInput(self.leftShoeNode.GetPolyData())
          else:
            leftShoeMapper.SetInputData(self.leftShoeNode.GetPolyData())

          rightShoeMapper = vtk.vtkPolyDataMapper()
          if vtk.VTK_MAJOR_VERSION <= 5:
            rightShoeMapper.SetInput(self.rightShoeNode.GetPolyData())
          else:
            rightShoeMapper.SetInputData(self.rightShoeNode.GetPolyData())

          # Actors
          humanModelScale = 0.01
          self.humanActor = vtk.vtkActor()
          self.humanActor.SetMapper(humanMapper)
          #self.humanActor.GetProperty().SetColor(0.93,0.81,0.80)
          self.humanActor.GetProperty().SetColor(255/256,204/256,34/256)
          self.humanActor.SetScale(humanModelScale,humanModelScale,humanModelScale)

          self.shortsActor = vtk.vtkActor()
          self.shortsActor.SetMapper(shortsMapper)
          #self.shortsActor.GetProperty().SetColor(0,0,1)
          self.shortsActor.GetProperty().SetColor(0,0,1)
          self.shortsActor.SetScale(humanModelScale,humanModelScale,humanModelScale)

          self.leftShoeActor = vtk.vtkActor()
          self.leftShoeActor.SetMapper(leftShoeMapper)
          self.leftShoeActor.GetProperty().SetColor(1,0,0)
          self.leftShoeActor.SetScale(humanModelScale,humanModelScale,humanModelScale)

          self.rightShoeActor = vtk.vtkActor()
          self.rightShoeActor.SetMapper(rightShoeMapper)
          self.rightShoeActor.GetProperty().SetColor(0,1,0)
          self.rightShoeActor.SetScale(humanModelScale,humanModelScale,humanModelScale)

        if self.cube == None:
          self.cube = vtk.vtkAnnotatedCubeActor()
          self.cube.SetXPlusFaceText('R')
          self.cube.SetXMinusFaceText('L')
          self.cube.SetYMinusFaceText('A')
          self.cube.SetYPlusFaceText('P')
          self.cube.SetZMinusFaceText('I')
          self.cube.SetZPlusFaceText('S')
          self.cube.SetZFaceTextRotation(90)
          self.cube.GetTextEdgesProperty().SetColor(0.95,0.95,0.95)
          self.cube.GetTextEdgesProperty().SetLineWidth(1)
          self.cube.GetCubeProperty().SetColor(0.15,0.15,0.15)

        if self.axes == None:
          self.axes = vtk.vtkAxesActor()
          self.axes.SetXAxisLabelText('R')
          self.axes.SetYAxisLabelText('A')
          self.axes.SetZAxisLabelText('S')
          transform = vtk.vtkTransform()
          transform.Translate(0,0,0)
          self.axes.SetUserTransform(transform)

        # Add actors to renderer
        if self.cubeRadioButton.checked:
          ren.AddActor(self.cube)
          ren.RemoveActor(self.humanActor)
          ren.RemoveActor(self.shortsActor)
          ren.RemoveActor(self.leftShoeActor)
          ren.RemoveActor(self.rightShoeActor)
          ren.RemoveActor(self.axes)

        if self.axesRadioButton.checked:
          ren.AddActor(self.axes)
          ren.RemoveActor(self.humanActor)
          ren.RemoveActor(self.shortsActor)
          ren.RemoveActor(self.leftShoeActor)
          ren.RemoveActor(self.rightShoeActor)
          ren.RemoveActor(self.cube)

        if self.humanRadioButton.checked:
          ren.AddActor(self.humanActor)
          ren.AddActor(self.shortsActor)
          ren.AddActor(self.leftShoeActor)
          ren.AddActor(self.rightShoeActor)
          ren.RemoveActor(self.cube)
          ren.RemoveActor(self.axes)

        # Calculate the camera position and viewup based on XYToRAS matrix
        camera = vtk.vtkCamera()

        m = sliceNode.GetSliceToRAS()
 
        v = np.array([[m.GetElement(0,0),m.GetElement(0,1),m.GetElement(0,2)],
            [m.GetElement(1,0),m.GetElement(1,1),m.GetElement(1,2)],
            [m.GetElement(2,0),m.GetElement(2,1),m.GetElement(2,2)]])
        det = np.linalg.det(v)
        if det > 0: # right hand
          y = np.array([0,0,-self.cameraPositionMultiplier])
        elif det < 0: # left hand
          y = np.array([0,0,self.cameraPositionMultiplier])
 
        x = np.matrix([[m.GetElement(0,0),m.GetElement(0,1),m.GetElement(0,2)],
            [m.GetElement(1,0),m.GetElement(1,1),m.GetElement(1,2)],
            [m.GetElement(2,0),m.GetElement(2,1),m.GetElement(2,2)]])
 
        # Calculating position
        position = np.inner(x,y)
        camera.SetPosition(-position[0,0],-position[0,1],-position[0,2])

        '''
        m = sliceNode.GetSliceToRAS()
        x = np.matrix([[m.GetElement(0,0),m.GetElement(0,1),m.GetElement(0,2)],
            [m.GetElement(1,0),m.GetElement(1,1),m.GetElement(1,2)],
            [m.GetElement(2,0),m.GetElement(2,1),m.GetElement(2,2)]])

        # Calculating position
        y = np.array([0,0,self.cameraPositionMultiplier])
        position = np.inner(x,y)
        camera.SetPosition(-position[0,0],-position[0,1],-position[0,2])

        '''
        # Calculating viewUp
        n = np.array([0,1,0])
        viewUp = np.inner(x,n)
        camera.SetViewUp(viewUp[0,0],viewUp[0,1],viewUp[0,2])

        #ren.PreserveDepthBufferOff()
        ren.SetActiveCamera(camera)
        rw.AddRenderer(ren)

      else:
        ren.RemoveActor(self.humanActor)
        ren.RemoveActor(self.shortsActor)
        ren.RemoveActor(self.leftShoeActor)
        ren.RemoveActor(self.rightShoeActor)
        ren.RemoveActor(self.axes)
        ren.RemoveActor(self.cube)
        rw.RemoveRenderer(ren)

      # Refresh view
      self.sliceViews[sliceViewName].scheduleRender()
예제 #7
0
  def iceCream(self):

    # based on iceCream.py from VTK/Examples/Modelling

    # This example demonstrates how to use boolean combinations of implicit
    # functions to create a model of an ice cream cone.

    import vtk
    from vtk.util.colors import chocolate, mint

    # Create implicit function primitives. These have been carefully
    # placed to give the effect that we want. We are going to use various
    # combinations of these functions to create the shape we want; for
    # example, we use planes intersected with a cone (which is infinite in
    # extent) to get a finite cone.
    cone = vtk.vtkCone()
    cone.SetAngle(20)
    vertPlane = vtk.vtkPlane()
    vertPlane.SetOrigin(.1, 0, 0)
    vertPlane.SetNormal(-1, 0, 0)
    basePlane = vtk.vtkPlane()
    basePlane.SetOrigin(1.2, 0, 0)
    basePlane.SetNormal(1, 0, 0)
    iceCream = vtk.vtkSphere()
    iceCream.SetCenter(1.333, 0, 0)
    iceCream.SetRadius(0.5)
    bite = vtk.vtkSphere()
    bite.SetCenter(1.5, 0, 0.5)
    bite.SetRadius(0.25)

    # Combine primitives to build ice-cream cone. Clip the cone with planes.
    theCone = vtk.vtkImplicitBoolean()
    theCone.SetOperationTypeToIntersection()
    theCone.AddFunction(cone)
    theCone.AddFunction(vertPlane)
    theCone.AddFunction(basePlane)

    # Take a bite out of the ice cream.
    theCream = vtk.vtkImplicitBoolean()
    theCream.SetOperationTypeToDifference()
    theCream.AddFunction(iceCream)
    theCream.AddFunction(bite)

    # The sample function generates a distance function from the implicit
    # function (which in this case is the cone). This is then contoured to
    # get a polygonal surface.
    theConeSample = vtk.vtkSampleFunction()
    theConeSample.SetImplicitFunction(theCone)
    theConeSample.SetModelBounds(-1, 1.5, -1.25, 1.25, -1.25, 1.25)
    theConeSample.SetSampleDimensions(60, 60, 60)
    theConeSample.ComputeNormalsOff()
    theConeSurface = vtk.vtkContourFilter()
    theConeSurface.SetInputConnection(theConeSample.GetOutputPort())
    theConeSurface.SetValue(0, 0.0)
    coneMapper = vtk.vtkPolyDataMapper()
    coneMapper.SetInputConnection(theConeSurface.GetOutputPort())
    coneMapper.ScalarVisibilityOff()
    coneActor = vtk.vtkActor()
    coneActor.SetMapper(coneMapper)
    coneActor.GetProperty().SetColor(chocolate)

    # The same here for the ice cream.
    theCreamSample = vtk.vtkSampleFunction()
    theCreamSample.SetImplicitFunction(theCream)
    theCreamSample.SetModelBounds(0, 2.5, -1.25, 1.25, -1.25, 1.25)
    theCreamSample.SetSampleDimensions(60, 60, 60)
    theCreamSample.ComputeNormalsOff()
    theCreamSurface = vtk.vtkContourFilter()
    theCreamSurface.SetInputConnection(theCreamSample.GetOutputPort())
    theCreamSurface.SetValue(0, 0.0)
    creamMapper = vtk.vtkPolyDataMapper()
    creamMapper.SetInputConnection(theCreamSurface.GetOutputPort())
    creamMapper.ScalarVisibilityOff()
    creamActor = vtk.vtkActor()
    creamActor.SetMapper(creamMapper)
    creamActor.GetProperty().SetColor(mint)

    # Create the usual rendering stuff
    ren = vtk.vtkRenderer()
    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    # Add the actors to the renderer, set the background and size
    ren.AddActor(coneActor)
    ren.AddActor(creamActor)
    ren.SetBackground(1, 1, 1)
    renWin.SetSize(500, 500)
    ren.ResetCamera()
    ren.GetActiveCamera().Roll(90)
    ren.GetActiveCamera().Dolly(1.5)
    ren.ResetCameraClippingRange()

    iren.Initialize()
    renWin.Render()
    iren.Start()
    return iren
예제 #8
0
    def test_ShadedModels1(self):
        """ Ideally you should have several levels of tests.  At the lowest level
    tests should exercise the functionality of the logic with different inputs
    (both valid and invalid).  At higher levels your tests should emulate the
    way the user would interact with your code and confirm that it still works
    the way you intended.
    One of the most important features of the tests is that it should alert other
    developers when their changes will have an impact on the behavior of your
    module.  For example, if a developer removes a feature that you depend on,
    your test should break so they know that the feature is needed.
    """

        self.delayDisplay("Starting the test")

        import SampleData
        sampleDataLogic = SampleData.SampleDataLogic()
        print("Getting MR Head Volume")
        mrHeadVolume = sampleDataLogic.downloadMRHead()

        resize = vtk.vtkImageResize()
        resize.SetInputDataObject(mrHeadVolume.GetImageData())
        resize.SetOutputDimensions(256, 256, 128)
        resize.Update()

        tdw = slicer.qMRMLThreeDWidget()
        tdw.setMRMLScene(slicer.mrmlScene)
        tdw.setMRMLViewNode(slicer.util.getNode("*ViewNode*"))
        tdw.show()

        from vtkSlicerShadedActorModuleLogicPython import *

        shadedActor = vtkOpenGLShadedActor()
        tdv = tdw.threeDView()
        rw = tdv.renderWindow()
        rens = rw.GetRenderers()
        ren = rens.GetItemAsObject(0)
        ren.AddActor(shadedActor)
        mapper = vtk.vtkPolyDataMapper()
        shadedActor.SetMapper(mapper)
        shadedActor.SetVertexShaderSource("""
      #version 120
      attribute vec3 vertexAttribute;
      attribute vec2 textureCoordinateAttribute;
      varying vec4 interpolatedColor;
      varying vec3 interpolatedTextureCoordinate;
      void main()
      {
        interpolatedColor = vec4(0.5) + vec4(vertexAttribute, 1.);
        interpolatedTextureCoordinate = vec3(textureCoordinateAttribute, .5);
        gl_Position = vec4(vertexAttribute, 1.);
      }
    """)

        shadedActor.SetFragmentShaderSource("""
      #version 120
      varying vec4 interpolatedColor;
      varying vec3 interpolatedTextureCoordinate;
      uniform sampler3D volumeSampler;
      void main()
      {
        gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );
        gl_FragColor = interpolatedColor;
        vec4 volumeSample = texture3D(volumeSampler, interpolatedTextureCoordinate);
        volumeSample *= 100;
        gl_FragColor = mix( volumeSample, interpolatedColor, 0.5);
        
        vec4 integratedRay = vec4(0.);
        for (int i = 0; i < 256; i++) {
          vec3 samplePoint = vec3(interpolatedTextureCoordinate.st, i/256.);
          vec4 volumeSample = texture3D(volumeSampler, samplePoint);
          integratedRay += volumeSample;
        }
        gl_FragColor = integratedRay;
      }
    """)
        shadedActor.SetTextureImageData(resize.GetOutputDataObject(0))
        #shadedActor.SetTextureImageData(mrHeadVolume.GetImageData())
        sphereSource = vtk.vtkSphereSource()
        mapper.SetInputConnection(sphereSource.GetOutputPort())
        actor = vtk.vtkActor()
        actor.SetScale(20, 20, 20)
        actor.SetMapper(mapper)
        ren.AddActor(actor)
        rw.Render()

        wti = vtk.vtkWindowToImageFilter()
        wti.SetInput(rw)
        iv = vtk.vtkImageViewer()
        iv.SetColorLevel(128)
        iv.SetColorWindow(256)
        iv.SetInputConnection(wti.GetOutputPort())
        iv.Render()

        extensionManager = vtk.vtkOpenGLExtensionManager()
        extensionManager.SetRenderWindow(rw)
        extensionManager.Update()
        print(extensionManager)
        print(extensionManager.GetDriverGLVendor())
        print(extensionManager.GetDriverGLVersion())
        print(extensionManager.GetDriverGLRenderer())

        slicer.modules.ShadedModelsWidget.tdw = tdw
        slicer.modules.ShadedModelsWidget.iv = iv
예제 #9
0
    def vtk_to_obj_converter(self, node, radius=0.1, number_of_sides=3):

        qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

        polydata = node.GetPolyData()
        tuber = vtk.vtkTubeFilter()
        tuber.SetNumberOfSides(int(number_of_sides))
        tuber.SetRadius(radius)
        tuber.SetInputData(polydata)
        tuber.Update()

        tubes = tuber.GetOutputDataObject(0)
        # scalars = tubes.GetPointData().GetArray(0)
        # scalars.SetName("scalars")

        triangles = vtk.vtkTriangleFilter()
        triangles.SetInputData(tubes)
        triangles.Update()

        tripolydata = vtk.vtkPolyData()
        tripolydata.ShallowCopy(triangles.GetOutput())

        # Decrease the number of triangle of 30% to reduce Blender loading costs
        decimate = vtk.vtkDecimatePro()
        decimate.SetInputData(tripolydata)
        decimate.SetTargetReduction(.30)
        decimate.Update()

        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(decimate.GetOutputPort())

        r = random.randrange(0, 256, 1)
        g = random.randrange(0, 256, 1)
        b = random.randrange(0, 256, 1)

        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        # actor.GetProperty().SetColor(0, 0, 0)  # Ka: ambient color of the material (r, g, b)
        actor.GetProperty().SetDiffuseColor(
            r, g, b)  # Kd: diffuse color of the material (r, g, b)
        # actor.GetProperty().SetSpecularColor(0, 0, 0)  # Ks: specular color of the material (r, g, b)

        renderer = vtk.vtkRenderer()
        renderer.AddActor(actor)

        window = vtk.vtkRenderWindow()
        window.AddRenderer(renderer)

        # Get output path
        storageNode = node.GetStorageNode()
        filepath = storageNode.GetFullNameFromFileName()
        filename = filepath.rsplit('.', 1)

        writer = vtk.vtkOBJExporter()
        writer.SetFilePrefix(filename[0])
        writer.SetInput(window)
        writer.Write()

        qt.QApplication.restoreOverrideCursor()

        if writer.Write() == 0:
            qt.QMessageBox.critical(None, "Conversion", "Conversion failed")
        else:
            qt.QMessageBox.information(None, "Conversion", "Conversion done")