#!/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])