CreateColorSeriesDemo

VTKExamples/Python/Visualization/CreateColorSeriesDemo


Description

This example demonstrates how to create a custom vtkColorSeries. The examples produces a vtkLookupTable explicitly. The vtkLookupTable is populated with colors from the vtkColorSeries using GetColorRepeating, since the size of the vtkLookupTable may be larger than the colors in the vtkColorSeries.

A vtkPlaneSource generates the geometry. The vtkCellData is populated with increasing integers starting at 1.

Ten different color series are generated from VTK color names in vtkNamedColors. The first argument of the example is one of "Blue", "Brown", "Red", "Orange", "White", "Grey", "Magenta", "Cyan", "Yellow" and "Green".

Other Languages

See (Cxx)

Code

CreateColorSeriesDemo.py

#!/usr/bin/env python

import vtk


def get_program_parameters():
    import argparse
    description = 'how to create a custom vtkColorSeries.'
    epilogue = '''
A vtkLookupTable is explicitly produced, it is populated with colors from the vtkColorSeries
   using GetColorRepeating, since the size of the vtkLookupTable may be larger than the
   colors in the vtkColorSeries.

Ten different color series are generated from VTK color names in vtkNamedColors.
Choose from one of: Blue, Brown, Red, Orange, White, Grey, Magenta, Cyan, Yellow and Green.
    '''
    parser = argparse.ArgumentParser(description=description, epilog=epilogue,
                                     formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('seriesName', default='Red', nargs='?',
                        help='The name of the color series to use (default is Red).')
    args = parser.parse_args()
    return args.seriesName


def CreateLookupTableVTKBlue(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKBlueColors')

    myColors.AddColor(nc.GetColor3ub('alice_blue'))
    myColors.AddColor(nc.GetColor3ub('blue'))
    myColors.AddColor(nc.GetColor3ub('blue_light'))
    myColors.AddColor(nc.GetColor3ub('blue_medium'))
    myColors.AddColor(nc.GetColor3ub('cadet'))
    myColors.AddColor(nc.GetColor3ub('cobalt'))
    myColors.AddColor(nc.GetColor3ub('cornflower'))
    myColors.AddColor(nc.GetColor3ub('cerulean'))
    myColors.AddColor(nc.GetColor3ub('dodger_blue'))
    myColors.AddColor(nc.GetColor3ub('indigo'))
    myColors.AddColor(nc.GetColor3ub('manganese_blue'))
    myColors.AddColor(nc.GetColor3ub('midnight_blue'))
    myColors.AddColor(nc.GetColor3ub('navy'))
    myColors.AddColor(nc.GetColor3ub('peacock'))
    myColors.AddColor(nc.GetColor3ub('powder_blue'))
    myColors.AddColor(nc.GetColor3ub('royal_blue'))
    myColors.AddColor(nc.GetColor3ub('slate_blue'))
    myColors.AddColor(nc.GetColor3ub('slate_blue_dark'))
    myColors.AddColor(nc.GetColor3ub('slate_blue_light'))
    myColors.AddColor(nc.GetColor3ub('slate_blue_medium'))
    myColors.AddColor(nc.GetColor3ub('sky_blue'))
    myColors.AddColor(nc.GetColor3ub('sky_blue_deep'))
    myColors.AddColor(nc.GetColor3ub('sky_blue_light'))
    myColors.AddColor(nc.GetColor3ub('steel_blue'))
    myColors.AddColor(nc.GetColor3ub('steel_blue_light'))
    myColors.AddColor(nc.GetColor3ub('turquoise_blue'))
    myColors.AddColor(nc.GetColor3ub('ultramarine'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKBrown(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKBrownColors')

    myColors.AddColor(nc.GetColor3ub('beige'))
    myColors.AddColor(nc.GetColor3ub('brown'))
    myColors.AddColor(nc.GetColor3ub('brown_madder'))
    myColors.AddColor(nc.GetColor3ub('brown_ochre'))
    myColors.AddColor(nc.GetColor3ub('burlywood'))
    myColors.AddColor(nc.GetColor3ub('burnt_sienna'))
    myColors.AddColor(nc.GetColor3ub('burnt_umber'))
    myColors.AddColor(nc.GetColor3ub('chocolate'))
    myColors.AddColor(nc.GetColor3ub('deep_ochre'))
    myColors.AddColor(nc.GetColor3ub('flesh'))
    myColors.AddColor(nc.GetColor3ub('flesh_ochre'))
    myColors.AddColor(nc.GetColor3ub('gold_ochre'))
    myColors.AddColor(nc.GetColor3ub('greenish_umber'))
    myColors.AddColor(nc.GetColor3ub('khaki'))
    myColors.AddColor(nc.GetColor3ub('khaki_dark'))
    myColors.AddColor(nc.GetColor3ub('light_beige'))
    myColors.AddColor(nc.GetColor3ub('peru'))
    myColors.AddColor(nc.GetColor3ub('rosy_brown'))
    myColors.AddColor(nc.GetColor3ub('raw_sienna'))
    myColors.AddColor(nc.GetColor3ub('raw_umber'))
    myColors.AddColor(nc.GetColor3ub('sepia'))
    myColors.AddColor(nc.GetColor3ub('sienna'))
    myColors.AddColor(nc.GetColor3ub('saddle_brown'))
    myColors.AddColor(nc.GetColor3ub('sandy_brown'))
    myColors.AddColor(nc.GetColor3ub('tan'))
    myColors.AddColor(nc.GetColor3ub('van_dyke_brown'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKRed(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKRedColors')

    myColors.AddColor(nc.GetColor3ub('alizarin_crimson'))
    myColors.AddColor(nc.GetColor3ub('brick'))
    myColors.AddColor(nc.GetColor3ub('cadmium_red_deep'))
    myColors.AddColor(nc.GetColor3ub('coral'))
    myColors.AddColor(nc.GetColor3ub('coral_light'))
    myColors.AddColor(nc.GetColor3ub('deep_pink'))
    myColors.AddColor(nc.GetColor3ub('english_red'))
    myColors.AddColor(nc.GetColor3ub('firebrick'))
    myColors.AddColor(nc.GetColor3ub('geranium_lake'))
    myColors.AddColor(nc.GetColor3ub('hot_pink'))
    myColors.AddColor(nc.GetColor3ub('indian_red'))
    myColors.AddColor(nc.GetColor3ub('light_salmon'))
    myColors.AddColor(nc.GetColor3ub('madder_lake_deep'))
    myColors.AddColor(nc.GetColor3ub('maroon'))
    myColors.AddColor(nc.GetColor3ub('pink'))
    myColors.AddColor(nc.GetColor3ub('pink_light'))
    myColors.AddColor(nc.GetColor3ub('raspberry'))
    myColors.AddColor(nc.GetColor3ub('red'))
    myColors.AddColor(nc.GetColor3ub('rose_madder'))
    myColors.AddColor(nc.GetColor3ub('salmon'))
    myColors.AddColor(nc.GetColor3ub('tomato'))
    myColors.AddColor(nc.GetColor3ub('venetian_red'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKOrange(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKOrangeColors')

    myColors.AddColor(nc.GetColor3ub('cadmium_orange'))
    myColors.AddColor(nc.GetColor3ub('cadmium_red_light'))
    myColors.AddColor(nc.GetColor3ub('carrot'))
    myColors.AddColor(nc.GetColor3ub('dark_orange'))
    myColors.AddColor(nc.GetColor3ub('mars_orange'))
    myColors.AddColor(nc.GetColor3ub('mars_yellow'))
    myColors.AddColor(nc.GetColor3ub('orange'))
    myColors.AddColor(nc.GetColor3ub('orange_red'))
    myColors.AddColor(nc.GetColor3ub('yellow_ochre'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKWhite(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKWhiteColors')

    myColors.AddColor(nc.GetColor3ub('antique_white'))
    myColors.AddColor(nc.GetColor3ub('azure'))
    myColors.AddColor(nc.GetColor3ub('bisque'))
    myColors.AddColor(nc.GetColor3ub('blanched_almond'))
    myColors.AddColor(nc.GetColor3ub('cornsilk'))
    myColors.AddColor(nc.GetColor3ub('eggshell'))
    myColors.AddColor(nc.GetColor3ub('floral_white'))
    myColors.AddColor(nc.GetColor3ub('gainsboro'))
    myColors.AddColor(nc.GetColor3ub('ghost_white'))
    myColors.AddColor(nc.GetColor3ub('honeydew'))
    myColors.AddColor(nc.GetColor3ub('ivory'))
    myColors.AddColor(nc.GetColor3ub('lavender'))
    myColors.AddColor(nc.GetColor3ub('lavender_blush'))
    myColors.AddColor(nc.GetColor3ub('lemon_chiffon'))
    myColors.AddColor(nc.GetColor3ub('linen'))
    myColors.AddColor(nc.GetColor3ub('mint_cream'))
    myColors.AddColor(nc.GetColor3ub('misty_rose'))
    myColors.AddColor(nc.GetColor3ub('moccasin'))
    myColors.AddColor(nc.GetColor3ub('navajo_white'))
    myColors.AddColor(nc.GetColor3ub('old_lace'))
    myColors.AddColor(nc.GetColor3ub('papaya_whip'))
    myColors.AddColor(nc.GetColor3ub('peach_puff'))
    myColors.AddColor(nc.GetColor3ub('seashell'))
    myColors.AddColor(nc.GetColor3ub('snow'))
    myColors.AddColor(nc.GetColor3ub('thistle'))
    myColors.AddColor(nc.GetColor3ub('titanium_white'))
    myColors.AddColor(nc.GetColor3ub('wheat'))
    myColors.AddColor(nc.GetColor3ub('white'))
    myColors.AddColor(nc.GetColor3ub('white_smoke'))
    myColors.AddColor(nc.GetColor3ub('zinc_white'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKGrey(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKGreyColors')

    myColors.AddColor(nc.GetColor3ub('cold_grey'))
    myColors.AddColor(nc.GetColor3ub('dim_grey'))
    myColors.AddColor(nc.GetColor3ub('grey'))
    myColors.AddColor(nc.GetColor3ub('light_grey'))
    myColors.AddColor(nc.GetColor3ub('slate_grey'))
    myColors.AddColor(nc.GetColor3ub('slate_grey_dark'))
    myColors.AddColor(nc.GetColor3ub('slate_grey_light'))
    myColors.AddColor(nc.GetColor3ub('warm_grey'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKMagenta(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKMagentaColors')

    myColors.AddColor(nc.GetColor3ub('blue_violet'))
    myColors.AddColor(nc.GetColor3ub('cobalt_violet_deep'))
    myColors.AddColor(nc.GetColor3ub('magenta'))
    myColors.AddColor(nc.GetColor3ub('orchid'))
    myColors.AddColor(nc.GetColor3ub('orchid_dark'))
    myColors.AddColor(nc.GetColor3ub('orchid_medium'))
    myColors.AddColor(nc.GetColor3ub('permanent_red_violet'))
    myColors.AddColor(nc.GetColor3ub('plum'))
    myColors.AddColor(nc.GetColor3ub('purple'))
    myColors.AddColor(nc.GetColor3ub('purple_medium'))
    myColors.AddColor(nc.GetColor3ub('ultramarine_violet'))
    myColors.AddColor(nc.GetColor3ub('violet'))
    myColors.AddColor(nc.GetColor3ub('violet_dark'))
    myColors.AddColor(nc.GetColor3ub('violet_red'))
    myColors.AddColor(nc.GetColor3ub('violet_red_medium'))
    myColors.AddColor(nc.GetColor3ub('violet_red_pale'))
    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKCyan(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKCyanColors')

    myColors.AddColor(nc.GetColor3ub('aquamarine'))
    myColors.AddColor(nc.GetColor3ub('aquamarine_medium'))
    myColors.AddColor(nc.GetColor3ub('cyan'))
    myColors.AddColor(nc.GetColor3ub('cyan_white'))
    myColors.AddColor(nc.GetColor3ub('turquoise'))
    myColors.AddColor(nc.GetColor3ub('turquoise_dark'))
    myColors.AddColor(nc.GetColor3ub('turquoise_medium'))
    myColors.AddColor(nc.GetColor3ub('turquoise_pale'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKYellow(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKYellowColors')

    myColors.AddColor(nc.GetColor3ub('aureoline_yellow'))
    myColors.AddColor(nc.GetColor3ub('banana'))
    myColors.AddColor(nc.GetColor3ub('cadmium_lemon'))
    myColors.AddColor(nc.GetColor3ub('cadmium_yellow'))
    myColors.AddColor(nc.GetColor3ub('cadmium_yellow_light'))
    myColors.AddColor(nc.GetColor3ub('gold'))
    myColors.AddColor(nc.GetColor3ub('goldenrod'))
    myColors.AddColor(nc.GetColor3ub('goldenrod_dark'))
    myColors.AddColor(nc.GetColor3ub('goldenrod_light'))
    myColors.AddColor(nc.GetColor3ub('goldenrod_pale'))
    myColors.AddColor(nc.GetColor3ub('light_goldenrod'))
    myColors.AddColor(nc.GetColor3ub('melon'))
    myColors.AddColor(nc.GetColor3ub('naples_yellow_deep'))
    myColors.AddColor(nc.GetColor3ub('yellow'))
    myColors.AddColor(nc.GetColor3ub('yellow_light'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def CreateLookupTableVTKGreen(size):
    nc = vtk.vtkNamedColors()
    myColors = vtk.vtkColorSeries()
    myColors.SetColorSchemeByName('VTKGreenColors')

    myColors.AddColor(nc.GetColor3ub('chartreuse'))
    myColors.AddColor(nc.GetColor3ub('chrome_oxide_green'))
    myColors.AddColor(nc.GetColor3ub('cinnabar_green'))
    myColors.AddColor(nc.GetColor3ub('cobalt_green'))
    myColors.AddColor(nc.GetColor3ub('emerald_green'))
    myColors.AddColor(nc.GetColor3ub('forest_green'))
    myColors.AddColor(nc.GetColor3ub('green'))
    myColors.AddColor(nc.GetColor3ub('green_dark'))
    myColors.AddColor(nc.GetColor3ub('green_pale'))
    myColors.AddColor(nc.GetColor3ub('green_yellow'))
    myColors.AddColor(nc.GetColor3ub('lawn_green'))
    myColors.AddColor(nc.GetColor3ub('lime_green'))
    myColors.AddColor(nc.GetColor3ub('mint'))
    myColors.AddColor(nc.GetColor3ub('olive'))
    myColors.AddColor(nc.GetColor3ub('olive_drab'))
    myColors.AddColor(nc.GetColor3ub('olive_green_dark'))
    myColors.AddColor(nc.GetColor3ub('permanent_green'))
    myColors.AddColor(nc.GetColor3ub('sap_green'))
    myColors.AddColor(nc.GetColor3ub('sea_green'))
    myColors.AddColor(nc.GetColor3ub('sea_green_dark'))
    myColors.AddColor(nc.GetColor3ub('sea_green_medium'))
    myColors.AddColor(nc.GetColor3ub('sea_green_light'))
    myColors.AddColor(nc.GetColor3ub('spring_green'))
    myColors.AddColor(nc.GetColor3ub('spring_green_medium'))
    myColors.AddColor(nc.GetColor3ub('terre_verte'))
    myColors.AddColor(nc.GetColor3ub('viridian_light'))
    myColors.AddColor(nc.GetColor3ub('yellow_green'))

    numberOfColors = myColors.GetNumberOfColors()
    print('Number of colors:', numberOfColors)

    lut = vtk.vtkLookupTable()
    if size == 0:
        lut.SetNumberOfTableValues(numberOfColors)
    else:
        lut.SetNumberOfTableValues(size)
    lut.SetTableRange(0, lut.GetNumberOfTableValues())
    for i in range(lut.GetNumberOfTableValues()):
        color = myColors.GetColorRepeating(i)
        c = [color.GetRed(), color.GetGreen(), color.GetBlue(), 255]
        lut.SetTableValue(i, [x / 255.0 for x in c])
    return lut


def main():
    seriesName = get_program_parameters()
    seriesName = seriesName.capitalize()
    available_color_series = ['Blue', 'Brown', 'Red', 'Orange', 'White', 'Grey', 'Magenta', 'Cyan', 'Yellow', 'Green']
    if seriesName not in available_color_series:
        print('Available color maps are:', ", ".join(available_color_series))
        return

    colors = vtk.vtkNamedColors()

    # Provide some geometry.
    xResolution = 6
    yResolution = 6
    aPlane = vtk.vtkPlaneSource()
    aPlane.SetXResolution(xResolution)
    aPlane.SetYResolution(yResolution)
    size = xResolution * yResolution + 1

    # Create cell data.
    cellData = vtk.vtkFloatArray()
    for i in range(0, xResolution * yResolution):
        cellData.InsertNextValue(i)
    aPlane.Update()  # Force an update so we can set cell data.
    aPlane.GetOutput().GetCellData().SetScalars(cellData)

    # Get the lookup table.
    lut = eval('CreateLookupTableVTK' + seriesName + '(size)')

    # Set up the actor and mapper.
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetLookupTable(lut)
    mapper.SetInputConnection(aPlane.GetOutputPort())
    mapper.SetScalarModeToUseCellData()
    mapper.SetScalarRange(0, size)

    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.GetProperty().EdgeVisibilityOn()

    # Setup render window, renderer, and interactor.
    renderer = vtk.vtkRenderer()
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.AddRenderer(renderer)
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    renderWindowInteractor.SetRenderWindow(renderWindow)

    renderer.AddActor(actor)
    renderer.SetBackground(colors.GetColor3d('SlateGray'))
    renderWindow.Render()
    renderWindowInteractor.Start()


if __name__ == '__main__':
    main()