ML_Spicule Generator

Option Explicit
‘Script written by <Matthew Lutz>
‘Script version Monday, October 06, 2008 11:47:41 PM

Dim triangleCrv, vertexPts, endpt1, endpt2, endpt0, newSpicule, gens, origPt, origPtCoord

Call SpiculeGenerator()
Sub SpiculeGenerator()
 
 gens = Rhino.GetReal(“How many generations?”, 50)
 origPt = Rhino.GetObject(“choose a starting point”, 1)
 origPtCoord = Rhino.PointCoordinates (origPt)

‘This is just a quick bit to get the first three starting points (equilateral triangle)
 endPt0 = Rhino.AddPoint (Array(origPtCoord(0), origPtCoord(1) + 7, origPtCoord(2)))
 endPt1 = Rhino.RotateObject (endPt0, origPtCoord, 120.0, , True)
 endPt2 = Rhino.RotateObject (endPt1, origPtCoord, 120.0, , True)
  
 endPt0 = Rhino.PointCoordinates (endPt0)
 endPt1 = Rhino.PointCoordinates (endPt1)
 endPt2 = Rhino.PointCoordinates (endPt2)

Call RecursiveGrowth()

End Sub
 
Sub RecursiveGrowth()

 Dim i, currentType, arrTypes, Rand, RadS, RadM, RadL, RadXL, arrAllSpicules()
 Dim newEndPt0(), newEndPt1(), newEndPt2(), newEndPt3()
 Dim sphereTest(), ptOnBaseLine1(), ptOnBaseLine2(), ptOnBaseLine3(), ptOnTopLine1(), j
 Dim sphereCtrPt()
 
 For i = 0 To gens
  
  ‘set up the dynamic array to add another unit each time
  ReDim Preserve arrAllSpicules(i)
 
  If i<2 Then
   arrAllSpicules(i) = AddNewSpicule(endPt0, endPt1, endPt2)
   
  Else
     ‘choose the current type – each holds a radius value
    ‘type = (top leg, base leg) — There are 4 sizes of units to be placed
   
       RadS = 1.75
       RadM = 3.5
       RadL = 5.25
       RadXL = 7
       arrTypes = Array(RadS, RadM, RadL, RadXL)
      
     ‘a random Function To Select the currentType from an Array of all 4 possible
    Rand = Random(0,3)
    currentType = arrTypes(Rand)
   
   ReDim Preserve sphereTest(i)
   sphereTest(i) = Rhino.AddSphere (arrAllSpicules(i-1)(1)(4), currentType)
   
   ReDim Preserve ptOnBaseLine1(i)
   ReDim Preserve newEndPt0(i)
   ptOnBaseLine1(i) = Rhino.CurveSurfaceIntersection(arrAllSpicules(i-1)(0)(0), sphereTest(i))
   If IsArray(ptOnBaseLine1(i)) Then
     
       Call Rhino.AddPoint (ptOnBaseLine1(i)(0,1))
       newEndPt0(i) = Rhino.FirstObject
       newEndPt0(i) = Rhino.PointCoordinates (newEndPt0(i))
   
        Else
  
        Rhino.Print “Curve and surface do not intersect.”
        newEndPt0(i) = Rhino.AddPoint (arrAllSpicules(i-1)(1)(4))
        newEndPt0(i) = Rhino.PointCoordinates (newEndPt0(i))

   End If
   
 If currentType = 5.25 Then
  ReDim Preserve ptOnBaseLine2(i)
  ReDim Preserve newEndPt1(i)
  ptOnBaseLine2(i) = Rhino.CurveSurfaceIntersection(arrAllSpicules(i-1)(0)(2), sphereTest(i))
     If IsArray(ptOnBaseLine2(i)) Then
   
         Call Rhino.AddPoint (ptOnBaseLine2(i)(0,1))
         newEndPt1(i) = Rhino.FirstObject
         newEndPt1(i) = Rhino.PointCoordinates (newEndPt1(i))
        
         Else
        
         Rhino.Print “Curve and surface do not intersect.”
         newEndPt1(i) = Array(newEndPt0(i)(0), newEndPt0(i)(1), newEndPt0(i)(2)-7)
     End If
       
 Else
     
  ReDim Preserve ptOnBaseLine2(i)
  ReDim Preserve newEndPt1(i)
  ptOnBaseLine2(i) = Rhino.CurveSurfaceIntersection(arrAllSpicules(i-1)(0)(1), sphereTest(i))
    If IsArray(ptOnBaseLine2(i)) Then
   
       Call Rhino.AddPoint (ptOnBaseLine2(i)(0,1))
       newEndPt1(i) = Rhino.FirstObject
       newEndPt1(i) = Rhino.PointCoordinates (newEndPt1(i))
        
       Else
        
       Rhino.Print “Curve and surface do not intersect.”
       newEndPt1(i) = Array(newEndPt0(i)(0), newEndPt0(i)(1), newEndPt0(i)(2)+7)
    End If
   
  End If
  
   ReDim Preserve ptOnTopLine1(i)
   ReDim Preserve newEndPt2(i)
   ptOnTopLine1(i) = Rhino.CurveSurfaceIntersection(arrAllSpicules(i-1)(0)(3), sphereTest(i))
   If IsArray(ptOnTopLine1(i)) Then
              
       Call Rhino.AddPoint (ptOnTopLine1(i)(0,1))
       newEndPt2(i) = Rhino.FirstObject
       newEndPt2(i) = Rhino.PointCoordinates (newEndPt2(i))
       
        Else
       
        Rhino.Print “Curve and surface do not intersect.”
        newEndPt2(i) = Array(newEndPt0(i)(0), newEndPt0(i)(1)+7, newEndPt0(i)(2))
     
   End If
   
   ReDim Preserve ptOnBaseLine3(i)
  ReDim Preserve newEndPt3(i)
  ptOnBaseLine3(i) = Rhino.CurveSurfaceIntersection(arrAllSpicules(i-1)(0)(2), sphereTest(i))
  If IsArray(ptOnBaseLine3(i)) Then
   
         Call Rhino.AddPoint (ptOnBaseLine3(i)(0,1))
         newEndPt3(i) = Rhino.FirstObject
         newEndPt3(i) = Rhino.PointCoordinates (newEndPt3(i))
       
          Else
       
          Rhino.Print “Curve and surface do not intersect.”
          newEndPt3(i) = Array(newEndPt0(i)(0)+7, newEndPt0(i)(1), newEndPt0(i)(2))
     End If
   
   ‘ptOnBaseLine3 = Rhino.CurveSurfaceIntersection (arrAllSpicules(i-1)(0)(2), sphereTest)
   ‘newendPt1 = Rhino.AddPoint(ptOnBaseLine2(i,1))
   
   arrAllSpicules(i) = AddNewSpicule(newEndPt0(i), newEndPt1(i), newEndPt2(i))
   Rhino.DeleteObject (sphereTest(i))
   
   End If
   Next

