def MarchingCubes(self,image,matrix,threshold):

        self._parentClass.GetHelper().debug("Starting MarchingCubes..")

        transformIJKtoRAS = slicer.vtkTransform()
        transformIJKtoRAS.SetMatrix(matrix)

        marchingCubes = slicer.vtkMarchingCubes()
        marchingCubes.SetInput(image)
        marchingCubes.SetValue(0,threshold)
        marchingCubes.ComputeScalarsOn()
        marchingCubes.ComputeGradientsOn()
        marchingCubes.ComputeNormalsOn()
        marchingCubes.GetOutput().ReleaseDataFlagOn()
        marchingCubes.Update()

        if transformIJKtoRAS.GetMatrix().Determinant() < 0:
            self.debug("Determinant smaller than 0")
            reverser = slicer.vtkReverseSense()
            reverser.SetInput(marchingCubes.GetOutput())
            reverser.ReverseNormalsOn()
            reverser.GetOutput().ReleaseDataFlagOn()
            reverser.Update()
            correctedOutput = reverser.GetOutput()
        else:
            correctedOutput = marchingCubes.GetOutput()

        transformer = slicer.vtkTransformPolyDataFilter()
        transformer.SetInput(correctedOutput)
        transformer.SetTransform(transformIJKtoRAS)
        transformer.GetOutput().ReleaseDataFlagOn()
        transformer.Update()

        normals = slicer.vtkPolyDataNormals()
        normals.ComputePointNormalsOn()
        normals.SetInput(transformer.GetOutput())
        normals.SetFeatureAngle(60)
        normals.SetSplitting(1)
        normals.GetOutput().ReleaseDataFlagOn()
        normals.Update()
        
        stripper = slicer.vtkStripper()
        stripper.SetInput(normals.GetOutput())
        stripper.GetOutput().ReleaseDataFlagOff()
        stripper.Update()
        stripper.GetOutput().Update()

        result = slicer.vtkPolyData()
        result.DeepCopy(stripper.GetOutput())
        result.Update()

        self._parentClass.GetHelper().debug("End MarchingCubes..")

        return result
    def MarchingCubes(self, image, matrix, threshold):

        self._parentClass.GetHelper().debug("Starting MarchingCubes..")

        transformIJKtoRAS = slicer.vtkTransform()
        transformIJKtoRAS.SetMatrix(matrix)

        marchingCubes = slicer.vtkMarchingCubes()
        marchingCubes.SetInput(image)
        marchingCubes.SetValue(0, threshold)
        marchingCubes.ComputeScalarsOn()
        marchingCubes.ComputeGradientsOn()
        marchingCubes.ComputeNormalsOn()
        marchingCubes.GetOutput().ReleaseDataFlagOn()
        marchingCubes.Update()

        if transformIJKtoRAS.GetMatrix().Determinant() < 0:
            self.debug("Determinant smaller than 0")
            reverser = slicer.vtkReverseSense()
            reverser.SetInput(marchingCubes.GetOutput())
            reverser.ReverseNormalsOn()
            reverser.GetOutput().ReleaseDataFlagOn()
            reverser.Update()
            correctedOutput = reverser.GetOutput()
        else:
            correctedOutput = marchingCubes.GetOutput()

        transformer = slicer.vtkTransformPolyDataFilter()
        transformer.SetInput(correctedOutput)
        transformer.SetTransform(transformIJKtoRAS)
        transformer.GetOutput().ReleaseDataFlagOn()
        transformer.Update()

        normals = slicer.vtkPolyDataNormals()
        normals.ComputePointNormalsOn()
        normals.SetInput(transformer.GetOutput())
        normals.SetFeatureAngle(60)
        normals.SetSplitting(1)
        normals.GetOutput().ReleaseDataFlagOn()
        normals.Update()

        stripper = slicer.vtkStripper()
        stripper.SetInput(normals.GetOutput())
        stripper.GetOutput().ReleaseDataFlagOff()
        stripper.Update()
        stripper.GetOutput().Update()

        result = slicer.vtkPolyData()
        result.DeepCopy(stripper.GetOutput())
        result.Update()

        self._parentClass.GetHelper().debug("End MarchingCubes..")

        return result
    def prepareModel(self,polydata):

        if polydata == None:
            return -1
        
        # skip nonmanifold

        surfaceCleaner = slicer.vtkCleanPolyData()
        surfaceCleaner.SetInput(polydata)
        surfaceCleaner.Update()

        surfaceTriangulator = slicer.vtkTriangleFilter()
        surfaceTriangulator.SetInput(surfaceCleaner.GetOutput())
        surfaceTriangulator.PassLinesOff()
        surfaceTriangulator.PassVertsOff()
        surfaceTriangulator.Update()

        # new steps for preparation to avoid problems because of slim models (f.e. at stenosis)
        subdiv = slicer.vtkLinearSubdivisionFilter()
        subdiv.SetInput(surfaceTriangulator.GetOutput())
        subdiv.SetNumberOfSubdivisions(1)
        subdiv.Update()

        smooth = slicer.vtkWindowedSincPolyDataFilter()
        smooth.SetInput(subdiv.GetOutput())
        smooth.SetNumberOfIterations(20)
        smooth.SetPassBand(0.1)
        smooth.SetBoundarySmoothing(1)
        smooth.NormalizeCoordinatesOn()
        smooth.Update()

        normals = slicer.vtkPolyDataNormals()
        normals.SetInput(smooth.GetOutput())
        normals.SetAutoOrientNormals(1)
        normals.SetFlipNormals(0)
        normals.SetConsistency(1)
        normals.SplittingOff()
        normals.Update()

        surfaceCapper = slicer.vtkvmtkCapPolyData()
        surfaceCapper.SetInput(normals.GetOutput())
        surfaceCapper.SetDisplacement(self._capDisplacement)
        surfaceCapper.SetInPlaneDisplacement(self._capDisplacement)
        surfaceCapper.Update()

        polyDataNew = slicer.vtkPolyData()
        polyDataNew.DeepCopy(surfaceCapper.GetOutput())
        polyDataNew.Update()

        return polyDataNew
