This rhinoscript, developed for circulation diagrams, converts curves into variable styles of surfaced three-dimensional arrows. The arrows themselves can vary in scale, proportion, angle, and several other parameters.
Rhino Script
Option Explicit 'Script written by <David Mans> 'Script copyrighted by <Neoarchaic Design> 'Script version Sunday, June 08, 2008 1:19:49 AM Call Main() Sub Main() Dim crv: crv = Rhino.GetObjects("Select Curves", 4) If isNull(crv) Then Exit Sub Dim i Call Rhino.EnableRedraw(False) For i = 0 To uBound(crv) Step 1 Call reparameterize(crv(i)) Call curveArrows(crv(i), 0.5, 0.95, 90, 1) Next Call Rhino.EnableRedraw(True) End Sub Function curveArrows(curve, dblScale, tip, headAngle, dblType) curveArrows = Null Dim i,j, crv, crvCpy, crvDom, parameter, dis,scale, count, strProfSet count = 3 ReDim frame(count), pt(count*2+1),crvProfSet(count-1), swProfSet(count-2) 'establish dimensions crvDom = Rhino.CurveDomain(curve)(1) parameter = array(0, crvDom * tip, crvDom * tip, crvDom) dis = Rhino.Distance(Rhino.EvaluateCurve(curve, crvDom * tip), Rhino.EvaluateCurve(curve, crvDom)) * dblScale If dblType = 1 Then scale = array(dis * 0.25, dis * 0.25, dis * 0.5, 0) ElseIf dblType = 2 Then scale = array(dis * 0.5, dis * 0.25, dis * 0.5, 0) ElseIf dblType = 3 Then scale = array(dis * 0.25, dis * 0.5, dis * 0.5, 0) Else scale = array(dis * 0.25, dis * 0.25, dis * 0.5, 0) End If j = 0 For i = 0 To count Step 1 frame(i) = Rhino.CurveFrame(curve, parameter(i)) pt(j) = Rhino.PointAdd(frame(i)(0), Rhino.VectorRotate(Rhino.VectorScale(frame(i)(1), scale(i)), -headAngle, frame(0)(3))) j = j + 1 If dblType = 4 Then pt(j) = frame(i)(0) Else pt(j) = Rhino.PointAdd(frame(i)(0), Rhino.VectorRotate(Rhino.VectorScale(frame(i)(1), scale(i)), headAngle, frame(0)(3))) End If j = j + 1 If i < count Then crvProfSet(i) = Rhino.AddPolyline(array(pt(j - 2), frame(i)(0), pt(j - 1))) End If Next Dim ptB If dblType = 4 Then Call Rhino.AddSrfPt(array(frame(3)(0), pt(j - 4), frame(2)(0))) Else Call Rhino.AddSrfPt(array(frame(3)(0), pt(j - 4), frame(2)(0))) Call Rhino.AddSrfPt(array(frame(3)(0), pt(j - 3), frame(2)(0))) End If 'create surfaces crvCpy = Rhino.CopyObject(curve) crv = Rhino.SplitCurve(crvCpy, crvDom * tip, True) For i = 0 To count - 2 Step 1 swProfSet(i) = ("_SelID " & crvProfSet(i) & " ") Next strProfSet = Join(swProfSet) Call Rhino.Command("-_Sweep1 " & "_SelID " & crv(0) & " " & strProfSet & " _Enter _Enter _Simplify=None Enter") Call Rhino.DeleteObjects(crvProfSet) Call Rhino.DeleteObjects(crv) 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