trimMapper = vtk.vtkPolyDataMapper() trimMapper.SetInputConnection(sampleImp.GetOutputPort(0)) trimMapper.ScalarVisibilityOff() trimActor = vtk.vtkActor() trimActor.SetMapper(trimMapper); trimActor.GetProperty().SetColor(0,0,1) # Build a loop from the clipper buildLoops = vtk.vtkContourLoopExtraction() buildLoops.SetInputConnection(sampleImp.GetOutputPort(0)) buildLoops.Update() # Test cell data cookie0 = vtk.vtkCookieCutter() cookie0.SetInputConnection(pd2cd.GetOutputPort()) cookie0.SetLoopsConnection(buildLoops.GetOutputPort()) if coloring == 0: cookie0.PassCellDataOff() cookie0.PassPointDataOff() else: cookie0.PassCellDataOn() cookie0.PassPointDataOff() timer = vtk.vtkTimerLog() timer.StartTimer() cookie0.Update() timer.StopTimer() time = timer.GetElapsedTime() print("Cookie cutting with cell data: {0}".format(time))
glyphPolys.InsertNextCell(4) glyphPolys.InsertCellPoint(0) glyphPolys.InsertCellPoint(1) glyphPolys.InsertCellPoint(2) glyphPolys.InsertCellPoint(3) glyph = vtk.vtkGlyph3D() glyph.SetInputConnection(plane.GetOutputPort()) glyph.SetSourceData(glyphData) glyph.SetScaleFactor(100) ids = vtk.vtkIdFilter() ids.SetInputConnection(glyph.GetOutputPort()) ids.Update() cookie = vtk.vtkCookieCutter() cookie.SetInputConnection(ids.GetOutputPort()) cookie.SetLoopsConnection(loops.GetOutputPort()) cookie.PassPointDataOff() cookie.PassCellDataOff() tri = vtk.vtkTriangleFilter() tri.SetInputConnection(cookie.GetOutputPort()) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(tri.GetOutputPort()) mapper.ScalarVisibilityOff() actor = vtk.vtkActor() actor.SetMapper(mapper)
def make_patterned_polydata(inputContours, fillareastyle=None, fillareaindex=None, fillareacolors=None, fillareaopacity=None, fillareapixelspacing=None, fillareapixelscale=None, size=None, renderer=None): if inputContours is None or fillareastyle == 'solid': return None if inputContours.GetNumberOfCells() == 0: return None if fillareaindex is None: fillareaindex = 1 if fillareaopacity is None: fillareaopacity = 100 if fillareapixelspacing is None: if size is not None: sp = int(0.015 * min(size[0], size[1])) fillareapixelspacing = 2 * [sp if sp > 1 else 1] else: fillareapixelspacing = [15, 15] if fillareapixelscale is None: fillareapixelscale = 1.0 * min(fillareapixelspacing[0], fillareapixelspacing[1]) # Create a point set laid out on a plane that will be glyphed with the # pattern / hatch # The bounds of the plane match the bounds of the input polydata bounds = inputContours.GetBounds() patternPolyData = vtk.vtkPolyData() patternPts = vtk.vtkPoints() patternPolyData.SetPoints(patternPts) xBounds = bounds[1] - bounds[0] yBounds = bounds[3] - bounds[2] xres = yres = 1 scale = [1.0, 1.0] if renderer is not None: # Be smart about calculating the resolution by taking the screen pixel # size into account # First, convert a distance of one unit screen distance to data # coordinates point1 = [1.0, 1.0, 0.0] point2 = [0.0, 0.0, 0.0] renderer.SetDisplayPoint(point1) renderer.DisplayToWorld() wpoint1 = renderer.GetWorldPoint() renderer.SetDisplayPoint(point2) renderer.DisplayToWorld() wpoint2 = renderer.GetWorldPoint() diffwpoints = [ abs(wpoint1[0] - wpoint2[0]), abs(wpoint1[1] - wpoint2[1]) ] diffwpoints = [1.0 if i < 1e-6 else i for i in diffwpoints] # Choosing an arbitary factor to scale the number of points. A spacing # of 10 pixels and a scale of 7.5 pixels was chosen based on visual # inspection of result. Essentially, it means each glyph is 10 pixels # away from its neighbors and 7.5 pixels high and wide. xres = int(xBounds / (fillareapixelspacing[0] * diffwpoints[0])) + 1 yres = int(yBounds / (fillareapixelspacing[1] * diffwpoints[1])) + 1 scale = [fillareapixelscale * x for x in diffwpoints[:2]] else: if xBounds <= 1 and yBounds <= 1 and size is not None: xBounds *= size[0] / 3 yBounds *= size[1] / 3 xres = int(xBounds / 3) yres = int(yBounds / 3) numPts = (xres + 1) * (yres + 1) patternPts.Allocate(numPts) normals = vtk.vtkFloatArray() normals.SetName("Normals") normals.SetNumberOfComponents(3) normals.Allocate(3 * numPts) tcoords = vtk.vtkFloatArray() tcoords.SetName("TextureCoordinates") tcoords.SetNumberOfComponents(2) tcoords.Allocate(2 * numPts) x = [0.0, 0.0, 0.0] tc = [0.0, 0.0] v1 = [0.0, bounds[3] - bounds[2]] v2 = [bounds[1] - bounds[0], 0.0] normal = [0.0, 0.0, 1.0] numPt = 0 for i in range(yres + 1): tc[0] = i * 1.0 / yres for j in range(xres + 1): tc[1] = j * 1.0 / xres for ii in range(2): x[ii] = bounds[2 * ii] + tc[0] * v1[ii] + tc[1] * v2[ii] patternPts.InsertPoint(numPt, x) tcoords.InsertTuple(numPt, tc) normals.InsertTuple(numPt, normal) numPt += 1 patternPolyData.GetPointData().SetNormals(normals) patternPolyData.GetPointData().SetTCoords(tcoords) # Create the pattern create_pattern(patternPolyData, scale, fillareastyle, fillareaindex) # Create pipeline to create a clipped polydata from the pattern plane. cutter = vtk.vtkCookieCutter() cutter.SetInputData(patternPolyData) cutter.SetLoopsData(inputContours) cutter.Update() # Now map the colors as cell scalars. # We are doing this here because the vtkCookieCutter does not preserve # cell scalars map_colors(cutter.GetOutput(), fillareastyle, fillareacolors, fillareaopacity) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cutter.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) return actor
loops.SetPoints(loopPts) loops.SetPolys(loopPolys) loopPts.SetNumberOfPoints(4) loopPts.SetPoint(0, -0.35,0.0,0.0) loopPts.SetPoint(1, 0,-0.35,0.0) loopPts.SetPoint(2, 0.35,0.0,0.0) loopPts.SetPoint(3, 0.0,0.35,0.0) loopPolys.InsertNextCell(4) loopPolys.InsertCellPoint(0) loopPolys.InsertCellPoint(1) loopPolys.InsertCellPoint(2) loopPolys.InsertCellPoint(3) cookie = vtk.vtkCookieCutter() cookie.SetInputConnection(append.GetOutputPort()) cookie.SetLoopsData(loops) cookie.Update() mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cookie.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) loopMapper = vtk.vtkPolyDataMapper() loopMapper.SetInputData(loops) loopActor = vtk.vtkActor() loopActor.SetMapper(loopMapper)
def make_patterned_polydata(inputContours, fillareastyle=None, fillareaindex=None, fillareacolors=None, fillareaopacity=None, fillareapixelspacing=None, fillareapixelscale=None, size=None, screenGeom=None, vpScale=[1.0, 1.0]): if inputContours is None or fillareastyle == 'solid': return None if inputContours.GetNumberOfCells() == 0: return None if fillareaindex is None: fillareaindex = 1 if fillareaopacity is None: fillareaopacity = 100 if fillareapixelspacing is None: if size is not None: sp = int(0.015 * min(size[0], size[1])) fillareapixelspacing = 2 * [sp if sp > 1 else 1] else: fillareapixelspacing = [15, 15] if fillareapixelscale is None: fillareapixelscale = 1.0 * min(fillareapixelspacing[0], fillareapixelspacing[1]) # Create a point set laid out on a plane that will be glyphed with the # pattern / hatch # The bounds of the plane match the bounds of the input polydata bounds = inputContours.GetBounds() patternPolyData = vtk.vtkPolyData() patternPts = vtk.vtkPoints() patternPolyData.SetPoints(patternPts) xBounds = bounds[1] - bounds[0] yBounds = bounds[3] - bounds[2] if screenGeom is not None: [xres, yres], scale = computeResolutionAndScale([xBounds, yBounds], screenGeom, vpScale, fillareapixelscale, fillareapixelspacing) else: if xBounds <= 1 and yBounds <= 1 and size is not None: xBounds *= size[0] / 3 yBounds *= size[1] / 3 xres = int(xBounds / 3) yres = int(yBounds / 3) numPts = (xres + 1) * (yres + 1) patternPts.Allocate(numPts) normals = vtk.vtkFloatArray() normals.SetName("Normals") normals.SetNumberOfComponents(3) normals.Allocate(3 * numPts) tcoords = vtk.vtkFloatArray() tcoords.SetName("TextureCoordinates") tcoords.SetNumberOfComponents(2) tcoords.Allocate(2 * numPts) x = [0.0, 0.0, 0.0] tc = [0.0, 0.0] v1 = [0.0, bounds[3] - bounds[2]] v2 = [bounds[1] - bounds[0], 0.0] normal = [0.0, 0.0, 1.0] numPt = 0 for i in range(yres + 1): tc[0] = i * 1.0 / yres for j in range(xres + 1): tc[1] = j * 1.0 / xres for ii in range(2): x[ii] = bounds[2 * ii] + tc[0] * v1[ii] + tc[1] * v2[ii] patternPts.InsertPoint(numPt, x) tcoords.InsertTuple(numPt, tc) normals.InsertTuple(numPt, normal) numPt += 1 patternPolyData.GetPointData().SetNormals(normals) patternPolyData.GetPointData().SetTCoords(tcoords) # Create the pattern scale_max = max(*scale) create_pattern(patternPolyData, [scale_max, scale_max], fillareastyle, fillareaindex) # Create pipeline to create a clipped polydata from the pattern plane. cutter = vtk.vtkCookieCutter() cutter.SetInputData(patternPolyData) cutter.SetLoopsData(inputContours) cutter.Update() # Now map the colors as cell scalars. # We are doing this here because the vtkCookieCutter does not preserve # cell scalars map_colors(cutter.GetOutput(), fillareastyle, fillareacolors, fillareaopacity) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(cutter.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) return actor