Example #4
0
    def prepareModel(self, polydata):

        if polydata == None:
            return -1

        # skip nonmanifold

        surfaceCleaner = slicer.vtkCleanPolyData()
        surfaceCleaner.SetInput(polydata)
        surfaceCleaner.Update()

        surfaceTriangulator = slicer.vtkTriangleFilter()
        surfaceTriangulator.SetInput(surfaceCleaner.GetOutput())
        surfaceTriangulator.PassLinesOff()
        surfaceTriangulator.PassVertsOff()
        surfaceTriangulator.Update()

        # new steps for preparation to avoid problems because of slim models (f.e. at stenosis)
        subdiv = slicer.vtkLinearSubdivisionFilter()
        subdiv.SetInput(surfaceTriangulator.GetOutput())
        subdiv.SetNumberOfSubdivisions(1)
        subdiv.Update()

        smooth = slicer.vtkWindowedSincPolyDataFilter()
        smooth.SetInput(subdiv.GetOutput())
        smooth.SetNumberOfIterations(20)
        smooth.SetPassBand(0.1)
        smooth.SetBoundarySmoothing(1)
        smooth.NormalizeCoordinatesOn()
        smooth.Update()

        normals = slicer.vtkPolyDataNormals()
        normals.SetInput(smooth.GetOutput())
        normals.SetAutoOrientNormals(1)
        normals.SetFlipNormals(0)
        normals.SetConsistency(1)
        normals.SplittingOff()
        normals.Update()

        surfaceCapper = slicer.vtkvmtkCapPolyData()
        surfaceCapper.SetInput(normals.GetOutput())
        surfaceCapper.SetDisplacement(self._capDisplacement)
        surfaceCapper.SetInPlaneDisplacement(self._capDisplacement)
        surfaceCapper.Update()

        polyDataNew = slicer.vtkPolyData()
        polyDataNew.DeepCopy(surfaceCapper.GetOutput())
        polyDataNew.Update()

        return polyDataNew