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

#----------------------------------------------------------------------------------------------------
#	Visualization Final Project : Vector Field analysis
#
# Author : Arthur COSTE
# Creation Date : November 28th, 2012
# Update Date :
# Version : 1
# Status : Working
#
# Purpose : Visulalization and rendering of test vector field 0 
#
#
# call : vtkpython vector_field_chal_0.py data_assignment3/ChalVec0.vtk data_assignment3/ChalMag0.vtk 
#
#----------------------------------------------------------------------------------------------------

import vtk
import sys

critical_pts = [25.5,15,19.5,17,18,24,17.5,24.5,13.5,40,26,31]
offset = 6
print critical_pts

# 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.3, 0.0)
lutLand.SetValueRange(0.75, 1.0)
lutLand.Build()

lut_2 = vtk.vtkLookupTable()
lut_2.SetNumberOfColors(256)
lut_2.SetHueRange(0.45, 0.3)
lut_2.SetSaturationRange(0.7, 0.9)
lut_2.SetValueRange(0.75, 1.0)
lut_2.Build()

lut_3 = vtk.vtkLookupTable()
lut_3.SetNumberOfColors(256)
lut_3.SetHueRange(0.35, 0.2)
lut_3.SetSaturationRange(0.5, 0.7)
lut_3.SetValueRange(0.75, 1.0)
lut_3.Build()

lut_4 = vtk.vtkLookupTable()
lut_4.SetNumberOfColors(256)
lut_4.SetHueRange(0.1, 0.2)
lut_4.SetSaturationRange(0.3, 0.5)
lut_4.SetValueRange(0.75, 1.0)
lut_4.Build()

lutArrow = vtk.vtkLookupTable()
lutArrow.SetNumberOfColors(256)
lutArrow.SetHueRange(0.0, 0.1)
lutArrow.SetSaturationRange(0.5, 1.0)
lutArrow.SetValueRange(0.65, 1.0)
lutArrow.SetAlphaRange(0.95, 0.95)
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(.4)

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

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

integ=vtk.vtkRungeKutta45()

chosen_pt = 0
point_source=vtk.vtkPointSource() 
point_source.SetRadius(6)
point_source.SetCenter (critical_pts[(chosen_pt)*3+0],critical_pts[(chosen_pt)*3+1],critical_pts[(chosen_pt)*3+2])
point_source.SetNumberOfPoints (60)

chosen_pt = 1
point_source_2=vtk.vtkPointSource() 
point_source_2.SetRadius(6)
point_source_2.SetCenter (critical_pts[(chosen_pt)*3+0],critical_pts[(chosen_pt)*3+1],critical_pts[(chosen_pt)*3+2])
point_source_2.SetNumberOfPoints (60)

chosen_pt = 2
point_source_3=vtk.vtkPointSource() 
point_source_3.SetRadius(6)
point_source_3.SetCenter (critical_pts[(chosen_pt)*3+0],critical_pts[(chosen_pt)*3+1],critical_pts[(chosen_pt)*3+2])
point_source_3.SetNumberOfPoints (60)

chosen_pt = 3
point_source_4=vtk.vtkPointSource() 
point_source_4.SetRadius(6)
point_source_4.SetCenter (critical_pts[(chosen_pt)*3+0],critical_pts[(chosen_pt)*3+1],critical_pts[(chosen_pt)*3+2])
point_source_4.SetNumberOfPoints (60)

extract = vtk.vtkExtractVOI()
extract.SetInputConnection(reader.GetOutputPort())
extract.SetVOI(critical_pts[(chosen_pt)*3+0]-offset,critical_pts[(chosen_pt)*3+0]+offset,critical_pts[(chosen_pt)*3+1]-offset,critical_pts[(chosen_pt)*3+1]+offset,critical_pts[(chosen_pt)*3+2]-offset,critical_pts[(chosen_pt)*3+2]+offset)

streamers =  vtk.vtkStreamLine()
streamers.SetIntegrator(integ)
streamers.SetInputConnection(reader.GetOutputPort())
streamers.SetSource(point_source.GetOutput())
#streamers.SetIntegrationDirectionToForward()
streamers.SetMaximumPropagationTime(8)
streamers.SetStepLength(2) #smoothness
streamers.SetIntegrationStepLength(1)
streamers.SpeedScalarsOn()
streamers.SetTerminalSpeed(0.01)
streamers.SetIntegrationDirectionToIntegrateBothDirections()

Magextract = vtk.vtkExtractVOI()
Magextract.SetInputConnection(Magreader.GetOutputPort())
Magextract.SetVOI(critical_pts[(chosen_pt)*3+0]-offset,critical_pts[(chosen_pt)*3+0]+offset,critical_pts[(chosen_pt)*3+1]-offset,critical_pts[(chosen_pt)*3+1]+offset,critical_pts[(chosen_pt)*3+2]-offset,critical_pts[(chosen_pt)*3+2]+offset)

