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