Option Explicit 'Script written by Luis Quinones 'Script copyrighted by YOUR ROBOT MOM 'Script version Sunday, January 31, 2010 10:01:33 PM Call Main() Sub Main() '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 'select test curve Dim strCurve Dim i Dim arrPoints, arrPoint Dim arrBaseC() Dim arrPTsA() Dim arrPTsB() Dim arrPTsC() Dim arrPTsD() Dim arrPTsE() Dim arrPTsF() Dim dblPosX,dblPosY,dblPosZ Dim count Dim intFactorA Dim dblCurveParam,arrData,arrTangent,arrNewPoint Dim dblRad '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// intFactorA = 72 intFactorA = 72/intFactorA dblRad = .25 strCurve = Rhino.GetObject("Select Robot Poop Line",4) If Rhino.IsCurve(strCurve) Then Dim curvEnd : curvEnd = Rhino.CurveEndPoint(strCurve) Dim Robot : Robot = rhino.addtextdot("ROBOT WEAVE",curvEnd) Call Rhino.TextDotText(Robot,"ROBOT MATERIAL WEAVE") Dim curvStart : curvStart = Rhino.CurveStartPoint(strCurve) Dim Robot2 : Robot2 = rhino.addtextdot("ROBOT WEAVE_StepValue["& intFactorA & "]",curvStart) 'Call Rhino.TextDotText(Robot2,"Weave_Error Fix Mode") 'extract the curve points arrPoints = Rhino.DivideCurve(strCurve,100) If IsArray(arrPoints) Then Dim intStep : intStep = intFactorA Dim intOffset : intOffset = intStep/(intStep*50) Dim dblConv : dblConv = 0.0174532925 For i = 0 To 20 Step intStep Dim dblRadius : dblRadius = i*3 count = 0 For Each arrPoint In arrPoints If IsArray(arrPoint) Then dblCurveParam = Rhino.CurveClosestPoint(strCurve, arrPoint) If IsNumeric(dblCurveParam) Then arrData = Rhino.CurveCurvature(strCurve, dblCurveParam) If IsArray(arrData) Then arrTangent = arrData(1) arrNewPoint = array((arrPoint(0)+arrTangent(0)),(arrPoint(1)+arrTangent(1)),(arrPoint(2)+arrTangent(2))) End If End If End If ReDim Preserve arrBaseC(count) ReDim Preserve arrPTsA(count) ReDim Preserve arrPTsB(count) ReDim Preserve arrPTsC(count) ReDim Preserve arrPTsD(count) ReDim Preserve arrPTsE(count) ReDim Preserve arrPTsF(count) 'reference (x.y.z) values dblPosX = arrNewPoint(0) dblPosY = arrNewPoint(1) dblPosZ = arrNewPoint(2) 'returns the remainder of a division operation. For example, 5%2 equals 1 because dividing 5 by 2 gives 2 and the remainder is 1, which is the value returned from this expression. If count Mod 2 = 0 Then '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// arrBaseC(count) = PointCoordinates(Rhino.AddPoint(array(dblPosX,dblPosY,dblPosZ))) arrPTsC(count) = PointCoordinates(Rhino.AddPoint(array(cos((i+intOffset)*count*dblConv)*dblRadius+dblPosX, dblPosY, (sin((i+intOffset)*count*dblConv)*dblRadius)*-1+dblPosZ))) arrPTsD(count) = PointCoordinates(Rhino.AddPoint(array(sin((i-intOffset)*count*dblConv)*dblRadius+dblPosX, dblPosY, (cos((i-intOffset)*count*dblConv)*dblRadius)*-1+dblPosZ))) Call Rhino.AddLine( arrPTsC(count), arrBaseC(count)) Else arrBaseC(count) = PointCoordinates(Rhino.AddPoint(array(dblPosX,dblPosY,dblPosZ))) arrPTsC(count) = PointCoordinates(Rhino.AddPoint(array(cos((i+intOffset)*count*dblConv)*dblRadius+dblPosX, dblPosY, (sin((i+intOffset)*count*dblConv)*dblRadius)*-1+dblPosZ))) arrPTsD(count) = PointCoordinates(Rhino.AddPoint(array(sin((i-intOffset)*count*dblConv)*dblRadius+dblPosX, dblPosY, (cos((i-intOffset)*count*dblConv)*dblRadius)*-1+dblPosZ))) Call Rhino.AddLine( arrPTsD(count), arrBaseC(count)) '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// End If count = count + 1 Next 'Call Rhino.AddInterpCurve(arrPTsA) 'Dim strCurveA : strCurveA = Rhino.AddInterpCurve(arrPTsA) 'Call Rhino.ObjectColor (strCurveA,RGB (255,255,255)) 'Call Rhino.AddLayer("ISH_A",RGB(255,120,100)) 'Call Rhino.ObjectLayer(strCurveA,"ISH_A") 'Call Rhino.AddInterpCurve(arrPTsB) 'Dim strCurveB : strCurveB = Rhino.AddInterpCurve(arrPTsB) Dim strCurveC : strCurveC = Rhino.AddInterpCurve(arrPTsC) Call Rhino.ObjectColor (strCurveC,RGB (255,255,255)) Call Rhino.AddLayer("ISH_C",RGB(255,120,100)) Call Rhino.ObjectLayer(strCurveC,"ISH_C") 'Call Rhino.AddInterpCurve(arrPTsD) Dim strCurveD : strCurveD = Rhino.AddInterpCurve(arrPTsD) Call Rhino.ObjectColor (strCurveD,RGB (255,120,90)) Call Rhino.AddLayer("ISH_D",RGB(255,255,255)) Call Rhino.ObjectLayer(strCurveD,"ISH_D") 'Dim strCurveE : strCurveE = Rhino.AddInterpCurve(arrPTsE) 'Call Rhino.ObjectColor (strCurveE,RGB (255,120,90)) 'Call Rhino.AddLayer("ISH_3",RGB(120,100,255)) 'Call Rhino.ObjectLayer(strCurveE,"ISH_E") 'Dim strCurveF : strCurveF = Rhino.AddInterpCurve(arrPTsF) 'Call Rhino.ObjectColor (strCurveF,RGB (255,120,90)) 'Call Rhino.AddLayer("ISH_F",RGB(120,100,255)) 'Call Rhino.ObjectLayer(strCurve4,"ISH_F") Call AddPipe(arrPTsC,dblRad,i) : Call AddPipe(arrPTsD,dblRad,i) 'select the 2nd to last curve from strCurveC to use If i = 19 Then Call Rhino.AddLayer("LastCurve",RGB(100,100,100)) Call Rhino.ObjectLayer(strCurveC,"LastCurve") End If 'select the last to last curve from strCurveC to use If i = 20 Then 'Call Rhino.AddLayer("LastCurve2",RGB(100,100,100)) Call Rhino.ObjectLayer(strCurveD,"LastCurve") End If Dim strPoopCurves : strPoopCurves = Rhino.ObjectsByLayer("LastCurve",True) Next Call PoopBracket(strPoopCurves) End If End If End Sub Function AddPipe(arrMovPta,dblRad,k) Dim strLine, strPipe strLine = Rhino.AddInterpCurve (arrMovPta) Call Rhino.SelectObject (strLine) Call Rhino.Command ("Pipe "&dblRad&" "&dblRad&" enter") strPipe = Rhino.LastObject Call Rhino.ObjectColor (strPipe, rgb(0,k,0)) Call Rhino.Command ("Selnone ") Call Rhino.DeleteObject (strLine) End Function Function PoopBracket(strPoopCurves) Dim strPoopCurve Dim count3 count3 = 0 For Each strPoopCurve In strPoopCurves Dim strPoopCurve2 : strPoopCurve2 = Rhino.ObjectsByLayer("LastCurve",True) If IsNull(strPoopCurve2) Then Exit Function Dim crvObject2 : crvObject2 = strPoopCurve2(count3) Dim intSteps : intSteps = 60 If IsNull(intSteps) Then Exit Function Dim dblRad2 : dblRad2 = 1 If IsNull(dblRad2) Then Exit Function Dim crvDomain : crvDomain = Rhino.CurveDomain(crvObject2) Dim t, count If count3 = 0 Then Dim arrCrossSections(), CrossSectionPlane Dim crvCurvature, crvPoint, crvTangent, crvPerp, crvNormal count = 0 For t = crvDomain(0) To crvDomain(1) + 1e-9 Step (crvDomain(1)-crvDomain(0))/intSteps crvCurvature = Rhino.CurveCurvature(crvObject2, t) 'If IsNull(crvCurvature) Then 'crvPoint = Rhino.EvaluateCurve(crvObject, t) 'crvTangent = Rhino.CurveTangent(crvObject, t) 'crvPerp = Array(0,0,1) 'crvNormal = Rhino.VectorCrossProduct(crvTangent, crvPerp) ' Else crvPoint = crvCurvature(0) crvTangent = crvCurvature(1) crvPerp = Rhino.VectorUnitize(crvCurvature(4)) crvNormal = Rhino.VectorCrossProduct(crvTangent, crvPerp) 'Dim strPoint : strPoint = Rhino.AddPoint(crvNormal) 'Call Rhino.ObjectColor(strPoint,RGB(255,255,255)) CrossSectionPlane = Rhino.PlaneFromFrame(crvPoint, crvPerp, crvNormal) ReDim Preserve arrCrossSections(count) Dim dblRad3 : dblRad3 = dblRad2*cos(count*10) If dblRad3 < .25 Then dblRad3 = dblRad2 * 5 Else dblRad3 = dblRad2*cos(count*10) End If arrCrossSections(count) = Rhino.AddCircle(CrossSectionPlane, dblRad3) count = count + 1 Next Else Dim arrCrossSections1() count = 0 For t = crvDomain(0) To crvDomain(1) + 1e-9 Step (crvDomain(1)-crvDomain(0))/intSteps crvCurvature = Rhino.CurveCurvature(crvObject2, t) 'If IsNull(crvCurvature) Then 'crvPoint = Rhino.EvaluateCurve(crvObject, t) 'crvTangent = Rhino.CurveTangent(crvObject, t) 'crvPerp = Array(0,0,1) 'crvNormal = Rhino.VectorCrossProduct(crvTangent, crvPerp) ' Else crvPoint = crvCurvature(0) crvTangent = crvCurvature(1) crvPerp = Rhino.VectorUnitize(crvCurvature(4)) 'Call Rhino.AddPoint(crvPerp) crvNormal = Rhino.VectorCrossProduct(crvTangent, crvPerp) 'Dim strPoint : strPoint = Rhino.AddPoint(crvNormal) 'Call Rhino.ObjectColor(strPoint,RGB(255,255,255)) 'End If 'origin, x axis, y axis CrossSectionPlane = Rhino.PlaneFromFrame(crvPoint, crvPerp, crvNormal) ReDim Preserve arrCrossSections1(count) dblRad3 = dblRad2*cos(count*10) If dblRad3 < .25 Then dblRad3 = dblRad2 * 5 Else dblRad3 = dblRad2*cos(count*10) End If arrCrossSections1(count) = Rhino.AddCircle(CrossSectionPlane, dblRad3) count = count + 1 Next End If If count < 1 Then Exit Function If count3 = 0 Then Dim strRobotPoopSrf : strRobotPoopSrf = Rhino.AddLoftSrf(arrCrossSections) Call Rhino.AddLayer("Robot_Mini_PooP") Call Rhino.ObjectLayer(strRobotPoopSrf,"Robot_Mini_PooP") Call Rhino.AddLayer("Robot_Mini_PooP_curves",RGB(255,255,255)) Call Rhino.CurrentLayer("Robot_Mini_PooP_curves") Call Rhino.ObjectsByLayer("Robot_Mini_PooP",True) Call Rhino.Command("extractwireframe") Call Rhino.LayerVisible ("Robot_Mini_PooP",False) Dim dblRad : dblRad = .5 Dim arrPoopCrvs : arrPoopCrvs = Rhino.ObjectsByLayer("Robot_Mini_PooP_curves") '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Dim arrPoopCrv,count1 count1 = 0 For Each arrPoopCrv In arrPoopCrvs Dim strCurrentCurve : strCurrentCurve = Rhino.SelectObject(arrPoopCrvs(count1)) Call Rhino.Command ("Pipe "&dblRad&" "&dblRad&" enter") strCurrentCurve = Rhino.LastObject Call Rhino.ObjectColor (strCurrentCurve, rgb(255,255,255)) Call Rhino.Command ("Selnone ") Call Rhino.DeleteObject (strCurrentCurve) count1 = count1 + 1 Next count3 = count3 + 1 Else Dim strRobotPoopSrf2 : strRobotPoopSrf2 = Rhino.AddLoftSrf(arrCrossSections1) Call Rhino.AddLayer("Robot_Mini_PooP2") Call Rhino.ObjectLayer(strRobotPoopSrf2,"Robot_Mini_PooP2") Call Rhino.AddLayer("Robot_Mini_PooP_curves2",RGB(255,255,255)) Call Rhino.CurrentLayer("Robot_Mini_PooP_curves2") Call Rhino.ObjectsByLayer("Robot_Mini_PooP2",True) Call Rhino.Command("extractwireframe") Call Rhino.LayerVisible ("Robot_Mini_PooP2",False) dblRad = .5 arrPoopCrvs = Rhino.ObjectsByLayer("Robot_Mini_PooP_curves2") '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// count1 = 0 For Each arrPoopCrv In arrPoopCrvs strCurrentCurve = Rhino.SelectObject(arrPoopCrvs(count1)) Call Rhino.Command ("Pipe "&dblRad&" "&dblRad&" enter") strCurrentCurve = Rhino.LastObject Call Rhino.ObjectColor (strCurrentCurve, rgb(255,255,255)) Call Rhino.Command ("Selnone ") Call Rhino.DeleteObject (strCurrentCurve) count1 = count1 + 1 Next count3 = count3 + 1 '/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// End If Next End Function Update