#!/usr/bin/env python
from __future__ import division
#import numpy as np
import rhinoscriptsyntax as rs
from math import *

red = [1,0,0]
green = [0,1,0]
blue = [0,0,1]
cyan = [1,1,0]
magenta = [1,0,1]
yellow = [0,1,1]

def SetupLayers():
	rs.AddLayer ("cut", magenta)
	rs.AddLayer ("mountain", red)
	rs.AddLayer ("valley", blue)

def normalized_and_norm(v):
	l=0
	for x in [x**2 for x in v]: l+=x
	l = sqrt(l)
	return [x/l for x in v], l

#stands for stupid multiplication
def sm(s,v):
	return [s*x for x in v]

#stands for stupid sum
def ss(v1,v2):
	return [x+y for x,y in zip(v1,v2)]

#stands for stupid rot
def srot(v,th):
	return [cos(th)*v[0]+sin(th)*v[1],-sin(th)*v[0]+cos(th)*v[1],0]

#stands for stupid interp
def si(v1,v2,t):
	return ss( sm(t,v1), sm(1-t,v2) )

def AddNotch(d=[0,1,0],l=.25,loc=[0,0,0],thickness=.158,chamfer=.05):
	p = srot(d,pi/2)
	points = []
	points.append( sm(-.5*thickness-chamfer,p) )
	points.append( ss(sm(-.5*thickness,p),sm(chamfer,d)) )

	points.append( ss(sm(-.5*thickness,p), sm(l,d )) )
	points.append( ss(sm(.5*thickness,p), sm(l,d)) )
	points.append( ss(sm(.5*thickness,p), sm(chamfer,d)) )
	points.append( sm(.5*thickness+chamfer,p) )

	points = [ss(x,loc) for x in points]
	for i in range(len(points)-1):
		rs.AddLine(points[i],points[i+1])

def BirdBase(radius=4.25, notchDepth=.158, thickness=.158, chamfer=.05,center=[0,0,0]):
#	center = rs.GetPoint("center of pattern")
#	xform = rs.XformTranslation(center)	
	n = rs.GetInteger("number of sides")
	perp = radius*cos(pi/n)
	cut_radius = rs.GetReal("Trimmed Radius")
	objs = []
	for i in range(n):
		t = 2*pi*i/n
		a = [radius*cos(t-pi/n),radius*sin(t-pi/n),0]
		b = [radius*cos(t+pi/n),radius*sin(t+pi/n),0]
		c = [.5*perp*cos(t),.5*perp*sin(t),0]
		d = [perp*cos(t),perp*sin(t),0]


		rs.CurrentLayer("cut")
		rs.AddLine(a,b) 
		rs.AddCircle(c,cut_radius) 

		AddNotch(sm(-1/perp,d), notchDepth, si(a,b,.333), thickness, chamfer)
		AddNotch(sm(-1/perp,d), notchDepth, si(a,b,.666), thickness, chamfer)

		rs.CurrentLayer("mountain") 
		rs.AddLine(a,c) 
		rs.AddLine(c,b) 
		rs.AddLine(center,c) 

		rs.CurrentLayer("valley")
		rs.AddLine(c,d) 
		rs.AddLine(center,b) 
	rs.CurrentLayer("cut")
	rs.AddCircle(center,cut_radius)

def WaterbombBase():
	center = [0,0,0]
	n = rs.GetInteger("number of sides")
	radius = 4.25
	perp = radius*cos(pi/n)
	cut_radius = rs.GetReal("Trimmed Radius")
	objs = []
	for i in range(n):
		t = 2*pi*i/n
		a = [radius*cos(t-pi/n),radius*sin(t-pi/n),0]
#		a = radius*np.asarray([cos(t-pi/n),sin(t-pi/n)])
		b = [radius*cos(t+pi/n),radius*sin(t+pi/n),0]
#		b = radius*np.asarray([cos(t+pi/n),sin(t+pi/n)])
		d = [perp*cos(t),perp*sin(t),0]
		rs.CurrentLayer("cut")
		rs.AddLine(a,b) 
		rs.CurrentLayer("mountain") 
		rs.AddLine(a,center) 
		rs.CurrentLayer("valley")
		rs.AddLine(center,d) 
	rs.CurrentLayer("cut")
	rs.AddCircle(center,cut_radius)

def MakeAngleKey(radius, th, notchDepth, thickness, chamfer, center=[0,0,0]):
	rs.AddCircle(center,radius)
	p1 = ss(center, [radius,0,0])
	p2 = ss(center, [radius*cos(th), radius*sin(th),0])
	AddNotch(ss(center,sm(-1,p1)), notchDepth, p1, thickness, chamfer)
	AddNotch(ss(center,sm(-1,p2)), notchDepth, p2, thickness, chamfer)

def MakeParallelKey(radius, notchDepth, thickness, chamfer, center=[0,0,0]):
	p = [[notchDepth,-radius,0],[notchDepth,radius,0], [-notchDepth,radius,0], [-notchDepth,-radius,0]]
	p = [ss(x,center) for x in p]
	for i in range(4): rs.AddLine(p[i],p[(i+1)%4])
	AddNotch([-1,0,0],notchDepth, ss(center,[notchDepth,0,0]),thickness,chamfer) 

def MakeTwoSidedKey(radius,  notchDepth, thickness, chamfer, center=[0,0,0]):
	p = [[2*notchDepth,-radius,0],[2*notchDepth,radius,0], [-2*notchDepth,radius,0], [-2*notchDepth,-radius,0]]
	p = [ss(x,center) for x in p]
	for i in range(4): rs.AddLine(p[i],p[(i+1)%4])
	AddNotch([-1,0,0],notchDepth, ss(center,[2*notchDepth,0,0]),thickness,chamfer) 
	AddNotch([1,0,0],notchDepth, ss(center,[-2*notchDepth,0,0]),thickness,chamfer) 

if __name__ == '__main__':
	radius = 4.25
	notchDepth = .5
	thickness = .158
	chamfer = .05
	sep = .05
	SetupLayers()
	#BirdBase(radius, notchDepth, thickness, chamfer)
	#y = 0
	#for th in [pi, pi-pi/12,pi-pi/6, pi-pi/4, pi-pi/3]:
	#	MakeAngleKey(2*notchDepth, th, notchDepth, thickness, chamfer, [radius+2*notchDepth+sep,(y-2)*(4*notchDepth+sep),0])
	#	y = y+1
	#for i in range(8):
	#	MakeParallelKey(notchDepth, notchDepth, 2*thickness, chamfer, [radius+5*notchDepth+2*sep,(i-4)*(2*notchDepth+sep),0])
	MakeTwoSidedKey(2*thickness, notchDepth, thickness, chamfer, [0,0,0])
