Option Explicit
'Script written by
Call Main()
Sub Main()
'set up
Dim TrailDensity 'number of hand trails for each machine
Dim NumOfRandomPts 'number of points on each circle
Dim WeavingLength
Dim InputSection 'distance between two trail sections
Dim InputLength 'distance between two circles
Dim maxDistance 'the maximum distance for weaving
Dim minDistance 'the minimum distance for weaving
Dim trailRadius : trailRadius = 1
Dim handsRadius : handsRadius = 1
Dim Knot : Knot = 0.1
'choose machine trails
Dim arrCrv : arrCrv = Rhino.GetObjects("pick the machine trails", 4)
Dim arrStrPts : arrStrPts = Rhino.GetObjects("pick the wave generators", 1)
Dim arrPts : arrPts = arrStrPts
Dim e
For e=0 To Ubound(arrPts)
arrPts(e) = Rhino.PointCoordinates(arrStrPts(e))
Next
Dim WeavingMode : WeavingMode = 1
WeavingMode = Rhino.GetInteger("please choose weaving mode(1: Rule A 2: Rule B)", WeavingMode)
If WeavingMode = 1 Then
TrailDensity = 3
NumOfRandomPts = 5
WeavingLength = 10
InputSection = 2
InputLength = 1
maxDistance = 1.5
minDistance = 0.2
Else
WeavingMode = 2
TrailDensity = 2
NumOfRandomPts = 4
WeavingLength = 1
InputSection = 2
InputLength = 1
maxDistance = 5
End If
Dim n
For n = 0 To Ubound(arrCrv)
Dim arrTrail : arrTrail = Machine(arrCrv(n),InputSection,TrailDensity, trailRadius, 0)
Dim i
For i = 0 To Ubound(arrTrail)
Dim arrSegs
If WeavingMode = 1 Then
arrSegs = GenerateSegs(arrTrail(i), InputLength, NumOfRandomPts, handsRadius, arrPts)
Else
arrSegs = Machine(arrTrail(i), InputLength, NumOfRandomPts, handsRadius, 1)
End If
Dim Curves: Curves = Connection_Generator(arrSegs, WeavingMode)
Dim k
For k = 0 To Ubound(Curves(0))
Dim Curve1 : Curve1 = Curves(0)(k)
Dim Curve2 : Curve2 = Curves(1)(k)
Call CurveSplitter(Curve1, Curve2, maxDistance, minDistance, WeavingLength, Knot)
Next
Next
Next
End Sub
Function Machine(strCrv, InputSection, trailNum, Radius, CreationMode)
Dim secNum : secNum = Int(Rhino.CurveLength(strCrv)/InputSection)
If secNum < 3 Then
secNum = 3
End If
Dim arrPtsOnCrv : arrPtsOnCrv = Rhino.DivideCurve(strCrv, secNum-1)
Dim i, j
If trailNum > 4 Then 'maximum value is 3
trailNum = 4
End If
Dim n : n = 0
ReDim conPt(secNum-1,trailNum-1) 'control points of trails
For i = 0 To secNum-1
Dim dblParameter : dblParameter = Rhino.CurveClosestPoint(strCrv, arrPtsOnCrv(i))
Dim arrPlane : arrPlane = Rhino.CurvePerpFrame (strCrv, dblParameter)
Dim r : r = Radius 'radius of the circles
Dim circle : circle = Rhino.AddCircle(arrPlane,r)
Dim domain : domain = Rhino.CurveDomain (circle)
For j = 0 To trailNum-1
Dim pos
If trailNum < 3 Then
If n+j=5 Then
n = -4
End If
pos = domain(1)*(1/4)*(n+j)
Else
If n+j=trailNum Then
n = -(trailNum-1)
End If
pos = domain(1)*(1/trailNum)*(n+j)
End If
conPt(i,j) = Rhino.AddPoint(Rhino.EvaluateCurve (circle,pos))
Next
n = n + 1
Rhino.DeleteObject circle
Next
Dim k, m
ReDim Trail(trailNum-1)
For k = 0 To trailNum-1
ReDim pts(secNum-1)
For m = 0 To secNum-1
pts(m) = Rhino.PointCoordinates(conPt(m,k))
Rhino.DeleteObject conPt(m,k)
Next
If CreationMode = 0 Then
Dim handTrail : handTrail = "handTrail"
Call Rhino.AddLayer(handTrail,RGB(255,0,0))
Call Rhino.CurrentLayer(handTrail)
Else
Dim segCurves : segCurves = "segCurves"
Call Rhino.AddLayer(segCurves,RGB(0,0,0))
Call Rhino.CurrentLayer(segCurves)
End If
Trail(k) = Rhino.AddInterpCurve(pts)
Next
Machine = Trail
End Function
Function GenerateSegs(strCrv, InputLength, NumOfRandomPts, handsRadius, arrPts)
GenerateSegs = Null
Dim segCurves : segCurves = "segCurves"
Call Rhino.AddLayer(segCurves,RGB(0,0,0))
Call Rhino.CurrentLayer(segCurves)
If Not rhino.IsCurve(strCrv) Then Exit Function
Dim NumOfCircles : NumOfCircles = Int(Rhino.CurveLength(strCrv)/InputLength)
If NumOfCircles < 3 Then
NumOfCircles = 3
End If
Dim arrPtsOnCrv : arrPtsOnCrv = Rhino.DivideCurve(strCrv, NumOfCircles-1)
ReDim arrSegCrvs(-1)
Dim i,j,k
ReDim arrAllRandomPts(2,NumOfCircles-1)
For i = 0 To 2 ' three generations of points in each circle
For j = 0 To NumOfCircles-1
Dim dblParameter : dblParameter = Rhino.CurveClosestPoint(strCrv, arrPtsOnCrv(j))
Dim arrPlane : arrPlane = Rhino.CurvePerpFrame (strCrv, dblParameter)
Dim dbl : dbl = Rhino.Distance(arrPlane(0), arrPts(0))
Dim r1 : r1 = handsRadius+0.5*sin(dbl) 'radius of outside circle
ReDim arrRandomPtsOnjLevel(NumOfRandomPts-1)
For k = 0 To NumOfRandomPts-1
Dim cir : cir = Rhino.AddCircle(arrPlane,r1)
Dim domain : domain = Rhino.CurveDomain (cir)
arrRandomPtsOnjLevel(k) = Rhino.EvaluateCurve (cir,domain(1)*sin((j+1)*dbl)*sin((k+1)*dbl)*cos((i+1)*dbl))
'arrRandomPtsOnjLevel(k) = Rhino.EvaluateCurve (cir,domain(1)*sin((j+1)*1)*sin((k+1)*1)*cos((i+1)*1))
Rhino.DeleteObject cir
Next
arrAllRandomPts(i,j) = arrRandomPtsOnjLevel
'Call Rhino.Addpoints(arrAllRandomPts(i,j))
Next
Next
Dim index
Dim onListPts : onListPts = arrAllRandomPts
For i=0 To NumOfCircles-3
For j=0 To NumOfRandomPts-1
Dim arrPt0 : arrPt0 = onListPts(0,i)(j)
index = Rhino.PointArrayClosestPoint(onListPts(1,i+1),arrPt0)
Dim arrPt1 : arrPt1 = onListPts(1,i+1)(index)
index = Rhino.PointArrayClosestPoint(onListPts(2,i+2),arrPt1)
Dim arrPt2 : arrPt2 = onListPts(2,i+2)(index)
ReDim Preserve arrSegCrvs(Ubound(arrSegCrvs)+1)
arrSegCrvs(Ubound(arrSegCrvs)) = Rhino.AddInterpCurve(array(arrPt0,arrPt1,arrPt2))
onListPts(2,i+2)(index) = Array(0,-100000000000000000000000000,0) 'change the chosen point's coordinate, so it will not be chosen again
Next
Next
GenerateSegs = arrSegCrvs
End Function
Function Connection_Generator(arrCurves, WeavingMode)
ReDim Crv1(Ubound(arrCurves)), Crv2(Ubound(arrCurves))
If WeavingMode = 1 Then
Dim i
For i = 0 To Ubound(arrCurves)
Dim testPts : testPts = Rhino.CurveStartPoint(arrCurves(i))
ReDim targetPts(-1)
Dim j
For j=0 To Ubound(arrCurves)
If Not i = j Then
ReDim Preserve targetPts(Ubound(targetPts)+1)
targetPts(Ubound(targetPts)) = Rhino.CurveMidPoint(arrCurves(j))
End If
Next
Dim index : index = Rhino.PointArrayClosestPoint(targetPts, testPts)
Crv1(i) = arrCurves(i)
Crv2(i) = arrCurves(index)
Next
Else
Dim k
For k = 0 To Ubound(arrCurves)
Crv1(k) = arrCurves(k)
If k = Ubound(arrCurves) Then
Crv2(k) = arrCurves(0)
Else
Crv2(k) = arrCurves(k+1)
End If
Next
End If
Connection_Generator = Array(Crv1, Crv2)
End Function
Function CurveSplitter(Curve1, Curve2, maxDistance, minDistance, WeavingLength, Knot)
Dim nSegments : nSegments = Int(Rhino.CurveLength(Curve1)/WeavingLength)
If nSegments < 2 Then
nSegments = 2
End If
Dim aPoints1 : aPoints1 = Rhino.DivideCurve(Curve1, nSegments)
Dim aPoints2 : aPoints2 = Rhino.DivideCurve(Curve2, nSegments)
Dim i
ReDim segCrvs1(nSegments-1), segCrvs2(nSegments-1), midPtSeg1(nSegments-1), midPtSeg2(nSegments-1)
ReDim strPtSeg1(nSegments-1),strPtSeg2(nSegments-1), endPtSeg1(nSegments-1), endPtSeg2(nSegments-1)
For i = 0 To Ubound(aPoints1)-1
Dim t0 : t0 = Rhino.CurveClosestPoint(Curve1, aPoints1(i))
Dim t1 : t1 = Rhino.CurveClosestPoint(Curve1, aPoints1(i+1))
segCrvs1(i) = Rhino.TrimCurve(Curve1, Array(t0, t1), False)
midPtSeg1(i) = Rhino.CurveMidPoint(segCrvs1(i))
strPtSeg1(i) = Rhino.CurveStartPoint(segCrvs1(i))
endPtSeg1(i) = Rhino.CurveEndPoint(segCrvs1(i))
Dim t2 : t2 = Rhino.CurveClosestPoint(Curve2, aPoints2(i))
Dim t3 : t3 = Rhino.CurveClosestPoint(Curve2, aPoints2(i+1))
segCrvs2(i) = Rhino.TrimCurve(Curve2, Array(t2, t3), False)
midPtSeg2(i)= Rhino.CurveMidPoint(segCrvs2(i))
strPtSeg2(i) = Rhino.CurveStartPoint(segCrvs2(i))
endPtSeg2(i) = Rhino.CurveEndPoint(segCrvs2(i))
Next
Dim j
For j = 0 To Ubound(segCrvs1)
Dim d0 : d0 = Rhino.Distance(midPtSeg1(j),midPtSeg2(j))
Dim d1 : d1 = Rhino.Distance(strPtSeg1(j), strPtSeg2(j))
Dim d2 : d2 = Rhino.Distance(endPtSeg1(j), endPtSeg2(j))
Dim distance : distance = (d0+d1+d2)/2
If distance < maxDistance And distance > minDistance Then
Call Weaving_Machine(segCrvs1(j), segCrvs2(j), 4, Knot)
End If
Next
Rhino.DeleteObjects segCrvs1
Rhino.DeleteObjects segCrvs2
End Function
Function Weaving_Machine(Curve1, Curve2, Num, r)
Dim weaving : weaving = "weaving"
Call Rhino.AddLayer(weaving,RGB(0,0,255))
Call Rhino.CurrentLayer(weaving)
Dim arrPtsOnCrv1 : arrPtsOnCrv1 = Rhino.DivideCurve(Curve1, Num-1)
Dim arrPtsOnCrv2 : arrPtsOnCrv2 = Rhino.DivideCurve(Curve2, Num-1)
ReDim cir1(Num-1), cir2(Num-1),closePt1(Num-1),closePt2(Num-1)
Dim i
Dim NumPts : NumPts = 3 'number of points on each circle
ReDim PtsOnCircle1(Num-1),arrPts1(Num-1), PtsOnCircle2(Num-1),arrPts2(Num-1)
For i = 0 To Num-1
Dim dblParameter1 : dblParameter1 = Rhino.CurveClosestPoint(Curve1, arrPtsOnCrv1(i))
Dim arrPlane1 : arrPlane1 = Rhino.CurvePerpFrame (Curve1, dblParameter1)
cir1(i) = Rhino.AddCircle(arrPlane1,r)
Dim dblParameter2 : dblParameter2 = Rhino.CurveClosestPoint(Curve2, arrPtsOnCrv2(i))
Dim arrPlane2 : arrPlane2 = Rhino.CurvePerpFrame (Curve2, dblParameter2)
cir2(i) = Rhino.AddCircle(arrPlane2,r)
closePt1(i) = Rhino.CurveClosestPoint(cir1(i),arrPtsOnCrv2(i))
closePt2(i) = Rhino.CurveClosestPoint(cir2(i),arrPtsOnCrv1(i))
Dim domain1 : domain1 = Rhino.CurveDomain(cir1(i))
Dim domain2 : domain2 = Rhino.CurveDomain(cir2(i))
PtsOnCircle1(i) = Array(Rhino.AddPoint(Rhino.EvaluateCurve (cir1(i), closePt1(i)+0.25*domain1(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir1(i), closePt1(i)+0.5*domain1(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir1(i), closePt1(i)+0.75*domain1(1))))
arrPts1(i) = Array(Rhino.PointCoordinates(PtsOnCircle1(i)(0)), Rhino.PointCoordinates(PtsOnCircle1(i)(1)), Rhino.PointCoordinates(PtsOnCircle1(i)(2)))
PtsOnCircle2(i) = Array(Rhino.AddPoint(Rhino.EvaluateCurve (cir2(i), closePt2(i)+0.25*domain2(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir2(i), closePt2(i)+0.5*domain2(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir2(i), closePt2(i)+0.75*domain2(1))))
arrPts2(i) = Array(Rhino.PointCoordinates(PtsOnCircle2(i)(0)), Rhino.PointCoordinates(PtsOnCircle2(i)(1)), Rhino.PointCoordinates(PtsOnCircle2(i)(2)))
Rhino.DeleteObject cir1(i)
Rhino.DeleteObject cir2(i)
Rhino.DeleteObjects PtsOnCircle1(i)
Rhino.DeleteObjects PtsOnCircle2(i)
Next
ReDim crvPts(-1)
Dim k
For k = 0 To Num-2 Step 1
Dim m
For m = 0 To 2
ReDim Preserve crvPts(Ubound(crvPts)+1)
crvPts(Ubound(crvPts)) = arrPts2(k)(m)
Next
For m = 0 To 2
ReDim Preserve crvPts(Ubound(crvPts)+1)
crvPts(Ubound(crvPts)) = arrPts1(k+1)(m)
Next
Next
Rhino.AddCurve crvPts
End Function
Option Explicit
'Script written by
Call Main()
Sub Main()
'set up
Dim TrailDensity 'number of hand trails for each machine
Dim NumOfRandomPts 'number of points on each circle
Dim WeavingLength
Dim InputSection 'distance between two trail sections
Dim InputLength 'distance between two circles
Dim maxDistance 'the maximum distance for weaving
Dim minDistance 'the minimum distance for weaving
Dim trailRadius : trailRadius = 1
Dim handsRadius : handsRadius = 1
Dim Knot : Knot = 0.1
'choose machine trails
Dim arrCrv : arrCrv = Rhino.GetObjects("pick the machine trails", 4)
Dim WeavingMode : WeavingMode = 1
WeavingMode = Rhino.GetInteger("please choose weaving mode(1: Rule A 2: Rule B)", WeavingMode)
If WeavingMode = 1 Then
TrailDensity = 2
NumOfRandomPts = 4
WeavingLength = 10
InputSection = 2
InputLength = 1
maxDistance = 1
minDistance = 0.3
Else
WeavingMode = 2
TrailDensity = 2
NumOfRandomPts = 4
WeavingLength = 1
InputSection = 2
InputLength = 1
maxDistance = 5
End If
Dim n
For n = 0 To Ubound(arrCrv)
Dim arrTrail : arrTrail = Machine(arrCrv(n),InputSection,TrailDensity, trailRadius, 0)
Dim i
For i = 0 To Ubound(arrTrail)
Dim arrSegs
If WeavingMode = 1 Then
arrSegs = GenerateSegs(arrTrail(i), InputLength, NumOfRandomPts, handsRadius)
Else
arrSegs = Machine(arrTrail(i), InputLength, NumOfRandomPts, handsRadius, 1)
End If
Dim Curves: Curves = Connection_Generator(arrSegs, WeavingMode)
Dim k
For k = 0 To Ubound(Curves(0))
Dim Curve1 : Curve1 = Curves(0)(k)
Dim Curve2 : Curve2 = Curves(1)(k)
Call CurveSplitter(Curve1, Curve2, maxDistance, minDistance, WeavingLength, Knot)
Next
Next
Next
End Sub
Function Machine(strCrv, InputSection, trailNum, Radius, CreationMode)
Dim secNum : secNum = Int(Rhino.CurveLength(strCrv)/InputSection)
If secNum < 3 Then
secNum = 3
End If
Dim arrPtsOnCrv : arrPtsOnCrv = Rhino.DivideCurve(strCrv, secNum-1)
Dim i, j
If trailNum > 4 Then 'maximum value is 3
trailNum = 4
End If
Dim n : n = 0
ReDim conPt(secNum-1,trailNum-1) 'control points of trails
For i = 0 To secNum-1
Dim dblParameter : dblParameter = Rhino.CurveClosestPoint(strCrv, arrPtsOnCrv(i))
Dim arrPlane : arrPlane = Rhino.CurvePerpFrame (strCrv, dblParameter)
Dim r : r = Radius 'radius of the circles
Dim circle : circle = Rhino.AddCircle(arrPlane,r)
Dim domain : domain = Rhino.CurveDomain (circle)
For j = 0 To trailNum-1
Dim pos
If trailNum < 3 Then
If n+j=5 Then
n = -4
End If
pos = domain(1)*(1/4)*(n+j)
Else
If n+j=trailNum Then
n = -(trailNum-1)
End If
pos = domain(1)*(1/trailNum)*(n+j)
End If
conPt(i,j) = Rhino.AddPoint(Rhino.EvaluateCurve (circle,pos))
Next
n = n + 1
Rhino.DeleteObject circle
Next
Dim k, m
ReDim Trail(trailNum-1)
For k = 0 To trailNum-1
ReDim pts(secNum-1)
For m = 0 To secNum-1
pts(m) = Rhino.PointCoordinates(conPt(m,k))
Rhino.DeleteObject conPt(m,k)
Next
If CreationMode = 0 Then
Dim handTrail : handTrail = "handTrail"
Call Rhino.AddLayer(handTrail,RGB(255,0,0))
Call Rhino.CurrentLayer(handTrail)
Else
Dim segCurves : segCurves = "segCurves"
Call Rhino.AddLayer(segCurves,RGB(0,0,0))
Call Rhino.CurrentLayer(segCurves)
End If
Trail(k) = Rhino.AddInterpCurve(pts)
Next
Machine = Trail
End Function
Function GenerateSegs(strCrv, InputLength, NumOfRandomPts, handsRadius)
GenerateSegs = Null
Dim segCurves : segCurves = "segCurves"
Call Rhino.AddLayer(segCurves,RGB(0,0,0))
Call Rhino.CurrentLayer(segCurves)
If Not rhino.IsCurve(strCrv) Then Exit Function
Dim NumOfCircles : NumOfCircles = Int(Rhino.CurveLength(strCrv)/InputLength)
If NumOfCircles < 3 Then
NumOfCircles = 3
End If
Dim arrPtsOnCrv : arrPtsOnCrv = Rhino.DivideCurve(strCrv, NumOfCircles-1)
ReDim arrSegCrvs(-1)
Dim i,j,k
ReDim arrAllRandomPts(2,NumOfCircles-1)
Dim n : n = 0
For i = 0 To 2 ' three generations of points in each circle
For j = 0 To NumOfCircles-1
Dim dblParameter : dblParameter = Rhino.CurveClosestPoint(strCrv, arrPtsOnCrv(j))
Dim arrPlane : arrPlane = Rhino.CurvePerpFrame (strCrv, dblParameter)
Dim r1 : r1 = handsRadius 'radius of outside circle
ReDim arrRandomPtsOnjLevel(NumOfRandomPts-1)
For k = 0 To NumOfRandomPts-1
Dim cir : cir = Rhino.AddCircle(arrPlane,r1)
Dim domain : domain = Rhino.CurveDomain(cir)
Dim pos
If n+k=NumOfRandomPts Then
n = -(NumOfRandomPts-1)
End If
pos = domain(1)*(1/NumOfRandomPts)*(n+k)*sin(i+1)
arrRandomPtsOnjLevel(k) = Rhino.EvaluateCurve(cir,pos)
Rhino.DeleteObject cir
Next
n = n+1
arrAllRandomPts(i,j) = arrRandomPtsOnjLevel
'Call Rhino.Addpoints(arrAllRandomPts(i,j))
Next
Next
Dim index
Dim onListPts : onListPts = arrAllRandomPts
For i=0 To NumOfCircles-3
For j=0 To NumOfRandomPts-1
Dim arrPt0 : arrPt0 = onListPts(0,i)(j)
index = Rhino.PointArrayClosestPoint(onListPts(1,i+1),arrPt0)
Dim arrPt1 : arrPt1 = onListPts(1,i+1)(index)
index = Rhino.PointArrayClosestPoint(onListPts(2,i+2),arrPt1)
Dim arrPt2 : arrPt2 = onListPts(2,i+2)(index)
ReDim Preserve arrSegCrvs(Ubound(arrSegCrvs)+1)
arrSegCrvs(Ubound(arrSegCrvs)) = Rhino.AddInterpCurve(array(onListPts(0,i)(j),onListPts(1,i+1)(j),onListPts(2,i+2)(j)))
'onListPts(2,i+2)(index) = Array(0,-100000000000000000000000000,0) 'change the chosen point's coordinate, so it will not be chosen again
Next
Next
GenerateSegs = arrSegCrvs
End Function
Function Connection_Generator(arrCurves, WeavingMode)
ReDim Crv1(Ubound(arrCurves)), Crv2(Ubound(arrCurves))
If WeavingMode = 1 Then
Dim i
For i = 0 To Ubound(arrCurves)
Dim testPts : testPts = Rhino.CurveStartPoint(arrCurves(i))
ReDim targetPts(-1)
Dim j
For j=0 To Ubound(arrCurves)
If Not i = j Then
ReDim Preserve targetPts(Ubound(targetPts)+1)
targetPts(Ubound(targetPts)) = Rhino.CurveMidPoint(arrCurves(j))
End If
Next
Dim index : index = Rhino.PointArrayClosestPoint(targetPts, testPts)
Crv1(i) = arrCurves(i)
Crv2(i) = arrCurves(index)
Next
Else
Dim k
For k = 0 To Ubound(arrCurves)
Crv1(k) = arrCurves(k)
If k = Ubound(arrCurves) Then
Crv2(k) = arrCurves(0)
Else
Crv2(k) = arrCurves(k+1)
End If
Next
End If
Connection_Generator = Array(Crv1, Crv2)
End Function
Function CurveSplitter(Curve1, Curve2, maxDistance, minDistance, WeavingLength, Knot)
Dim nSegments : nSegments = Int(Rhino.CurveLength(Curve1)/WeavingLength)
If nSegments < 2 Then
nSegments = 2
End If
Dim aPoints1 : aPoints1 = Rhino.DivideCurve(Curve1, nSegments)
Dim aPoints2 : aPoints2 = Rhino.DivideCurve(Curve2, nSegments)
Dim i
ReDim segCrvs1(nSegments-1), segCrvs2(nSegments-1), midPtSeg1(nSegments-1), midPtSeg2(nSegments-1)
ReDim strPtSeg1(nSegments-1),strPtSeg2(nSegments-1), endPtSeg1(nSegments-1), endPtSeg2(nSegments-1)
For i = 0 To Ubound(aPoints1)-1
Dim t0 : t0 = Rhino.CurveClosestPoint(Curve1, aPoints1(i))
Dim t1 : t1 = Rhino.CurveClosestPoint(Curve1, aPoints1(i+1))
segCrvs1(i) = Rhino.TrimCurve(Curve1, Array(t0, t1), False)
midPtSeg1(i) = Rhino.CurveMidPoint(segCrvs1(i))
strPtSeg1(i) = Rhino.CurveStartPoint(segCrvs1(i))
endPtSeg1(i) = Rhino.CurveEndPoint(segCrvs1(i))
Dim t2 : t2 = Rhino.CurveClosestPoint(Curve2, aPoints2(i))
Dim t3 : t3 = Rhino.CurveClosestPoint(Curve2, aPoints2(i+1))
segCrvs2(i) = Rhino.TrimCurve(Curve2, Array(t2, t3), False)
midPtSeg2(i)= Rhino.CurveMidPoint(segCrvs2(i))
strPtSeg2(i) = Rhino.CurveStartPoint(segCrvs2(i))
endPtSeg2(i) = Rhino.CurveEndPoint(segCrvs2(i))
Next
Dim j
For j = 0 To Ubound(segCrvs1)
Dim d0 : d0 = Rhino.Distance(midPtSeg1(j),midPtSeg2(j))
Dim d1 : d1 = Rhino.Distance(strPtSeg1(j), strPtSeg2(j))
Dim d2 : d2 = Rhino.Distance(endPtSeg1(j), endPtSeg2(j))
Dim distance : distance = (d0+d1+d2)/2
If distance < maxDistance And distance > minDistance Then
Call Weaving_Machine(segCrvs1(j), segCrvs2(j), 4, Knot)
End If
Next
Rhino.DeleteObjects segCrvs1
Rhino.DeleteObjects segCrvs2
End Function
Function Weaving_Machine(Curve1, Curve2, Num, r)
Dim weaving : weaving = "weaving"
Call Rhino.AddLayer(weaving,RGB(0,0,255))
Call Rhino.CurrentLayer(weaving)
Dim arrPtsOnCrv1 : arrPtsOnCrv1 = Rhino.DivideCurve(Curve1, Num-1)
Dim arrPtsOnCrv2 : arrPtsOnCrv2 = Rhino.DivideCurve(Curve2, Num-1)
ReDim cir1(Num-1), cir2(Num-1),closePt1(Num-1),closePt2(Num-1)
Dim i
Dim NumPts : NumPts = 3 'number of points on each circle
ReDim PtsOnCircle1(Num-1),arrPts1(Num-1), PtsOnCircle2(Num-1),arrPts2(Num-1)
For i = 0 To Num-1
Dim dblParameter1 : dblParameter1 = Rhino.CurveClosestPoint(Curve1, arrPtsOnCrv1(i))
Dim arrPlane1 : arrPlane1 = Rhino.CurvePerpFrame (Curve1, dblParameter1)
cir1(i) = Rhino.AddCircle(arrPlane1,r)
Dim dblParameter2 : dblParameter2 = Rhino.CurveClosestPoint(Curve2, arrPtsOnCrv2(i))
Dim arrPlane2 : arrPlane2 = Rhino.CurvePerpFrame (Curve2, dblParameter2)
cir2(i) = Rhino.AddCircle(arrPlane2,r)
closePt1(i) = Rhino.CurveClosestPoint(cir1(i),arrPtsOnCrv2(i))
closePt2(i) = Rhino.CurveClosestPoint(cir2(i),arrPtsOnCrv1(i))
Dim domain1 : domain1 = Rhino.CurveDomain(cir1(i))
Dim domain2 : domain2 = Rhino.CurveDomain(cir2(i))
PtsOnCircle1(i) = Array(Rhino.AddPoint(Rhino.EvaluateCurve (cir1(i), closePt1(i)+0.25*domain1(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir1(i), closePt1(i)+0.5*domain1(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir1(i), closePt1(i)+0.75*domain1(1))))
arrPts1(i) = Array(Rhino.PointCoordinates(PtsOnCircle1(i)(0)), Rhino.PointCoordinates(PtsOnCircle1(i)(1)), Rhino.PointCoordinates(PtsOnCircle1(i)(2)))
PtsOnCircle2(i) = Array(Rhino.AddPoint(Rhino.EvaluateCurve (cir2(i), closePt2(i)+0.25*domain2(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir2(i), closePt2(i)+0.5*domain2(1))), Rhino.AddPoint(Rhino.EvaluateCurve (cir2(i), closePt2(i)+0.75*domain2(1))))
arrPts2(i) = Array(Rhino.PointCoordinates(PtsOnCircle2(i)(0)), Rhino.PointCoordinates(PtsOnCircle2(i)(1)), Rhino.PointCoordinates(PtsOnCircle2(i)(2)))
Rhino.DeleteObject cir1(i)
Rhino.DeleteObject cir2(i)
Rhino.DeleteObjects PtsOnCircle1(i)
Rhino.DeleteObjects PtsOnCircle2(i)
Next
ReDim crvPts(-1)
Dim k
For k = 0 To Num-2 Step 1
Dim m
For m = 0 To 2
ReDim Preserve crvPts(Ubound(crvPts)+1)
crvPts(Ubound(crvPts)) = arrPts2(k)(m)
Next
For m = 0 To 2
ReDim Preserve crvPts(Ubound(crvPts)+1)
crvPts(Ubound(crvPts)) = arrPts1(k+1)(m)
Next
Next
Rhino.AddCurve crvPts
End Function