streamers_2 =  vtk.vtkStreamLine()
streamers_2.SetIntegrator(integ)
streamers_2.SetInputConnection(reader.GetOutputPort())
streamers_2.SetSource(point_source_2.GetOutput())
streamers_2.SetMaximumPropagationTime(8)
#streamers2.SetIntegrationDirectionToForward()
streamers_2.SetStepLength(0.8) #smoothness
streamers_2.SetIntegrationStepLength(0.2)
streamers_2.SpeedScalarsOn()
streamers_2.SetTerminalSpeed(0.01)
streamers_2.SetIntegrationDirectionToIntegrateBothDirections()

streamers_3 =  vtk.vtkStreamLine()
streamers_3.SetIntegrator(integ)
streamers_3.SetInputConnection(reader.GetOutputPort())
streamers_3.SetSource(point_source_3.GetOutput())
streamers_3.SetMaximumPropagationTime(8)
#streamers2.SetIntegrationDirectionToForward()
streamers_3.SetStepLength(0.8) #smoothness
streamers_3.SetIntegrationStepLength(0.2)
streamers_3.SpeedScalarsOn()
streamers_3.SetTerminalSpeed(0.01)
streamers_3.SetIntegrationDirectionToIntegrateBothDirections()

streamers_4 =  vtk.vtkStreamLine()
streamers_4.SetIntegrator(integ)
streamers_4.SetInputConnection(reader.GetOutputPort())
streamers_4.SetSource(point_source_4.GetOutput())
streamers_4.SetMaximumPropagationTime(8)
#streamers2.SetIntegrationDirectionToForward()
streamers_4.SetStepLength(0.8) #smoothness
streamers_4.SetIntegrationStepLength(0.2)
streamers_4.SpeedScalarsOn()
streamers_4.SetTerminalSpeed(0.01)
streamers_4.SetIntegrationDirectionToIntegrateBothDirections()

a_streamers_1 =  vtk.vtkStreamLine()
a_streamers_1.SetIntegrator(integ)
a_streamers_1.SetInputConnection(reader.GetOutputPort())
a_streamers_1.SetSource(point_source.GetOutput())
a_streamers_1.SetMaximumPropagationTime(250)
#streamers2.SetIntegrationDirectionToForward()
a_streamers_1.SetStepLength(2) #smoothness
a_streamers_1.SetIntegrationStepLength(1)
a_streamers_1.SpeedScalarsOn()
a_streamers_1.SetTerminalSpeed(0.1)
a_streamers_1.SetIntegrationDirectionToIntegrateBothDirections()

a_streamers_2 =  vtk.vtkStreamLine()
a_streamers_2.SetIntegrator(integ)
a_streamers_2.SetInputConnection(reader.GetOutputPort())
a_streamers_2.SetSource(point_source_2.GetOutput())
a_streamers_2.SetMaximumPropagationTime(250)
#streamers2.SetIntegrationDirectionToForward()
a_streamers_2.SetStepLength(2) #smoothness
a_streamers_2.SetIntegrationStepLength(1)
a_streamers_2.SpeedScalarsOn()
a_streamers_2.SetTerminalSpeed(0.1)
a_streamers_2.SetIntegrationDirectionToIntegrateBothDirections()

a_streamers_3 =  vtk.vtkStreamLine()
a_streamers_3.SetIntegrator(integ)
a_streamers_3.SetInputConnection(reader.GetOutputPort())
a_streamers_3.SetSource(point_source_3.GetOutput())
a_streamers_3.SetMaximumPropagationTime(250)
#streamers2.SetIntegrationDirectionToForward()
a_streamers_3.SetStepLength(2) #smoothness
a_streamers_3.SetIntegrationStepLength(1)
a_streamers_3.SpeedScalarsOn()
a_streamers_3.SetTerminalSpeed(0.1)
a_streamers_3.SetIntegrationDirectionToIntegrateBothDirections()

a_streamers_4 =  vtk.vtkStreamLine()
a_streamers_4.SetIntegrator(integ)
a_streamers_4.SetInputConnection(reader.GetOutputPort())
a_streamers_4.SetSource(point_source_4.GetOutput())
a_streamers_4.SetMaximumPropagationTime(250)
#streamers2.SetIntegrationDirectionToForward()
a_streamers_4.SetStepLength(2) #smoothness
a_streamers_4.SetIntegrationStepLength(1)
a_streamers_4.SpeedScalarsOn()
a_streamers_4.SetTerminalSpeed(0.1)
a_streamers_4.SetIntegrationDirectionToIntegrateBothDirections()

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

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

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

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

