# Rotations

VTKExamples/Python/Rendering/Rotations

### Code

Rotations.py

    #!/usr/local/bin/python

    import vtk

    def main():
        """
            To match the illustrations in VTKTextbook.pdf, use BkgColor as the background and
              Wheat as the cow colour.
            Also comment out the lines:
              modelActor->GetProperty()->SetSpecular(.6);
              modelActor->GetProperty()->SetSpecularPower(30);
            and use cow.g as the inout data.

        """
        file_name, figure = get_program_parameters()
        # Create renderer stuff
        #
        colors = vtk.vtkNamedColors()
        # Set the background color. Match those in VTKTextbook.pdf.
        bkg = map(lambda x: x / 256.0, [60, 93, 144])
        colors.SetColor("BkgColor", *bkg)

        ren1 = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren1)

        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)

        # create pipeline
        #
        polyData = ReadPolyData(file_name)

        modelMapper = vtk.vtkPolyDataMapper()
        modelMapper.SetInputData(polyData)

        modelActor = vtk.vtkActor()
        modelActor.SetMapper(modelMapper)
        # modelActor.GetProperty().SetDiffuseColor(colors.GetColor3d("Wheat"))
        modelActor.GetProperty().SetDiffuseColor(colors.GetColor3d("Crimson"))
        modelActor.GetProperty().SetSpecular(.6)
        modelActor.GetProperty().SetSpecularPower(30)

        modelAxesSource = vtk.vtkAxes()
        modelAxesSource.SetScaleFactor(10)
        modelAxesSource.SetOrigin(0, 0, 0)

        modelAxesMapper = vtk.vtkPolyDataMapper()
        modelAxesMapper.SetInputConnection(modelAxesSource.GetOutputPort())

        modelAxes = vtk.vtkActor()
        modelAxes.SetMapper(modelAxesMapper)

        ren1.AddActor(modelAxes)
        modelAxes.VisibilityOff()

        # Add the actors to the renderer, set the background and size
        #
        ren1.AddActor(modelActor)
        # ren1.SetBackground(colors.GetColor3d("BkgColor"))
        ren1.SetBackground(colors.GetColor3d("Silver"))
        renWin.SetSize(640, 480)
        ren1.ResetCamera()
        ren1.GetActiveCamera().Azimuth(0)
        ren1.GetActiveCamera().SetClippingRange(.1, 1000.0)

        modelAxes.VisibilityOn()

        renWin.Render()
        renWin.Render()

        if figure == 1:
            RotateX(renWin, modelActor)
        elif figure == 2:
            RotateY(renWin, modelActor)
        elif figure == 3:
            RotateZ(renWin, modelActor)
        else:
            RotateXY(renWin, modelActor)

        renWin.EraseOff()
        iren.Start()

    def get_program_parameters():
        import argparse
        description = 'Perform rotations about the X, Y, Z and X then Y axes.'
        epilogue = '''
            Perform rotations about the X, Y, Z and X then Y axes.
       '''
        parser = argparse.ArgumentParser(description=description, epilog=epilogue)
        parser.add_argument('filename', help='The file cow.obj.')
        parser.add_argument('figure', default=0, type=int, nargs='?', help='The particular rotation that you want to view.')
        args = parser.parse_args()
        return args.filename, args.figure

    def RotateX(renWin, actor):
        actor.SetOrientation(0, 0, 0)
        renWin.Render()
        renWin.Render()
        renWin.EraseOff()

        for i in range(0, 6):
            actor.RotateX(60)
            renWin.Render()
            renWin.Render()
        renWin.EraseOn()

    def RotateY(renWin, actor):
        actor.SetOrientation(0, 0, 0)
        renWin.Render()
        renWin.EraseOff()

        for i in range(0, 6):
            actor.RotateY(60)
            renWin.Render()
            renWin.Render()
        renWin.EraseOn()

    def RotateZ(renWin, actor):
        actor.SetOrientation(0, 0, 0)
        renWin.Render()
        renWin.EraseOff()

        for i in range(0, 6):
            actor.RotateZ(60)
            renWin.Render()
            renWin.Render()
        renWin.EraseOn()

    def RotateXY(renWin, actor):
        actor.SetOrientation(0, 0, 0)
        actor.RotateX(60)
        renWin.Render()
        renWin.Render()
        renWin.EraseOff()

        for i in range(0, 6):
            actor.RotateY(60)
            renWin.Render()
            renWin.Render()
        renWin.EraseOn()

    def ReadPolyData(file_name):
        import os
        path, extension = os.path.splitext(file_name)
        extension = extension.lower()
        if extension == ".ply":
            reader = vtk.vtkPLYReader()
            reader.SetFileName(file_name)
            reader.Update()
            poly_data = reader.GetOutput()
        elif extension == ".vtp":
            reader = vtk.vtkXMLpoly_dataReader()
            reader.SetFileName(file_name)
            reader.Update()
            poly_data = reader.GetOutput()
        elif extension == ".obj":
            reader = vtk.vtkOBJReader()
            reader.SetFileName(file_name)
            reader.Update()
            poly_data = reader.GetOutput()
        elif extension == ".stl":
            reader = vtk.vtkSTLReader()
            reader.SetFileName(file_name)
            reader.Update()
            poly_data = reader.GetOutput()
        elif extension == ".vtk":
            reader = vtk.vtkpoly_dataReader()
            reader.SetFileName(file_name)
            reader.Update()
            poly_data = reader.GetOutput()
        elif extension == ".g":
            reader = vtk.vtkBYUReader()
            reader.SetGeometryFileName(file_name)
            reader.Update()
            poly_data = reader.GetOutput()
        else:
            # Return a sphere if the extension is unknown.
            source = vtk.vtkSphereSource()
            source.Update()
            poly_data = source.GetOutput()
        return poly_data

    if __name__ == '__main__':
        main()