TableBasedClipDataSetWithPolyData2
Repository source: TableBasedClipDataSetWithPolyData2
Description¶
The example that shows how to use the vtkTableBasedClipDataSet to clip a vtkRectilinearGrid that contains a checkerboard pattern.
Other languages
See (Cxx)
Question
If you have a question about this example, please use the VTK Discourse Forum
Code¶
TableBasedClipDataSetWithPolyData2.py
# !/usr/bin/env python3
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import (
VTK_UNSIGNED_CHAR,
vtkDoubleArray,
vtkLookupTable,
vtkPoints,
vtkUnsignedCharArray
)
from vtkmodules.vtkCommonDataModel import (
vtkImageData,
vtkPlanes,
vtkRectilinearGrid
)
from vtkmodules.vtkFiltersGeneral import vtkTableBasedClipDataSet
from vtkmodules.vtkImagingCore import vtkImageMapToColors
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkDataSetMapper,
vtkRenderer,
vtkRenderWindow,
vtkRenderWindowInteractor,
)
def main():
# The number of checkerboard squares on a side.
image_size = 64
# Offsets for clipping planes with normals in the X and Y directions.
x_offset = 8
y_offset = 8
colors = vtkNamedColors()
renderer = vtkRenderer(background=colors.GetColor3d('Wheat'), use_hidden_line_removal=True)
render_window = vtkRenderWindow(size=(640, 480), window_name='TableBasedClipDataSetWithPolyData2')
render_window.AddRenderer(renderer)
interactor = vtkRenderWindowInteractor()
# Since we import vtkmodules.vtkInteractionStyle we can do this
# because vtkInteractorStyleSwitch is automatically imported:
interactor.interactor_style.SetCurrentStyleToTrackballCamera()
interactor.render_window = render_window
image = make_image(image_size)
# Clipping planes in the X and Y direction.
normals = vtkDoubleArray()
clip_pts = vtkPoints()
normals.SetNumberOfComponents(3)
xnorm = [-1.0, 0.0, 0.0]
ynorm = [0.0, -1.0, 0.0]
xpt = [x_offset, 0.0, 0.0]
ypt = [0.0, y_offset, 0.0]
normals.InsertNextTuple(xnorm)
normals.InsertNextTuple(ynorm)
clip_pts.InsertNextPoint(xpt)
clip_pts.InsertNextPoint(ypt)
clip_planes = vtkPlanes(normals=normals, points=clip_pts)
clipper = vtkTableBasedClipDataSet(clip_function=clip_planes, input_data=image)
image_mapper = vtkDataSetMapper()
clipper >> image_mapper
image_actor = vtkActor(mapper=image_mapper)
renderer.AddViewProp(image_actor)
renderer.ResetCamera()
renderer.active_camera.Azimuth(120)
renderer.active_camera.Elevation(30)
renderer.ResetCameraClippingRange()
render_window.Render()
interactor.Start()
# Make the image data. A checkerboard pattern is used for simplicity.
def make_image(n):
cube_size = 20.0 # physical linear dimension of entire system.
# This is a simplification of a program that uses actual image data
# as a source for the rectilinear grid. In order to recreate the
# same vtk calls, create a dummy image here.
image0 = vtkImageData()
image0.SetDimensions(n, n, n)
image0.AllocateScalars(VTK_UNSIGNED_CHAR, 1)
image0.SetSpacing(cube_size / n, cube_size / n, cube_size / n)
checker_size = n // 8
scalars = vtkUnsignedCharArray()
for z in range(0, n):
for y in range(0, n):
for x in range(0, n):
v = (x // checker_size + y // checker_size + z // checker_size) % 2
scalars.InsertNextValue(v)
image0.GetPointData().SetScalars(scalars)
colors = vtkNamedColors()
lut = vtkLookupTable(number_of_table_values=2, table_range=(0, 1))
lut.Build()
lut.SetTableValue(0, colors.GetColor4d('Thistle'))
lut.SetTableValue(1, colors.GetColor4d('DarkSlateBlue'))
map_colors = vtkImageMapToColors()
map_colors.SetLookupTable(lut)
map_colors.SetOutputFormatToRGBA()
map_colors.SetInputData(image0)
map_colors.update()
image = map_colors.output
extent = list(image.GetExtent())
for i in range(1, len(extent), 2):
extent[i] += 1
rect_grid = vtkRectilinearGrid(extent=extent)
xcoords = vtkDoubleArray()
ycoords = vtkDoubleArray()
zcoords = vtkDoubleArray()
xcoords.SetNumberOfValues(n + 1)
ycoords.SetNumberOfValues(n + 1)
zcoords.SetNumberOfValues(n + 1)
spacing = image.GetSpacing()
for i in range(0, n + 1):
xcoords.InsertValue(i, i * spacing[0])
ycoords.InsertValue(i, i * spacing[1])
zcoords.InsertValue(i, i * spacing[2])
rect_grid.SetXCoordinates(xcoords)
rect_grid.SetYCoordinates(ycoords)
rect_grid.SetZCoordinates(zcoords)
point_data = image.GetPointData()
cell_data = rect_grid.GetCellData()
cell_data.ShallowCopy(point_data)
return rect_grid
if __name__ == '__main__':
main()