Option Explicit 'Script written by Marcelo Coelho based on Scott Greenwald's part specification 'Contact info: marcelo (at) media (dot) mit (dot) edu 'Script copyrighted by MIT Media Lab 'May 18, 2009 Call Main() Sub Main() Dim sphereSize, center, arrPlane, partSize sphereSize = 0.032 ' radius partSize = 0.150' radius arrPlane = Rhino.WorldXYPlane Dim circle, pegHeight, pegExtGuide, circleExt, peg pegHeight = 0.1 Dim pX, pY, pZ, puncher, puncherBody, puncherBodyNeg, puncherNeg, puncherNegAlign pX = 2 'length pY = 1 'width pZ = 0.4 'height Dim punchTolerance, circleNeg, circleExtNeg, pegNeg punchTolerance = 0.001 Dim alignHole, alignCircle1, alignCircle2, alignHole1, alignHole2, alignCylinder1, alignCylinder2, alignPart alignHole = 0.158 Dim outerCylinder, innerCylinder, disc ' POSITIVE PUNCHER PART '////////////////////// Rhino.AddLayer "puncher positive", RGB(100,100,110), 0 Rhino.CurrentLayer "puncher positive" ' draw outer and inner cylinder outerCylinder = Rhino.AddCylinder(Array(pX/4,0,0), Array(pX/4,0,pegHeight), partSize) innerCylinder = Rhino.AddCylinder(Array(pX/4,0,0), Array(pX/4,0,pegHeight), sphereSize) ' boolean difference to make disc disc = Rhino.BooleanDifference (Array(outerCylinder), Array(innerCylinder)) disc = Rhino.FirstObject ' add puncher body puncherBody = Rhino.AddBox (Array(_ Array(-pX/2,-pY/2,-pZ),_ Array(pX/2,-pY/2,-pZ),_ Array(pX/2,pY/2,-pZ),_ Array(-pX/2,pY/2,-pZ),_ Array(-pX/2,-pY/2,0),_ Array(pX/2,-pY/2,0),_ Array(pX/2,pY/2,0),_ Array(-pX/2,pY/2,0))) ' add disc to part Rhino.BooleanUnion Array(puncherBody,disc) puncher = Rhino.FirstObject ' NEGATIVE PUNCHER PART '////////////////////// Rhino.AddLayer "puncher negative", RGB(255,255,255), 0 Rhino.CurrentLayer "puncher negative" ' draw outer and inner cylinder for negative part outerCylinder = Rhino.AddCylinder(Array(pX/4,0,0), Array(pX/4,0,pegHeight), partSize+punchTolerance) innerCylinder = Rhino.AddCylinder(Array(pX/4,0,0), Array(pX/4,0,pegHeight), sphereSize-punchTolerance) ' boolean difference to make disc disc = Rhino.BooleanDifference (Array(outerCylinder), Array(innerCylinder)) disc = Rhino.FirstObject ' add negative puncher body puncherBodyNeg = Rhino.AddBox (Array(_ Array(-pX/2,-pY/2,0),_ Array(pX/2,-pY/2,0),_ Array(pX/2,pY/2,0),_ Array(-pX/2,pY/2,0),_ Array(-pX/2,-pY/2,pZ),_ Array(pX/2,-pY/2,pZ),_ Array(pX/2,pY/2,pZ),_ Array(-pX/2,pY/2,pZ))) ' remove peg and then make puncherNeg = the last object used Rhino.BooleanDifference Array(puncherBodyNeg), Array(disc) puncherNeg = Rhino.FirstObject ' DRAW ALIGNMENT SUPPORT AND HOLES '////////////////////// ' part used to align punchers alignPart = Rhino.AddBox (Array(_ Array(-pX/2,-pY/2,pZ),_ Array(0,-pY/2,pZ),_ Array(0,pY/2,pZ),_ Array(-pX/2,pY/2,pZ),_ Array(-pX/2,-pY/2,pZ*2),_ Array(0,-pY/2,pZ*2),_ Array(0,pY/2,pZ*2),_ Array(-pX/2,pY/2,pZ*2))) ' draw alignment cylinders alignCylinder1 = Rhino.AddCylinder(Array(0,0,0), Array(0,0,pZ*3), alignHole/2) alignCylinder2 = Rhino.AddCylinder(Array(0,0,0), Array(0,0,pZ*3), alignHole/2) ' move to the right place Rhino.MoveObject alignCylinder1, Array(0,0,0), Array(-pX/4,-pY/4,-pZ) Rhino.MoveObject alignCylinder2, Array(0,0,0), Array(-pX/4,pY/4,-pZ) ' subtract alignment holes from both parts Rhino.BooleanDifference Array(puncher,puncherNeg,alignPart),Array(alignCylinder1,alignCylinder2) End Sub