Glyph = vtk.vtkGlyph3D()
Glyph.SetInputConnection(a_streamers_1.GetOutputPort())
Glyph.SetSource(arrow.GetOutput())
#Glyph.SetVectorModeToUseVector()
Glyph.SetScaleFactor(0.75)
Glyph.SetColorModeToColorByScalar()

Glyph_2 = vtk.vtkGlyph3D()
Glyph_2.SetInputConnection(a_streamers_2.GetOutputPort())
Glyph_2.SetSource(arrow.GetOutput())
#Glyph.SetVectorModeToUseVector()
Glyph_2.SetScaleFactor(0.75)
Glyph_2.SetColorModeToColorByScalar()

Glyph_3 = vtk.vtkGlyph3D()
Glyph_3.SetInputConnection(a_streamers_3.GetOutputPort())
Glyph_3.SetSource(arrow.GetOutput())
#Glyph.SetVectorModeToUseVector()
Glyph_3.SetScaleFactor(0.75)
Glyph_3.SetColorModeToColorByScalar()

Glyph_4 = vtk.vtkGlyph3D()
Glyph_4.SetInputConnection(a_streamers_4.GetOutputPort())
Glyph_4.SetSource(arrow.GetOutput())
#Glyph.SetVectorModeToUseVector()
Glyph_4.SetScaleFactor(0.75)
Glyph_4.SetColorModeToColorByScalar()

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

GlyphMapper_2 =  vtk.vtkPolyDataMapper()
GlyphMapper_2.SetInputConnection(Glyph_2.GetOutputPort())
GlyphMapper_2.SetLookupTable(lut_2)
GlyphMapper_2.ScalarVisibilityOn()
GlyphMapper_2.SetScalarRange(Magreader.GetOutput().GetScalarRange())

GlyphMapper_3 =  vtk.vtkPolyDataMapper()
GlyphMapper_3.SetInputConnection(Glyph_3.GetOutputPort())
GlyphMapper_3.SetLookupTable(lut_3)
GlyphMapper_3.ScalarVisibilityOn()
GlyphMapper_3.SetScalarRange(Magreader.GetOutput().GetScalarRange())

GlyphMapper_4 =  vtk.vtkPolyDataMapper()
GlyphMapper_4.SetInputConnection(Glyph_4.GetOutputPort())
GlyphMapper_4.SetLookupTable(lut_4)
GlyphMapper_4.ScalarVisibilityOn()
GlyphMapper_4.SetScalarRange(Magreader.GetOutput().GetScalarRange())

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

GlyphActor_2 =  vtk.vtkActor()
GlyphActor_2.SetMapper(GlyphMapper_2)

GlyphActor_3 =  vtk.vtkActor()
GlyphActor_3.SetMapper(GlyphMapper_3)

GlyphActor_4 =  vtk.vtkActor()
GlyphActor_4.SetMapper(GlyphMapper_4)

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

streamMapper_2 =  vtk.vtkPolyDataMapper()
streamMapper_2.SetInputConnection(vtkTubeFilter_2.GetOutputPort())
streamMapper_2.SetScalarRange(Magreader.GetOutput().GetScalarRange())
streamMapper_2.SetLookupTable(lut_2)

streamMapper_3 =  vtk.vtkPolyDataMapper()
streamMapper_3.SetInputConnection(vtkTubeFilter_3.GetOutputPort())
streamMapper_3.SetScalarRange(Magreader.GetOutput().GetScalarRange())
streamMapper_3.SetLookupTable(lut_3)

streamMapper_4 =  vtk.vtkPolyDataMapper()
streamMapper_4.SetInputConnection(vtkTubeFilter_4.GetOutputPort())
streamMapper_4.SetScalarRange(Magreader.GetOutput().GetScalarRange())
streamMapper_4.SetLookupTable(lut_4)

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

streamActor_2 =  vtk.vtkActor()
streamActor_2.SetMapper(streamMapper_2)

streamActor_3 =  vtk.vtkActor()
streamActor_3.SetMapper(streamMapper_3)

streamActor_4 =  vtk.vtkActor()
streamActor_4.SetMapper(streamMapper_4)

contours = vtk.vtkContourFilter()
contours.SetInputConnection(Magextract.GetOutputPort())
contours.GenerateValues(5, 0.2,6.9)
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(GlyphActor_2)
ren.AddActor(GlyphActor_3)
ren.AddActor(GlyphActor_4)
ren.AddActor(cubeActor)
ren.AddActor(streamActor)
ren.AddActor(streamActor_2)
ren.AddActor(streamActor_3)
ren.AddActor(streamActor_4)
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()

