Selecting multiple objects is easy, just use the Rhino.GetObjects method which returns an array, then cycle through the array to check each curve

Dim arrCurve, intShort

intShort = Rhino.GetReal ("min. length to keep?", 0.1)

arrCurve = Rhino.GetObjects ("select a curves to evaluate", 4)

Dim i

For i = 0 to Ubound(arrCurve)

If Rhino.CurveLength (arrCurve(i)) > intShort Then

Call Rhino.ObjectLayer (arrCurve(i), "Curve")

Else

Call Rhino.DeleteObject (arrCurve(i))

End If

Next

## Sunday, September 30, 2007

### Newbie's struggle

Inspired from the script Sky wrote last night, I would like to write a script that lets user select many curves and decides the min. length to keep, and deletes shorter-than-the-min. curves. My struggle is that CurveLength (script method) seems to evaluate only ONE curve at a time. If someone know how to do it better, please let me know. array still confuses me.

Option Explicit

EvaluateCurve ()

Sub EvaluateCurve ()

Call Rhino.AddLayer ("Curve")

Dim strCurve, intShort

intShort = Rhino.GetReal ("min. length to keep?", 0.1)

strCurve = Rhino.GetObject ("select a curve to evaluate", 4)

If Rhino.CurveLength (strCurve) > intShort Then

Call Rhino.ObjectLayer (strCurve, "Curve")

Else

Call Rhino.DeleteObject (strCurve)

End If

End Sub

Option Explicit

EvaluateCurve ()

Sub EvaluateCurve ()

Call Rhino.AddLayer ("Curve")

Dim strCurve, intShort

intShort = Rhino.GetReal ("min. length to keep?", 0.1)

strCurve = Rhino.GetObject ("select a curve to evaluate", 4)

If Rhino.CurveLength (strCurve) > intShort Then

Call Rhino.ObjectLayer (strCurve, "Curve")

Else

Call Rhino.DeleteObject (strCurve)

End If

End Sub

### Pattern Generation

What was seemingly a simple script took me all night to figure out. It takes any curve and divides it up into alternating sets of cut lines to be pulled out into perforated structures.

Option Explicit

Call CutPattern ()

Sub CutPattern ()

Dim blspace, varcut, arrOddCrv, arrEvenCrv, offset, temp

'get User Input

blspace = Rhino.GetReal ("size of space",.1, 0, .5)

varCut = Rhino.GetInteger ("Number of cuts",20)

offset = Rhino.GetReal ("Offset Amount", 1, 0, 1)

arrOddCrv = Rhino.GetObjects ("Pick Odd Curves", 4)

arrEvenCrv = Rhino.GetObjects ("Pick Even Curves", 4)

temp = 0

Dim k

For k = 0 To UBound(arrOddCrv)

Call Generate(arrOddCrv(k), blspace, varcut, temp)

Next

For k = 0 To UBound(arrEvenCrv)

Call Generate(arrEvenCrv(k), blspace, varcut, offset)

Next

End Sub

Function Generate(strCrv, BetweenCuts, CutNum, offset)

Dim Counter : Counter = 0

Dim Dist : Dist = 0

Dim ArrPoints(), ArrDomain, currentDist, adjSpace, adjCut

arrDomain = Rhino.CurveDomain(strCrv)

adjSpace = 1/CutNum*BetweenCuts

adjCut = ((1/CutNum)-adjSpace)*.5

dist = dist + (adjcut*offset)

'Rhino.Print "Curve domain: " & CStr(arrDomain(0)) & " to " & CStr(arrDomain(1))

Do While Dist < 1

ReDim Preserve arrPoint(counter)

currentDist = adjPar(arrDomain, dist)

arrPoint(counter) = Rhino.EvaluateCurve(strCrv, currentDist)

dist = dist + adjCut

Counter = counter + 1

ReDim Preserve arrPoint(counter)

currentDist = adjPar(arrDomain, dist)

arrPoint(counter) = Rhino.EvaluateCurve(strCrv, currentDist)

dist = dist + adjCut

Counter = counter +1

ReDim Preserve arrPoint(counter)

currentDist = adjPar(arrDomain, dist)

arrPoint(counter) = Rhino.EvaluateCurve(strCrv, currentDist)

dist = dist + adjSpace

Counter = counter +1

Loop

Dim i : i = 0

Dim LineArray(2)

'Add Lines

Do While i < UBound(arrPoint)

LineArray(0) = arrPoint(i)

i=i+1

LineArray(1) = arrPoint(i)

i=i+1

LineArray(2) = arrPoint(i)

i=i+1

Rhino.AddCurve LineArray

Loop

End Function

Function adjPar(crvDomain, dist)

adjPar = crvDomain(0) + dist * (crvDomain(1) -crvDomain(0))

End Function

## Saturday, September 15, 2007

### pariSSSS, france

Last spring, while attending a semester at the Ecole Speciale D'Architecture the studio was introduced to rhino scripting techniques at a workshop conducted by Edmondo Occhipinti. The studio ; Eco-Logical High-rise, focused around the idea of utilizing various computational methods and software for design performance, evaluation, and optimization.

