def splitModels(self, Surface):
        dataArray = Surface.GetPointData().GetScalars("GroupIds")
        scalarRange = dataArray.GetRange()

        newPdList = []
        newCaList = []
        self._parentClass._helper.debug("started splitter")
        # generate containers CellArray & PolyData + copy points
        for i in range(1, int(scalarRange[1]) + 2):
            newCellArray = slicer.vtkCellArray()
            newPolyData = slicer.vtkPolyData()

            points = slicer.vtkPoints()
            points.DeepCopy(Surface.GetPoints())
            newPolyData.SetPoints(points)
            newPolyData.SetPolys(newCellArray)
            newPolyData.Update()

            newPdList.append(newPolyData)
            newCaList.append(newCellArray)

        #Fill containers with Polys
        for i in range(0, Surface.GetPolys().GetNumberOfCells()):
            poi = Surface.GetCell(i).GetPointIds()

            if (poi.GetNumberOfIds() == 0):
                continue

            scalarsOfPoints = []

            for pid in range(0, poi.GetNumberOfIds()):
                p = poi.GetId(pid)
                scalarsOfPoints.append(dataArray.GetValue(p))

            max = 0
            largestIndex = 0
            for j in range(1, int(scalarRange[1]) + 2):
                c = scalarsOfPoints.count(j)
                if c >= max:
                    max = c
                    largestIndex = j
            newCaList[largestIndex].InsertNextCell(Surface.GetCell(i))

        # clean PolyData
        for pd in newPdList:
            cleanPolyData = slicer.vtkCleanPolyData()
            cleanPolyData.SetInput(pd)
            cleanPolyData.Update()
            pd.DeepCopy(cleanPolyData.GetOutput())

        self._parentClass._helper.debug("finished splitter")

        return newPdList
  def splitModels(self,Surface):
    dataArray=Surface.GetPointData().GetScalars("GroupIds")
    scalarRange=dataArray.GetRange()
    
    newPdList=[]
    newCaList=[]
    self._parentClass._helper.debug("started splitter")
    # generate containers CellArray & PolyData + copy points
    for i in range(1,int(scalarRange[1])+2):
      newCellArray=slicer.vtkCellArray()
      newPolyData=slicer.vtkPolyData()

      points=slicer.vtkPoints()
      points.DeepCopy(Surface.GetPoints())		
      newPolyData.SetPoints(points)
      newPolyData.SetPolys(newCellArray)
      newPolyData.Update()

      newPdList.append(newPolyData)
      newCaList.append(newCellArray)

    #Fill containers with Polys
    for i in range (0,Surface.GetPolys().GetNumberOfCells()):
      poi=Surface.GetCell(i).GetPointIds()

      if(poi.GetNumberOfIds()==0):
        continue

      scalarsOfPoints =[]
  
      for pid in range(0,poi.GetNumberOfIds()): 
        p=poi.GetId(pid)
        scalarsOfPoints.append(dataArray.GetValue(p))

      max=0
      largestIndex=0
      for j in range(1,int(scalarRange[1])+2):
        c=scalarsOfPoints.count(j)
        if c >= max:
          max=c
          largestIndex=j
      newCaList[largestIndex].InsertNextCell(Surface.GetCell(i))

    # clean PolyData
    for pd in newPdList:
      cleanPolyData = slicer.vtkCleanPolyData();
      cleanPolyData.SetInput(pd);
      cleanPolyData.Update();
      pd.DeepCopy(cleanPolyData.GetOutput())
      
    self._parentClass._helper.debug("finished splitter")

    return newPdList
    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
예제 #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