import vtk

# Create a cube with its origin at (0,0,0) and mirror it in X and Y directions

mirrorX = vtk.vtkTransform()
mirrorX.Scale(-1,1,1)
mirrorY = vtk.vtkTransform()
mirrorY.Scale(1,-1,1)

useReverseSense = False

# Create the cube
cube = vtk.vtkCubeSource()
cube.SetCenter(.5,.5,.5)
m=vtk.vtkPolyDataMapper()
m.SetInputConnection(cube.GetOutputPort())

reverse = vtk.vtkReverseSense()
reverse.SetInputConnection(cube.GetOutputPort())
mr=vtk.vtkPolyDataMapper()
mr.SetInputConnection(reverse.GetOutputPort())

# Original position - white
a=vtk.vtkActor()
a.SetMapper(m)
a.GetProperty().SetColor(1,1,1)

# Mirrored in X direction - red
a_x = vtk.vtkActor()
a_x.GetProperty().SetColor(1,0,0)
if useReverseSense:
    a_x.SetMapper(mr)
else:
    a_x.SetMapper(m)
trsf_x = vtk.vtkTransform()
trsf_x.Concatenate(mirrorX)
a_x.SetUserTransform(trsf_x)

# Mirrored in Y direction - blue
a_y = vtk.vtkActor()
a_y.GetProperty().SetColor(0,0,1)
if useReverseSense:
    a_y.SetMapper(mr)
else:
    a_y.SetMapper(m)
trsf_y = vtk.vtkTransform()
trsf_y.Concatenate(mirrorY)
a_y.SetUserTransform(trsf_y)

# Mirrored in X and Y directions - green
a_xy = vtk.vtkActor()
a_xy.GetProperty().SetColor(0,1,0)
a_xy.SetMapper(m)
trsf_xy = vtk.vtkTransform()
trsf_xy.Concatenate(mirrorX)
trsf_xy.Concatenate(mirrorY)
a_xy.SetUserTransform(trsf_xy)

# Show everything
r=vtk.vtkRenderer()
r.AddViewProp(a)
r.AddViewProp(a_x)
r.AddViewProp(a_y)
r.AddViewProp(a_xy)
r.SetBackground(.4,.4,.4)

rw=vtk.vtkRenderWindow()
rw.AddRenderer(r)

rwi=vtk.vtkRenderWindowInteractor()
rwi.SetRenderWindow(rw)
rwi.Render()
rwi.Start()