This script was developed in collaboration with Martin. It creates a series of 12 points from equations derived for the construction of a unit circle, implements a directional deviation of either a single or double point, and draws a closed curve through the set of points. The script was used to generate floor plates that respond to prevalent wind direction, either by developing a 'bulge factor' in the direction of the wind or against it. It was imagined that the implementation of this method in the design could be used to have parts of the building that were capturing the wind for energy-generation purposes and others that were repelling the wind for structural reasons.

Voici le script et quelques images:

Option Explicit

'base floor curve from points'

Call DrawCurve

Sub DrawCurve

Dim r

Dim bulgefactor

Dim i

Dim j

Dim arrpt1, arrpt2, arrpt3, arrpt4, arrpt5, arrpt6, arrpt7, arrpt8, arrpt9, arrpt10, arrpt11, arrpt12

Dim arrpts

Dim arrcrvpts

Dim crv1

bulgefactor= Rhino.getreal ("choose bulge ratio")

r= 1.0477787091366303436714165968148*Rhino.getreal ("identify RADIUS", 1,0)

i= ((3/2)*Rhino.getreal ("choose the inflatement ratio for ETE", bulgefactor,-2))/1.0477787091366303436714165968148

j= ((3/2)*Rhino.getreal ("choose the inflatement ratio for HIVER", -bulgefactor,-2))/1.0477787091366303436714165968148

arrpt1= array (0,r)

arrpt2= array ((r+i*r)/2,(r+i*r)*Sqr(3)/2)

arrpt3= array (r*Sqr(3)/2, r/2)

arrpt4= array (r,0)

arrpt5= array (r*Sqr(3)/2, -r/2)

arrpt6= array (r/2, -r*Sqr(3)/2)

arrpt7= array (0,-(r+j*r))

arrpt8= array (-r/2, -r*Sqr(3)/2)

arrpt9= array (-r*Sqr(3)/2, -r/2)

arrpt10= array (-r,0)

arrpt11= array (-r*Sqr(3)/2, r/2)

arrpt12= array (-r/2, r*Sqr(3)/2)

arrpts= array (arrpt11, arrpt12, arrpt1, arrpt2, arrpt3, arrpt4, arrpt5, arrpt6, arrpt7, arrpt8, arrpt9, arrpt10, arrpt11)

'arrcrvpts= Rhino.addpoints (arrpts)

crv1= Rhino.AddCurve (arrpts,3)

End Sub

This script was developed in collaboration with Martin. It creates a series of 12 points from equations derived for the construction of a unit circle, implements a directional deviation of either a single or double point, and draws a closed curve through the set of points. The script was used to generate floor plates that respond to prevalent wind direction, either by developing a 'bulge factor' in the direction of the wind or against it. It was imagined that the implementation of this method in the design could be used to have parts of the building that were capturing the wind for energy-generation purposes and others that were repelling the wind for structural reasons.

Voici le script et quelques images:

Option Explicit

'base floor curve from points'

Call DrawCurve

Sub DrawCurve

Dim r

Dim bulgefactor

Dim i

Dim j

Dim arrpt1, arrpt2, arrpt3, arrpt4, arrpt5, arrpt6, arrpt7, arrpt8, arrpt9, arrpt10, arrpt11, arrpt12

Dim arrpts

Dim arrcrvpts

Dim crv1

bulgefactor= Rhino.getreal ("choose bulge ratio")

r= 1.0477787091366303436714165968148*Rhino.getreal ("identify RADIUS", 1,0)

i= ((3/2)*Rhino.getreal ("choose the inflatement ratio for ETE", bulgefactor,-2))/1.0477787091366303436714165968148

j= ((3/2)*Rhino.getreal ("choose the inflatement ratio for HIVER", -bulgefactor,-2))/1.0477787091366303436714165968148

arrpt1= array (0,r)

arrpt2= array ((r+i*r)/2,(r+i*r)*Sqr(3)/2)

arrpt3= array (r*Sqr(3)/2, r/2)

arrpt4= array (r,0)

arrpt5= array (r*Sqr(3)/2, -r/2)

arrpt6= array (r/2, -r*Sqr(3)/2)

arrpt7= array (0,-(r+j*r))

arrpt8= array (-r/2, -r*Sqr(3)/2)

arrpt9= array (-r*Sqr(3)/2, -r/2)

arrpt10= array (-r,0)

arrpt11= array (-r*Sqr(3)/2, r/2)

arrpt12= array (-r/2, r*Sqr(3)/2)

arrpts= array (arrpt11, arrpt12, arrpt1, arrpt2, arrpt3, arrpt4, arrpt5, arrpt6, arrpt7, arrpt8, arrpt9, arrpt10, arrpt11)

'arrcrvpts= Rhino.addpoints (arrpts)

crv1= Rhino.AddCurve (arrpts,3)

End Sub

Subscribe to:
Posts (Atom)