def GenerateMould(self, facePolydata, distanceFromMask, ROI, tubePolydata, clippedFace): ROIExtents = self.utility.GetROIExtents(ROI) outerFaceImplicitFunction = vtk.vtkImplicitModeller() outerFaceImplicitFunction.SetInputConnection(facePolydata.GetOutputPort()) outerFaceImplicitFunction.SetSampleDimensions(70, 70, 70) outerFaceImplicitFunction.SetMaximumDistance(distanceFromMask) outerFaceImplicitFunction.SetModelBounds(ROIExtents) outerFaceImplicitFunction.SetProcessModeToPerVoxel() outerMaskContourFunction = vtk.vtkContourFilter() # TODO Find out the the allowed thinkness of the plastic THICKNESS = 3 outerMaskContourFunction.SetValue(0, THICKNESS) outerMaskContourFunction.SetInputConnection(outerFaceImplicitFunction.GetOutputPort()) outerFaceNormalsFunction = vtk.vtkPolyDataNormals() outerFaceNormalsFunction.AutoOrientNormalsOn() outerFaceNormalsFunction.AddInputConnection(outerMaskContourFunction.GetOutputPort()) # Subtract the Tubes from the mask subtractionFilter1 = vtk.vtkBooleanOperationPolyDataFilter() subtractionFilter1.SetOperationToDifference() subtractionFilter1.SetInputConnection(0, outerFaceNormalsFunction.GetOutputPort()) subtractionFilter1.SetInputConnection(1, tubePolydata.GetOutputPort()) # Subtract the inner face from the outer face to make the mask subtractionFilter2 = vtk.vtkBooleanOperationPolyDataFilter() subtractionFilter2.SetOperationToDifference() subtractionFilter2.SetInputConnection(0, subtractionFilter1.GetOutputPort()) subtractionFilter2.SetInputConnection(1, clippedFace.GetOutputPort()) x = self.utility.DisplayPolyData("Mask", subtractionFilter2.GetOutput()) x.SetColor(0.8, 0.8, 0.8) x.SetOpacity(1)
def MinimumDistanceMask(self, vtkAlgorythmObject, distanceFromMask, ROI, ruler, isBubble=False): """ Takes an algorythm object which is will send through a pipeline to create a mask defining the minimum distance value from the skin surface returns an algorythm object as well to preform GetOutput() -> polydata or GetOutputPort() -> algorythm see MinimumDistanceMask.pdf """ if distanceFromMask < 2: print "WARNING: MouldLogic: MinimumDistanceMask implicit", "modeling is very unstable below 1.5 , mask may degrade", "and lines will become discontinuous." Extents = self.utility.GetROIExtents(ROI) if (isBubble): Extents = self.utility.ExpandExtents(Extents, 100) implicitModeller = vtk.vtkImplicitModeller() implicitModeller.SetInputConnection(vtkAlgorythmObject.GetOutputPort()) implicitModeller.SetMaximumDistance(distanceFromMask) implicitModeller.SetModelBounds(Extents) implicitModeller.AdjustBoundsOn() implicitModeller.SetAdjustBounds(10) # Removes the boundary effects implicitModeller.CappingOff( ) # Important to create disjoint inner and outer masks implicitModeller.SetProcessModeToPerVoxel() implicitModeller.Update() contourFilter = vtk.vtkContourFilter() contourFilter.SetValue(0, distanceFromMask) contourFilter.SetInputConnection(implicitModeller.GetOutputPort()) contourFilter.Update() normalsFunction = vtk.vtkPolyDataNormals() normalsFunction.FlipNormalsOn() normalsFunction.AddInputConnection(contourFilter.GetOutputPort()) normalsFunction.Update() implicitBoxRegion = vtk.vtkBox() implicitBoxRegion.SetBounds(Extents) clipper2 = vtk.vtkClipPolyData() clipper2.InsideOutOn() # Clip the regions outside of implicit function clipper2.SetInputConnection(normalsFunction.GetOutputPort()) clipper2.SetClipFunction(implicitBoxRegion) clipper2.Update() closestPoint = [0, 0, 0] ruler.GetPosition1(closestPoint) connectivityFilter = vtk.vtkPolyDataConnectivityFilter() connectivityFilter.SetInputConnection(clipper2.GetOutputPort()) connectivityFilter.SetExtractionModeToClosestPointRegion() connectivityFilter.SetClosestPoint(closestPoint) connectivityFilter.Update() return connectivityFilter.GetOutput()
def MinimumDistanceMask(self, vtkAlgorythmObject, distanceFromMask, ROI, ruler, isBubble=False): """ Takes an algorythm object which is will send through a pipeline to create a mask defining the minimum distance value from the skin surface returns an algorythm object as well to preform GetOutput() -> polydata or GetOutputPort() -> algorythm see MinimumDistanceMask.pdf """ if distanceFromMask < 2: print "WARNING: MouldLogic: MinimumDistanceMask implicit", "modeling is very unstable below 1.5 , mask may degrade", "and lines will become discontinuous." Extents = self.utility.GetROIExtents(ROI) if isBubble: Extents = self.utility.ExpandExtents(Extents, 100) implicitModeller = vtk.vtkImplicitModeller() implicitModeller.SetInputConnection(vtkAlgorythmObject.GetOutputPort()) implicitModeller.SetMaximumDistance(distanceFromMask) implicitModeller.SetModelBounds(Extents) implicitModeller.AdjustBoundsOn() implicitModeller.SetAdjustBounds(10) # Removes the boundary effects implicitModeller.CappingOff() # Important to create disjoint inner and outer masks implicitModeller.SetProcessModeToPerVoxel() implicitModeller.Update() contourFilter = vtk.vtkContourFilter() contourFilter.SetValue(0, distanceFromMask) contourFilter.SetInputConnection(implicitModeller.GetOutputPort()) contourFilter.Update() normalsFunction = vtk.vtkPolyDataNormals() normalsFunction.FlipNormalsOn() normalsFunction.AddInputConnection(contourFilter.GetOutputPort()) normalsFunction.Update() implicitBoxRegion = vtk.vtkBox() implicitBoxRegion.SetBounds(Extents) clipper2 = vtk.vtkClipPolyData() clipper2.InsideOutOn() # Clip the regions outside of implicit function clipper2.SetInputConnection(normalsFunction.GetOutputPort()) clipper2.SetClipFunction(implicitBoxRegion) clipper2.Update() closestPoint = [0, 0, 0] ruler.GetPosition1(closestPoint) connectivityFilter = vtk.vtkPolyDataConnectivityFilter() connectivityFilter.SetInputConnection(clipper2.GetOutputPort()) connectivityFilter.SetExtractionModeToClosestPointRegion() connectivityFilter.SetClosestPoint(closestPoint) connectivityFilter.Update() return connectivityFilter.GetOutput()
def AddTubeToMask(self, maskPolydata, tube, ROI, radius, ruler): ROIExtents = self.utility.GetROIExtents(ROI) implicitFilter = vtk.vtkImplicitModeller() implicitFilter.SetInput(tube) implicitFilter.SetSampleDimensions(70, 70, 70) implicitFilter.SetMaximumDistance(radius) implicitFilter.SetModelBounds(ROIExtents) implicitFilter.SetProcessModeToPerVoxel() contourFilter = vtk.vtkContourFilter() contourFilter.SetValue(0, radius) implicitFilter.AdjustBoundsOn() implicitFilter.SetAdjustBounds(1) # Removes the boundary effects implicitFilter.CappingOff() contourFilter.SetInputConnection(implicitFilter.GetOutputPort()) normalsFunction = vtk.vtkPolyDataNormals() normalsFunction.AutoOrientNormalsOn() normalsFunction.AddInputConnection(contourFilter.GetOutputPort()) unionFilter = vtk.vtkBooleanOperationPolyDataFilter() unionFilter.SetOperationToUnion() unionFilter.SetInput(0, normalsFunction.GetOutput()) unionFilter.SetInput(1, maskPolydata) return unionFilter.GetOutput()
def GenerateMould(self, facePolydata, distanceFromMask, ROI, tubePolydata, clippedFace): ROIExtents = self.utility.GetROIExtents(ROI) outerFaceImplicitFunction = vtk.vtkImplicitModeller() outerFaceImplicitFunction.SetInputConnection( facePolydata.GetOutputPort()) outerFaceImplicitFunction.SetSampleDimensions(70, 70, 70) outerFaceImplicitFunction.SetMaximumDistance(distanceFromMask) outerFaceImplicitFunction.SetModelBounds(ROIExtents) outerFaceImplicitFunction.SetProcessModeToPerVoxel() outerMaskContourFunction = vtk.vtkContourFilter() #TODO Find out the the allowed thinkness of the plastic THICKNESS = 3 outerMaskContourFunction.SetValue(0, THICKNESS) outerMaskContourFunction.SetInputConnection( outerFaceImplicitFunction.GetOutputPort()) outerFaceNormalsFunction = vtk.vtkPolyDataNormals() outerFaceNormalsFunction.AutoOrientNormalsOn() outerFaceNormalsFunction.AddInputConnection( outerMaskContourFunction.GetOutputPort()) # Subtract the Tubes from the mask subtractionFilter1 = vtk.vtkBooleanOperationPolyDataFilter() subtractionFilter1.SetOperationToDifference() subtractionFilter1.SetInputConnection( 0, outerFaceNormalsFunction.GetOutputPort()) subtractionFilter1.SetInputConnection(1, tubePolydata.GetOutputPort()) # Subtract the inner face from the outer face to make the mask subtractionFilter2 = vtk.vtkBooleanOperationPolyDataFilter() subtractionFilter2.SetOperationToDifference() subtractionFilter2.SetInputConnection( 0, subtractionFilter1.GetOutputPort()) subtractionFilter2.SetInputConnection(1, clippedFace.GetOutputPort()) x = self.utility.DisplayPolyData("Mask", subtractionFilter2.GetOutput()) x.SetColor(0.8, 0.8, 0.8) x.SetOpacity(1)