This Rhino Script uses a simple repeating over/under pattern, however, the curves in this series run diagonally across the surface creating a pseudo diagrid pattern.
Rhino Script
Option Explicit 'Script written by <David Mans> 'Script copyrighted by <Neoarchaic Design> 'Script version Saturday, October 04, 2008 7:52:05 PM Call Main() Sub Main() Dim surface, weave, arrItems, arrValues, arrResults surface = Rhino.GetObject("Select Surface", 8) If isNull(surface) Then Exit Sub Call reparameterize(surface) arrItems = array("Warp Strands", "Weft Strands", "Depth") arrValues = array(10, 10, 0.5) arrResults = Rhino.PropertyListBox(arrItems, arrValues,, "Weave Settings") If isNull(arrResults) Then Exit Sub Call Rhino.EnableRedraw(False) weave = crossWeave(surface, CDbl(arrResults(0)), CDbl(arrResults(1)), CDbl(arrResults(2))) Call Rhino.EnableRedraw(True) End Sub Function crossWeave(surface, cols, rows, depth) crossWeave = Null cols = cols * 2 rows = rows * 2 Dim i, j, r, s, count, uDom, vDom, origin, srfNorm,crvCount crvCount = cols * 0.5 + rows * 0.5 - 1 Dim boolVal(), blnVal(), normal(1),norm(),nrm(),crvs(),xcrvs() ReDim boolVal(rows), blnVal(cols) ReDim norm(rows),nrm(cols),crvs(crvCount),xcrvs(crvCount) 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 boolVal(j) = array(0, 1) origin = array(uDom / (cols) * i, vDom / (rows) * j) srfNorm = Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface, origin)), depth) normal(0) = Rhino.PointAdd(Rhino.EvaluateSurface(surface, origin), srfNorm) normal(1) = Rhino.PointAdd(Rhino.EvaluateSurface(surface, origin), Rhino.VectorReverse(srfNorm)) norm(j) = normal Next blnVal(i) = boolVal nrm(i) = norm Next Dim ptA(),ptB(),ptC(),ptD() If cols > rows Then count = cols Else count = rows End If s = 0 For i = 1 To count Step 1 r = 0 ReDim ptA(0), ptB(0) If i Mod (2) Then If cols > rows Then If i < rows Then For j = 0 To i Step 1 ReDim Preserve ptA(r) blnVal(j)(i - j) = flipMe(r + 1) ptA(r) = nrm(j)(i - j)(blnVal(j)(i - j)(0)) r = r + 1 Next crvs(s) = Rhino.AddInterpCurve(ptA) r = 0 For j = 0 To rows - i Step 1 ReDim Preserve ptB(r) blnVal(cols - rows + i + j)(rows - j) = flipMe(r) ptB(r) = nrm(cols - rows + i + j)(rows - j)(blnVal(cols - rows + i + j)(rows - j)(0)) r = r + 1 Next crvs(cols * 0.5 + s) = Rhino.AddInterpCurve(ptB) s = s + 1 Else For j = 0 To rows Step 1 ReDim Preserve ptA(r) blnVal(i - rows + j)(rows - j) = flipMe(r) ptA(r) = nrm(i - rows + j)(rows - j)(blnVal(i - rows + j)(rows - j)(0)) r = r + 1 Next crvs(s) = Rhino.AddInterpCurve(ptA) s = s + 1 End If ElseIf rows > cols Then If i < cols Then For j = 0 To i Step 1 ReDim Preserve ptA(r) blnVal(j)(i - j) = flipMe(r) ptA(r) = nrm(j)(i - j)(blnVal(j)(i - j)(0)) r = r + 1 Next crvs(s) = Rhino.AddInterpCurve(ptA) r = 0 For j = 0 To cols - i Step 1 ReDim Preserve ptB(r) blnVal(i + j)(rows - j) = flipMe(r + 1) ptB(r) = nrm(i + j)(rows - j)(blnVal(i + j)(rows - j)(0)) r = r + 1 Next crvs(rows * 0.5 + s) = Rhino.AddInterpCurve(ptB) s = s + 1 Else For j = 0 To cols Step 1 ReDim Preserve ptA(r) blnVal(j)(i - j) = flipMe(r) ptA(r) = nrm(j)(i - j)(blnVal(j)(i - j)(0)) r = r + 1 Next crvs(s) = Rhino.AddInterpCurve(ptA) s = s + 1 End If Else 'If they are equal For j = 0 To i Step 1 ReDim Preserve ptA(r) blnVal(j)(i - j) = flipMe(r) ptA(r) = nrm(j)(i - j)(blnVal(j)(i - j)(0)) r = r + 1 Next r = 0 For j = 0 To cols - i Step 1 ReDim Preserve ptB(r) blnVal(i + j)(cols - j) = flipMe(r + 1) ptB(r) = nrm(i + j)(cols - j)(blnVal(i + j)(cols - j)(0)) r = r + 1 Next crvs(s) = Rhino.AddInterpCurve(ptA) crvs(cols * 0.5 + s) = Rhino.AddInterpCurve(ptB) s = s + 1 End If End If Next s = 0 For i = 1 To count Step 1 r = 0 ReDim ptC(0), ptD(0) If i Mod (2) Then If cols > rows Then If i < rows Then For j = 0 To i Step 1 ReDim Preserve ptC(r), ptD(r) ptC(r) = nrm(cols - i + j)(j)(blnVal(cols - i + j)(j)(1)) ptD(r) = nrm(j)(rows - i + j)(blnVal(j)(rows - i + j)(1)) r = r + 1 Next xcrvs(s) = Rhino.AddInterpCurve(ptD) s = s + 1 xcrvs(cols * 0.5 + rows * 0.5 - s) = Rhino.AddInterpCurve(ptC) Else r = 0 For j = 0 To rows Step 1 ReDim Preserve ptC(r) ptC(r) = nrm(i - rows + j)(j)(blnVal(i - rows + j)(j)(1)) r = r + 1 Next xcrvs(s) = Rhino.AddInterpCurve(ptC) s = s + 1 End If ElseIf rows > cols Then If i < cols Then For j = 0 To i Step 1 ReDim Preserve ptC(r), ptD(r) ptC(r) = nrm(cols - i + j)(j)(blnVal(cols - i + j)(j)(1)) ptD(r) = nrm(j)(rows - i + j)(blnVal(j)(rows - i + j)(1)) r = r + 1 Next xcrvs(s) = Rhino.AddInterpCurve(ptD) s = s + 1 xcrvs(cols * 0.5 + rows * 0.5 - s) = Rhino.AddInterpCurve(ptC) Else r = 0 For j = 0 To cols Step 1 ReDim Preserve ptC(r) ptC(r) = nrm(j)(i - cols + j)(blnVal(j)(i - cols + j)(1)) r = r + 1 Next s = s + 1 xcrvs(rows * 0.5 + cols * 0.5 - s) = Rhino.AddInterpCurve(ptC) End If Else For j = 0 To i Step 1 ReDim Preserve ptC(r),ptD(r) ptC(r) = nrm(cols - i + j)(j)(blnVal(cols - i + j)(j)(1)) ptD(r) = nrm(j)(rows - i + j)(blnVal(j)(rows - i + j)(1)) r = r + 1 Next xcrvs(cols - 1 - s) = Rhino.AddInterpCurve(ptC) xcrvs(s) = Rhino.AddInterpCurve(ptD) s = s + 1 End If End If Next crossWeave = array() 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 Function flipMe(input) flipMe = Null Dim output(1) If input Mod (2) Then output(0) = 0 output(1) = 1 Else output(0) = 1 output(1) = 0 End If flipMe = output End Function