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

#----------------------------------------------------------------------------------------------------
#	Visualization Final Project : Vector Field analysis
#
# Author : Arthur COSTE
# Creation Date : November 17th, 2012
# Update Date :
# Version : 1
# Status : Working
#
# Purpose : Visulalization and rendering of test vector field 1
#
#
# call : vtkpython vector_field_test_1.py data_assignment3/TestVec1.vtk data_assignment3/TestMag1.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.6, 1.0)
lutArrow.SetSaturationRange(0.4, 0.8)
lutArrow.SetValueRange(0.45, 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.3)
arrow.SetShaftRadius(0.075)

arrowGlyph = vtk.vtkGlyph3D()
arrowGlyph.SetInputConnection(reader.GetOutputPort())
arrowGlyph.SetSource(arrow.GetOutput())
arrowGlyph.SetScaleFactor(0.25)
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.vtkRungeKutta4()

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

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(1.5) #smoothness
streamers.SetIntegrationStepLength(0.05)
streamers.SpeedScalarsOn()
streamers.SetTerminalSpeed(0.01)
streamers.SetIntegrationDirectionToIntegrateBothDirections()

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

Glyph = vtk.vtkGlyph3D()
Glyph.SetInputConnection(streamers.GetOutputPort())
Glyph.SetSource(arrow.GetOutput())
Glyph.SetVectorModeToUseVector()
Glyph.SetScaleFactor(0.5)
Glyph.SetColorModeToColorByScalar()

GlyphMapper =  vtk.vtkPolyDataMapper()
GlyphMapper.SetInputConnection(Glyph.GetOutputPort())
GlyphMapper.SetLookupTable(lutArrow)
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(lutLand)

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

contours = vtk.vtkContourFilter()
contours.SetInputConnection(Magreader.GetOutputPort())
contours.GenerateValues(2, 0.8,3.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.5)

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

