# LOx

VTKExamples/Python/VisualizationAlgorithms/LOx

### Code

LOx.py

    #!/usr/bin/env python

    """
    """

    import vtk

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

        xyxFile, qFile = get_program_parameters()

        # Read the data.
        #
        pl3d = vtk.vtkMultiBlockPLOT3DReader()
        pl3d.AutoDetectFormatOn()
        pl3d.SetXYZFileName(xyxFile)
        pl3d.SetQFileName(qFile)
        pl3d.SetScalarFunctionNumber(153)
        pl3d.SetVectorFunctionNumber(200)
        pl3d.Update()

        sg = pl3d.GetOutput().GetBlock(0)

        # blue to red lut
        #
        lut = vtk.vtkLookupTable()
        lut.SetHueRange(0.667, 0.0)

        # Computational planes.
        floorComp = vtk.vtkStructuredGridGeometryFilter()
        floorComp.SetExtent(0, 37, 0, 75, 0, 0)
        floorComp.SetInputData(sg)
        floorComp.Update()

        floorMapper = vtk.vtkPolyDataMapper()
        floorMapper.SetInputConnection(floorComp.GetOutputPort())
        floorMapper.ScalarVisibilityOff()
        floorMapper.SetLookupTable(lut)

        floorActor = vtk.vtkActor()
        floorActor.SetMapper(floorMapper)
        floorActor.GetProperty().SetRepresentationToWireframe()
        floorActor.GetProperty().SetColor(colors.GetColor3d("Beige"))
        floorActor.GetProperty().SetLineWidth(2)

        subFloorComp = vtk.vtkStructuredGridGeometryFilter()

        subFloorComp.SetExtent(0, 37, 0, 15, 22, 22)
        subFloorComp.SetInputData(sg)

        subFloorMapper = vtk.vtkPolyDataMapper()
        subFloorMapper.SetInputConnection(subFloorComp.GetOutputPort())
        subFloorMapper.SetLookupTable(lut)
        subFloorMapper.SetScalarRange(sg.GetScalarRange())

        subFloorActor = vtk.vtkActor()

        subFloorActor.SetMapper(subFloorMapper)

        subFloor2Comp = vtk.vtkStructuredGridGeometryFilter()
        subFloor2Comp.SetExtent(0, 37, 60, 75, 22, 22)
        subFloor2Comp.SetInputData(sg)

        subFloor2Mapper = vtk.vtkPolyDataMapper()
        subFloor2Mapper.SetInputConnection(subFloor2Comp.GetOutputPort())
        subFloor2Mapper.SetLookupTable(lut)
        subFloor2Mapper.SetScalarRange(sg.GetScalarRange())

        subFloor2Actor = vtk.vtkActor()

        subFloor2Actor.SetMapper(subFloor2Mapper)

        postComp = vtk.vtkStructuredGridGeometryFilter()
        postComp.SetExtent(10, 10, 0, 75, 0, 37)
        postComp.SetInputData(sg)

        postMapper = vtk.vtkPolyDataMapper()
        postMapper.SetInputConnection(postComp.GetOutputPort())
        postMapper.SetLookupTable(lut)
        postMapper.SetScalarRange(sg.GetScalarRange())

        postActor = vtk.vtkActor()
        postActor.SetMapper(postMapper)
        postActor.GetProperty().SetColor(colors.GetColor3d("Beige"))

        fanComp = vtk.vtkStructuredGridGeometryFilter()
        fanComp.SetExtent(0, 37, 38, 38, 0, 37)
        fanComp.SetInputData(sg)

        fanMapper = vtk.vtkPolyDataMapper()
        fanMapper.SetInputConnection(fanComp.GetOutputPort())
        fanMapper.SetLookupTable(lut)
        fanMapper.SetScalarRange(sg.GetScalarRange())

        fanActor = vtk.vtkActor()

        fanActor.SetMapper(fanMapper)
        fanActor.GetProperty().SetColor(colors.GetColor3d("Beige"))

        # streamers
        #
        # spherical seed points
        rake = vtk.vtkPointSource()
        rake.SetCenter(-0.74, 0, 0.3)
        rake.SetNumberOfPoints(10)

        # a line of seed points
        seedsComp = vtk.vtkStructuredGridGeometryFilter()
        seedsComp.SetExtent(10, 10, 37, 39, 1, 27)
        seedsComp.SetInputData(sg)

        streamers = vtk.vtkStreamTracer()
        streamers.SetInputConnection(pl3d.GetOutputPort())

        # streamers SetSource [rake GetOutput]
        streamers.SetSourceConnection(seedsComp.GetOutputPort())
        streamers.SetMaximumPropagation(250)
        streamers.SetInitialIntegrationStep(.2)
        streamers.SetMinimumIntegrationStep(.01)
        streamers.SetIntegratorType(2)
        streamers.Update()

        tubes = vtk.vtkTubeFilter()
        tubes.SetInputConnection(streamers.GetOutputPort())
        tubes.SetNumberOfSides(8)
        tubes.SetRadius(.08)
        tubes.SetVaryRadius(0)

        mapTubes = vtk.vtkPolyDataMapper()

        mapTubes.SetInputConnection(tubes.GetOutputPort())
        mapTubes.SetScalarRange(sg.GetScalarRange())

        tubesActor = vtk.vtkActor()
        tubesActor.SetMapper(mapTubes)

        # outline
        outline = vtk.vtkStructuredGridOutlineFilter()
        outline.SetInputData(sg)

        outlineMapper = vtk.vtkPolyDataMapper()
        outlineMapper.SetInputConnection(outline.GetOutputPort())

        outlineActor = vtk.vtkActor()
        outlineActor.SetMapper(outlineMapper)
        outlineActor.GetProperty().SetColor(colors.GetColor3d("Beige"))

        # Create graphics stuff.
        ren1 = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren1)

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

        # Add the actors to the renderer, set the background and size.
        #
        ren1.AddActor(outlineActor)
        ren1.AddActor(floorActor)
        # ren1.AddActor(subFloorActor)
        # ren1.AddActor(subFloor2Actor)
        ren1.AddActor(postActor)
        # ren1.AddActor(fanActor)
        ren1.AddActor(tubesActor)

        aCam = vtk.vtkCamera()
        aCam.SetFocalPoint(2.47736, -0.150024, 2.42361)
        aCam.SetPosition(1.57547, -13.4601, 5.47872)
        aCam.SetViewUp(0.00197003, 0.223588, 0.974682)
        #  aCam.Dolly(4.0)
        aCam.SetClippingRange(1, 100)

        ren1.SetBackground(colors.GetColor3d("SlateGray"))
        ren1.SetActiveCamera(aCam)
        renWin.SetSize(640, 480)

        renWin.Render()
        iren.Start()

    def get_program_parameters():
        import argparse
        description = 'Streamtubes created by using the computational grid just in front of the post as a source for seeds.'
        epilogue = '''
       '''
        parser = argparse.ArgumentParser(description=description, epilog=epilogue)
        parser.add_argument('xyz_file', help='postxyz.bin.')
        parser.add_argument('q_file', help='postq.bin.')
        args = parser.parse_args()
        return args.xyz_file, args.q_file

    if __name__ == '__main__':
        main()