#!/usr/bin/python
# -*- coding:Utf-8 -*-

#----------------------------------------------------------------------------------------------------
#	Visualization Final Project : Vector Field analysis
#
# Author : Arthur COSTE
# Creation Date : November 24th, 2012
# Update Date :
# Version : 1
# Status : Working
#
# Purpose : Visulalization and rendering of test vector field 2 
#
#
# call : vtkpython vector_field_test_2.py data_assignment3/TestVec2.vtk data_assignment3/TestMag2.vtk 
#
#----------------------------------------------------------------------------------------------------

import vtk
import sys

# read input vtk file
reader = vtk.vtkStructuredPointsReader()
reader.SetFileName(sys.argv[1])
reader.Update()
Magreader = vtk.vtkStructuredPointsReader()
Magreader.SetFileName(sys.argv[2])
Magreader.Update()

lutLand = vtk.vtkLookupTable()
lutLand.SetNumberOfColors(256)
lutLand.SetHueRange(0.65, 0.5)
lutLand.SetSaturationRange(0.4, 1.0)
lutLand.SetValueRange(0.45, 1.0)
lutLand.Build()

lutArrow = vtk.vtkLookupTable()
lutArrow.SetNumberOfColors(256)
lutArrow.SetHueRange(0.4, 0.6)
lutArrow.SetSaturationRange(0.0, 1.0)
lutArrow.SetValueRange(0.65, 1.0)
lutArrow.Build()

lutSurf = vtk.vtkLookupTable()
lutSurf.SetHueRange(1.0, 1.0)
lutSurf.SetSaturationRange(1.0, 1.0)
lutSurf.SetValueRange(1.0, 1.0)
lutSurf.Build()

cubeOutline = vtk.vtkOutlineFilter()
cubeOutline.SetInput(reader.GetOutput())
cubeMapper = vtk.vtkPolyDataMapper()
cubeMapper.SetInputConnection(cubeOutline.GetOutputPort())

cubeActor = vtk.vtkActor()
cubeActor.SetMapper(cubeMapper)
cubeActor.GetProperty().SetColor(1.0,1.0,1.0)

arrow = vtk.vtkArrowSource()
arrow.SetTipRadius(0.2)
arrow.SetShaftRadius(0.075)
arrow.SetTipResolution (18)
arrow.SetTipLength(1.2)

arrowGlyph = vtk.vtkGlyph3D()
arrowGlyph.SetInputConnection(reader.GetOutputPort())
arrowGlyph.SetSource(arrow.GetOutput())
arrowGlyph.SetScaleFactor(1.80)
arrowGlyph.SetColorModeToColorByScalar()
arrowMapper =  vtk.vtkPolyDataMapper()
arrowMapper.SetInputConnection(arrowGlyph.GetOutputPort())

arrowActor =  vtk.vtkActor()
arrowActor.SetMapper(arrowMapper)
arrowActor.GetProperty().BackfaceCullingOn()

test_contour=vtk.vtkContourFilter ()
test_contour.SetInputConnection(reader.GetOutputPort())
test_contour.SetNumberOfContours(1)
test_contour.SetValue(0,1.0)

v_reader=  vtk.vtkStructuredPointsReader()
v_reader.SetInputConnection(reader.GetOutputPort())

integ=vtk.vtkRungeKutta45()

point_source=vtk.vtkPointSource() 
point_source.SetRadius(10)
point_source.SetCenter (15,15,15)
point_source.SetNumberOfPoints (50)

streamers =  vtk.vtkStreamLine()
streamers.SetIntegrator(integ)
streamers.SetInputConnection(reader.GetOutputPort())
streamers.SetSource(point_source.GetOutput())
streamers.SetMaximumPropagationTime(4.0)
streamers.SetIntegrationDirectionToForward()
streamers.SetMaximumPropagationTime(100)
streamers.SetStepLength(0.2) #smoothness
streamers.SetIntegrationStepLength(0.05)
streamers.SpeedScalarsOn()
streamers.SetTerminalSpeed(0.01)
streamers.SetIntegrationDirectionToIntegrateBothDirections()

streamers2 =  vtk.vtkStreamLine()
#streamers.SetIntegrator(integ)
streamers2.SetInputConnection(reader.GetOutputPort())
streamers2.SetSource(point_source.GetOutput())
streamers2.SetMaximumPropagationTime(4.0)
streamers2.SetIntegrationDirectionToForward()
streamers2.SetMaximumPropagationTime(100)
streamers2.SetStepLength(6) #smoothness
streamers2.SetIntegrationStepLength(0.05)
streamers2.SpeedScalarsOn()
streamers2.SetTerminalSpeed(0.01)
streamers2.SetIntegrationDirectionToIntegrateBothDirections()

vtkTubeFilter = vtk.vtkTubeFilter()
vtkTubeFilter.SetInputConnection(streamers.GetOutputPort())
vtkTubeFilter.SetRadius(0.10)
vtkTubeFilter.SetNumberOfSides(32)
vtkTubeFilter.CappingOn()

Glyph = vtk.vtkGlyph3D()
Glyph.SetInputConnection(streamers2.GetOutputPort())
Glyph.SetSource(arrow.GetOutput())
Glyph.SetVectorModeToUseVector()
Glyph.SetScaleFactor(1.2)
Glyph.SetColorModeToColorByScalar()

GlyphMapper =  vtk.vtkPolyDataMapper()
GlyphMapper.SetInputConnection(Glyph.GetOutputPort())
GlyphMapper.SetLookupTable(lutLand)
GlyphMapper.ScalarVisibilityOn()
GlyphMapper.SetScalarRange(Magreader.GetOutput().GetScalarRange())

GlyphActor =  vtk.vtkActor()
GlyphActor.SetMapper(GlyphMapper)

streamMapper =  vtk.vtkPolyDataMapper()
streamMapper.SetInputConnection(vtkTubeFilter.GetOutputPort())
streamMapper.SetScalarRange(Magreader.GetOutput().GetScalarRange())
streamMapper.SetLookupTable(lutArrow)

streamActor =  vtk.vtkActor()
streamActor.SetMapper(streamMapper)

contours = vtk.vtkContourFilter()
contours.SetInputConnection(Magreader.GetOutputPort())
contours.GenerateValues(2, 0.2,1.3)
contours.SetComputeNormals(1)

contMapper = vtk.vtkPolyDataMapper()
contMapper.SetInputConnection(contours.GetOutputPort())

contMapper.SetScalarRange(lutLand.GetTableRange())
#contMapper.SetLookupTable(lutSurf)

contActor = vtk.vtkActor()
contActor.SetMapper(contMapper)
contActor.GetProperty().SetDiffuseColor (1.0, 1.0, 1.0)
contActor.GetProperty().SetSpecular(1.0)
contActor.GetProperty().SetSpecularPower(8)
#contActor.GetProperty().SetOpacity (0.95)

#Create the renderer, render window, and interactor.
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Set the background color to white. Associate the actors with the
# renderer.
ren.SetBackground(0, 0, 0)
ren.AddActor(GlyphActor)
#ren.AddActor(cubeActor)
ren.AddActor(streamActor)
#ren.AddActor(contActor)
renWin.SetSize(600, 600)
 
# Zoom in a little bit.
ren.ResetCamera()
ren.GetActiveCamera().Zoom(1.4)

#Initialize and start the event loop.
iren.Initialize()
renWin.Render()
iren.Start()

