# BlobbyLogo

VTKExamples/Python/Visualization/BlobbyLogo

### Description

This is the blobby vtk logo described in chapter 12 of the VTK textbook.

This examples uses the data v.vtk, t.vtk and k.vtk.

### Code

BlobbyLogo.py

    #!/usr/bin/env python

    """
    """

    import vtk

    def main():
        colors = vtk.vtkNamedColors()

        fileName1, fileName2, fileName3 = get_program_parameters()
        aRenderer = vtk.vtkRenderer()
        aRenderWindow = vtk.vtkRenderWindow()
        aRenderWindow.AddRenderer(aRenderer)
        anInteractor = vtk.vtkRenderWindowInteractor()
        anInteractor.SetRenderWindow(aRenderWindow)
        aRenderWindow.SetSize(300, 300)

        # Read the geometry file containing the letter v.
        letterV = vtk.vtkPolyDataReader()
        letterV.SetFileName(fileName1)

        # Read the geometry file containing the letter t.
        letterT = vtk.vtkPolyDataReader()
        letterT.SetFileName(fileName2)

        # Read the geometry file containing the letter k.
        letterK = vtk.vtkPolyDataReader()
        letterK.SetFileName(fileName3)

        # Create a transform and transform filter for each letter.
        VTransform = vtk.vtkTransform()
        VTransformFilter = vtk.vtkTransformPolyDataFilter()
        VTransformFilter.SetInputConnection(letterV.GetOutputPort())
        VTransformFilter.SetTransform(VTransform)

        TTransform = vtk.vtkTransform()
        TTransformFilter = vtk.vtkTransformPolyDataFilter()
        TTransformFilter.SetInputConnection(letterT.GetOutputPort())
        TTransformFilter.SetTransform(TTransform)

        KTransform = vtk.vtkTransform()
        KTransformFilter = vtk.vtkTransformPolyDataFilter()
        KTransformFilter.SetInputConnection(letterK.GetOutputPort())
        KTransformFilter.SetTransform(KTransform)

        # Now append them all.
        appendAll = vtk.vtkAppendPolyData()
        appendAll.AddInputConnection(VTransformFilter.GetOutputPort())
        appendAll.AddInputConnection(TTransformFilter.GetOutputPort())
        appendAll.AddInputConnection(KTransformFilter.GetOutputPort())

        # Create normals.
        logoNormals = vtk.vtkPolyDataNormals()
        logoNormals.SetInputConnection(appendAll.GetOutputPort())
        logoNormals.SetFeatureAngle(60)

        # Map to rendering primitives.
        logoMapper = vtk.vtkPolyDataMapper()
        logoMapper.SetInputConnection(logoNormals.GetOutputPort())

        # Now an actor.
        logo = vtk.vtkActor()
        logo.SetMapper(logoMapper)

        # Now create an implicit model of the same letter.
        blobbyLogoImp = vtk.vtkImplicitModeller()
        blobbyLogoImp.SetInputConnection(appendAll.GetOutputPort())
        blobbyLogoImp.SetMaximumDistance(.075)
        blobbyLogoImp.SetSampleDimensions(64, 64, 64)
        blobbyLogoImp.SetAdjustDistance(0.05)

        # Extract an iso surface.
        blobbyLogoIso = vtk.vtkContourFilter()
        blobbyLogoIso.SetInputConnection(blobbyLogoImp.GetOutputPort())
        blobbyLogoIso.SetValue(1, 1.5)

        # Map to rendering primitives.
        blobbyLogoMapper = vtk.vtkPolyDataMapper()
        blobbyLogoMapper.SetInputConnection(blobbyLogoIso.GetOutputPort())
        blobbyLogoMapper.ScalarVisibilityOff()

        tomato = vtk.vtkProperty()
        tomato.SetDiffuseColor(colors.GetColor3d("tomato"))
        tomato.SetSpecular(.3)
        tomato.SetSpecularPower(20)

        banana = vtk.vtkProperty()
        banana.SetDiffuseColor(colors.GetColor3d("banana"))
        banana.SetDiffuse(.7)
        banana.SetSpecular(.4)
        banana.SetSpecularPower(20)

        # Now an actor.
        blobbyLogo = vtk.vtkActor()
        blobbyLogo.SetMapper(blobbyLogoMapper)
        blobbyLogo.SetProperty(banana)

        # Position the letters.

        VTransform.Translate(-16.0, 0.0, 12.5)
        VTransform.RotateY(40)

        KTransform.Translate(14.0, 0.0, 0.0)
        KTransform.RotateY(-40)

        # Move the polygonal letters to the front.
        logo.SetProperty(tomato)
        logo.SetPosition(0, 0, 6)

        aRenderer.AddActor(logo)
        aRenderer.AddActor(blobbyLogo)

        aRenderer.SetBackground(colors.GetColor3d("SlateGray"))

        aRenderWindow.Render()

        # Interact with the data.
        anInteractor.Start()

    def get_program_parameters():
        import argparse
        description = 'Use implicit modeller to create the VTK logo.'
        epilogue = '''
       '''
        parser = argparse.ArgumentParser(description=description, epilog=epilogue)
        parser.add_argument('filename1', help='v.vtk.')
        parser.add_argument('filename2', help='t.vtk.')
        parser.add_argument('filename3', help='k.vtk.')
        args = parser.parse_args()
        return args.filename1, args.filename2, args.filename3

    if __name__ == '__main__':
        main()