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
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