End Sub

‘random function
Function Random(min, max)
 
 Randomize()
 Random = Int((max – min) * Rnd + min)
 
End Function
””””” This is the function that gets called each time
””””” It takes 3 starting points as inputs
””””” This one seems to be working OK because it builds the first one fine…
Function AddNewSpicule(startPt0, startPt1, startPt2)
 AddNewSpicule = Null
 
 Dim centerPt, newCenterPt, topCenterPt, strLabel
 Dim baseLine1, baseLine2, baseLine3, baseLine4Top, dblRadius, crvNormal
 Dim triangle, offTriangle, offTriangle2
 Dim strCircle, CirclePlane, offCirclePlane1, offCirclePlane2, offCircleCurve1, offCircleCurve2 

 strCircle = Rhino.AddCircle3Pt (startPt0, startPt1, startPt2)
 centerPt = Rhino.CircleCenterPoint (strCircle)
 CirclePlane = Rhino.AddPlanarSrf (Array(strCircle))
 crvNormal = Rhino.CurveNormal(strCircle)

 dblRadius = Rhino.CircleRadius (strCircle) 
 offCirclePlane1 = Rhino.OffsetSurface(CirclePlane(0), dblRadius * 0.707)
 newCenterPt = Rhino.SurfaceAreaCentroid(offCirclePlane1)
 ‘strLabel = Rhino.AddTextDot (Rhino.Pt2Str(newCenterPt(0)), newCenterPt(0))

 offCirclePlane2 = Rhino.OffsetSurface(offCirclePlane1, dblRadius * 2)
 topCenterPt = Rhino.SurfaceAreaCentroid(offCirclePlane2)
 
 ‘ draw 3 new base lines and one top line
 baseLine1 = Rhino.AddLine(startPt0, newCenterPt(0))
 baseLine2 = Rhino.AddLine(startPt1, newCenterPt(0))
 baseLine3 = Rhino.AddLine(startPt2, newCenterPt(0))
 baseLine4Top = Rhino.AddLine(newCenterPt(0), topCenterPt(0))
 
 Dim arrSpiculeLines, arrSpiculePoints, arrSpiculeVectors
 
 Rhino.DeleteObject strCircle
 Rhino.DeleteObject CirclePlane(0)
 Rhino.DeleteObject offCirclePlane1
 Rhino.DeleteObject offCirclePlane2
 
 ”’make the pipes
 Rhino.SelectObject baseLine1
 Rhino.Command(“Pipe .25 .25 _enter”)
 Rhino.UnselectAllObjects
  
 Rhino.SelectObject baseLine2
 Rhino.Command(“Pipe .25 .25 _enter”)
 Rhino.UnselectAllObjects
  
 Rhino.SelectObject baseLine3
 Rhino.Command(“Pipe .25 .25 _enter”)
 Rhino.UnselectAllObjects
  
 Rhino.SelectObject baseLine4Top
 Rhino.Command(“Pipe .25 .25 _enter”)
 Rhino.UnselectAllObjects
  ‘now it collects all the info generated into an array that we can refer to
 arrSpiculeLines = Array(baseLine1, baseLine2, baseLine3, baseLine4Top)
 arrSpiculePoints = Array(startPt0, startPt1, startPt2, centerPt, newCenterPt(0), topCenterPt(0))
 arrSpiculeVectors = Array(crvNormal, dblRadius)
 
 AddNewSpicule = Array(arrSpiculeLines, arrSpiculePoints, arrSpiculeVectors)
 ‘ whatever it returns should have all the info you need to place the next one(within nested array)…

End Function

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s