This Rhino Script uses a series of curves, warp, and weft, running parallel to the UV directions of a surface, weaving two disparate series of integers as rules for the over/under pattern.
Rhino Script
Option Explicit 'Script written by <David Mans> 'Script copyrighted by <Neoarchaic Design> 'Script version Friday, September 12, 2008 6:05:11 PM Call Main() Sub Main() Dim surface, arrItems, arrValues, arrResults, rhythmA,rhythmB surface = Rhino.GetObject("Select Surface", 8) If isNull(surface) Then Exit Sub arrItems = array("Warp Strands", "Weft Strands", "Depth", "Warp Rhythm(up,down...)", "Warp Rhythm(up,down...)") arrValues = array(10, 10, 1, "2,3,2", "2,3,2") arrResults = Rhino.PropertyListBox(arrItems, arrValues,, "Weave Settings") rhythmA = split(arrResults(3), ",") rhythmB = split(arrResults(4), ",") Call Rhino.EnableRedraw(False) Call reparameterize(surface) Call weave(surface, CDbl(arrResults(0)), CDbl(arrResults(1)), CDbl(arrResults(2)), rhythmA, rhythmB) Call Rhino.EnableRedraw(True) End Sub Function weave(surface, cols, rows, scale, rhythmA, rhythmB) weave = Null Dim i,j,r,s,t,u,v Dim uDom, vDom Dim pts(), ptsX(1), pt() ReDim pts(rows),pt(cols) uDom = Rhino.SurfaceDomain(surface, 0)(1) vDom = Rhino.SurfaceDomain(surface, 1)(1) For i = 0 To cols Step 1 For j = 0 To rows Step 1 ptsX(0) = Rhino.PointAdd(Rhino.EvaluateSurface(surface, array((uDom / cols) * i, (vDom / rows) * j)), Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface, array((uDom / cols) * i, (vDom / rows) * j))), scale)) ptsX(1) = Rhino.PointAdd(Rhino.EvaluateSurface(surface, array((uDom / cols) * i, (vDom / rows) * j)), Rhino.VectorScale(Rhino.VectorUnitize(Rhino.VectorReverse(Rhino.SurfaceNormal(surface, array((uDom / cols) * i, (vDom / rows) * j)))), scale)) pts(j) = ptsX Next pt(i) = pts Next Dim a,b Dim inverse(),inv(),pointSetA(),pointSetB() ReDim inverse(rows),inv(cols),pointSetA(rows),pointSetB(cols) Dim arrBln(), blnSt ReDim arrBln(cols) u = 0 t = rhythmA(0) For i = 0 To cols Step 1 If u Mod (2) Then v = 0 Else v = 1 End If r = rhythmB(0) For j = 0 To rows Step 1 If v Mod (2) Then a = 0: b = 1 Else a = 1: b = 0 End If r = r - 1 If r = 0 Then r = rhythmB(s) v = v + 1 End If If s > uBound(rhythmB)Then v = 0 End If pointSetA(j) = pt(i)(j)(a) inverse(j) = b Next t = t - 1 If t = 0 Then t = rhythmA(u) u = u + 1 End If If u > uBound(rhythmA)Then u = 0 End If inv(i) = inverse blnSt = False r = 0 For j = 0 To rows Step 1 r = r + inverse(j) Next If r = 0 Or r = rows - 1 Then Else Call Rhino.addcurve(pointSetA, 3) End If Next For i = 0 To rows Step 1 r = 0 For j = 0 To cols Step 1 r = r + inv(j)(i) Next For j = 0 To cols Step 1 pointSetB(j) = pt(j)(i)(inv(j)(i)) Next If r = 0 Or r = cols - 1 Then Else Call Rhino.addcurve(pointSetB, 3) End If Next End Function Function reparameterize(strCurveID) If Rhino.IsCurve(strCurveID) = True Then Call rhino.SelectObject(strCurveID) Call rhino.Command("reparameterize 0 1") Call rhino.UnselectAllObjects() End If If Rhino.IsSurface(strCurveID) = True Then Call rhino.SelectObject(strCurveID) Call rhino.Command("reparameterize 0 1 0 1") Call rhino.UnselectAllObjects() End If End Function