from tvtk.api import tvtk
from tvtk.api import colors


# import myVTK

# Make Stl and TransformStl are the same as the ones in MyVTK
# Show is similar but reconfigured to produce the desired view of the stls.

def MakeStl(renderer, file, color=colors.grey, opacity=1.0, edgeColor=None, representation=None):
	"""Draws stl file with color and opacity,
	 returns PolyData"""
	stl = tvtk.STLReader(file_name=file)
	stlNormals = tvtk.PolyDataNormals(input_connection=stl.output_port)
	stlMapper = tvtk.PolyDataMapper(input_connection=stlNormals.output_port)
	stlProp = tvtk.Property(color=color, opacity=opacity)
	if edgeColor:
		stlProp.edge_color=edgeColor
		stlProp.edge_visibility=True
	if representation:	stlProp.representation=representation
	stlActor = tvtk.Actor(mapper=stlMapper, property=stlProp)
	renderer.add_actor(stlActor)
	return stlNormals.output

def TransformStl(renderer, file, color=colors.grey, opacity=1, displace=(0,0,0), size=(1,1,1), edgeColor=None, representation=None):
	"""Draws displaced, scaled stl file"""
	stl = tvtk.STLReader(file_name=file)
	transStl = tvtk.Transform()
	transStl.translate(displace)
	transStl.scale(size[0], size[1], size[2])
	transFilter = tvtk.TransformPolyDataFilter(input_connection=stl.output_port, transform=transStl)
	stlNormals = tvtk.PolyDataNormals(input_connection=transFilter.output_port)
	stlMapper = tvtk.PolyDataMapper(input_connection=stlNormals.output_port)
	stlProp = tvtk.Property(color=color, opacity=opacity)
	if edgeColor:
		stlProp.edge_color=edgeColor
		stlProp.edge_visibility=True
	if representation:	stlProp.representation=representation
	stlActor = tvtk.Actor(mapper=stlMapper, property=stlProp)
	renderer.add_actor(stlActor)

def Show(renderer, width=800, height=800, title=None, pan=(-8,-68,2.5), PNG=None):
	"""	Takes vtkRenderer instance and returns an IPython Image with the rendering.	"""
	import os
	import inspect
	renWin = tvtk.RenderWindow(size=(width, height))
	renWin.add_renderer(renderer)
	iren = tvtk.RenderWindowInteractor(render_window=renWin)
	#
	# Reset camera and viewing area
	renderer.reset_camera()
	cam = renderer.active_camera
	cam.azimuth  (pan[0])  	# rotate about horizontal
	cam.elevation(pan[1])	# rotate about vertical
	cam.dolly    (pan[2])	# zoom
	#
	renderer.reset_camera_clipping_range()
	#
	renWin.render()
	if title:	renWin.window_name = title
	else:		renWin.window_name = os.path.basename(inspect.stack()[1][1]).replace('.py', '')
	#
	if PNG:		# make screenshot if file given
		winImg = tvtk.WindowToImageFilter(input=renWin)
		winImg.update()
		outImg = tvtk.PNGWriter(file_name=PNG, input_connection=winImg.output_port )
		outImg.write()
		print 'Wrote image file ', PNG
	#
	iren.initialize()
	iren.start()



ACL = '/home/landisb/PycharmProjects/Data/AssemblyModels/Meshes/OpenKnee/Refined/ACL.stl'
# ACL = '/home/landisb/PycharmProjects/Data/AssemblyModels/BasicTie/Refined/ACL_Remaining_Faces.stl'
femur = '/home/landisb/PycharmProjects/Data/AssemblyModels/BasicTie/Refined/StlsForPictures/Femur_Remaining_Faces.stl'

tibia = '/home/landisb/PycharmProjects/Data/AssemblyModels/BasicTie/Refined/StlsForPictures/Tibia_Remaining_Faces.stl'

tibiaTie = '/home/landisb/PycharmProjects/Data/AssemblyModels/BasicTie/Refined/StlsForPictures/Tibia_@_ACL_TiesFaces.stl'
femurTie = '/home/landisb/PycharmProjects/Data/AssemblyModels/BasicTie/Refined/StlsForPictures/Femur_@_ACL_TiesFaces.stl'

ren = tvtk.Renderer(background=colors.white)

# Get actors for stls
f = 11
t = -6.5
TransformStl(ren, femur,    colors.white, opacity=1, displace=(0,0,f))
TransformStl(ren, femurTie, colors.green, opacity=1, displace=(0,0,f), edgeColor=colors.white)

TransformStl(ren, tibia,    colors.white, opacity=1, displace=(0,0,t))
TransformStl(ren, tibiaTie, colors.blue,  opacity=1, displace=(0,0,t), edgeColor=colors.white)

MakeStl(ren, ACL, colors.pink_light, opacity=1)
Show(ren, PNG='/home/landisb/multis/studies/Assembly/doc/Figures/BasicTies_automatedGroups.png')



