Option Explicit 'Script written by Luis Gil 'This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. 'To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0 'www.legildesign.com Call DarbouxEvolution() Sub DarbouxEvolution() Dim strCrv strCrv = Rhino.GetObject("Select a closed curve.", 4) If IsNull(strCrv) Then Exit Sub Dim intSamplePts intSamplePts = Rhino.GetInteger("How many sample points on curve?", 12, 1) If IsNull(intSamplePts) Then Exit Sub Dim intIterations intIterations = Rhino.GetInteger("How many iterations?", 10, 1) If IsNull(intIterations) Then Exit Sub Dim dblOffset dblOffset = Rhino.GetReal("Vertical distance between each iteration?", 1) If IsNull(dblOffset) Then Exit Sub Dim dblScale dblScale = Rhino.GetReal("Scale factor for new curve?", 0.95) If IsNull(dblScale) Then Exit Sub Rhino.EnableRedraw False Call darbouxDivide(strCrv, intSamplePts, dblOffset, dblScale, intIterations, 0) Rhino.EnableRedraw True End Sub ''mathces the start point on crv2 to start point on crv1...makes loftin easier Function matchSeams(strCrv1, strCrv2) Dim arrC1Dom arrC1Dom = Rhino.CurveDomain(strCrv1) Dim arrC1Start arrC1Start = Rhino.EvaluateCurve(strCrv1, arrC1Dom(0)) Dim newC2Start newC2Start = Rhino.CurveClosestPoint(strCrv2, arrC1Start) Rhino.CurveSeam strCrv2, newC2Start End Function Function darbouxDivide(ByVal strCrv, ByVal intSamplePts, ByVal dblOffset, ByVal dblScale, ByVal intCount, ByVal intId) Rhino.Print "Working on step " & intId & " of " & intCount If(intId < intCount) Then Dim arrDivParam arrDivParam = Rhino.DivideCurve(strCrv,intSamplePts, , False) Dim arrNewPts ReDim arrNewPts(UBound(arrDivParam)) Dim i For i = 0 To UBound(arrDivParam) Dim newParam Dim newParamPt If (i <> UBound(arrDivParam)) Then newParam = arrDivParam(i) + ((arrDivParam(i+1) - arrDivParam(i)) / 2) newParamPt = Rhino.EvaluateCurve(strCrv, newParam) arrNewPts(i) = newParamPt Else Dim arrCrvDm arrCrvDm = Rhino.CurveDomain(strCrv) Dim dblAdditionalParam dblAdditionalParam = (arrCrvDm(1) - arrDivParam(i)) / 2 newParam = arrDivParam(i) + dblAdditionalParam newParamPt = Rhino.EvaluateCurve(strCrv, newParam) arrNewPts(i) = newParamPt End If Next ReDim Preserve arrNewPts(UBound(arrNewPts) + 1) arrNewPts(UBound(ArrNewPts)) = arrNewPts(0) Dim interpCrv interpCrv = Rhino.AddInterpCurveEx(arrNewPts, ,1,False) Rhino.MoveObject interpCrv, Array(0,0,0), Array(0,0,dblOffset) Dim centroid centroid = Rhino.CurveAreaCentroid(interpCrv) Rhino.ScaleObject interpCrv, centroid(0) , Array(dblScale, dblScale, dblScale) 'Call matchSeams(strCrv, interpCrv) intId = intId + 1 Call darbouxDivide(interpCrv, intSamplePts, dblOffset, dblScale, intCount, intId) End If End Function