RhinoScript – Surfaces: Part 02

Example 01: Plotting a Surface’s Normals
Option Explicit 'Script written by www.supermanoeuvre.com Call plotSurfaceNormals() Sub plotSurfaceNormals() '------------------------------------------------------------------------------------------------------ ' USER INPUT Dim strSrf : strSrf = rhino.getObject("Gimme SURFACE object!", 8) If isNull(strSrf) Then Exit Sub Dim numSpans : numSpans = rhino.GetInteger("Gimme number of surface spans in each direction", 35, 4, 50) If isNull(numSpans) Then Exit Sub Dim dblScale : dblScale = rhino.getReal("Gimme magnitude of surface normal factor", 10.0, 0.5, 50.0) If isNull(dblScale) Then Exit Sub '------------------------------------------------------------------------------------------------------ ' SCRIPT BODY rhino.print "!!! SCRIPT STARTED !!!" rhino.enableRedraw False '------------------------------------------------------- ' Get U vals Dim arrSrfDomU : arrSrfDomU = Rhino.SurfaceDomain(strSrf,0) Dim uMin : uMin = arrSrfDomU(0) Dim uMax : uMax = arrSrfDomU(1) Dim uStep : uStep = (uMax-uMin) / numSpans '------------------------------------------------------- ' Get V vals Dim arrSrfDomV : arrSrfDomV = Rhino.SurfaceDomain(strSrf,1) Dim vMin : vMin = arrSrfDomV(0) Dim vMax : vMax = arrSrfDomV(1) Dim vStep : vStep = (vMax-vMin) / numSpans '------------------------------------------------------- ' Create nodes Dim i,j Dim srfParam, arrPtEval, arrNormal For i = uMin To uMax Step uStep For j = vMin To vMax Step vStep arrPtEval = rhino.evaluateSurface( strSrf, Array(i,j) ) arrNormal = Rhino.SurfaceNormal( strSrf, Array(i,j) ) arrNormal = rhino.VectorScale( arrNormal, dblScale ) ' Rhino vector methods are based at (0,0,0) ' therefore we need to get the vector normal relative to the surface UV coord arrNormal = Rhino.VectorAdd( arrNormal,arrPtEval ) rhino.addLine arrPtEval, arrNormal Next Next rhino.enableRedraw True rhino.print "!!! SCRIPT COMPLETED !!!" End Sub

Example 02: Surface Panel Division – Triangles
Option Explicit 'Script written by www.supermanoeuvre.com Call srfPanelsTriangles() Sub srfPanelsTriangles() '------------------------------------------------------------------------------------------------------ ' USER INPUT Dim strSrf : strSrf = rhino.getObject("Gimme SURFACE object!", 8) If isNull(strSrf) Then Exit Sub Dim numSpans : numSpans = rhino.GetInteger("Gimme number of surface spans in each direction", 15, 6, 50) If isNull(numSpans) Then Exit Sub '------------------------------------------------------------------------------------------------------ ' SCRIPT BODY rhino.print "!!! SCRIPT STARTED !!!" rhino.enableRedraw False '------------------------------------------------------- ' Get U vals Dim arrSrfDomU : arrSrfDomU = Rhino.SurfaceDomain(strSrf,0) Dim uMin : uMin = arrSrfDomU(0) Dim uMax : uMax = arrSrfDomU(1) Dim uStep : uStep = (uMax-uMin) / numSpans '------------------------------------------------------- ' Get V vals Dim arrSrfDomV : arrSrfDomV = Rhino.SurfaceDomain(strSrf,1) Dim vMin : vMin = arrSrfDomV(0) Dim vMax : vMax = arrSrfDomV(1) Dim vStep : vStep = (vMax-vMin) / numSpans '------------------------------------------------------- ' Create nodes Dim i,j Dim arrEvalPt01, arrEvalPt02, arrEvalPt03, arrEvalPt04, arrEvalPt05, arrEvalPt06, arrCnrPts For i = uMin To uMax - uStep Step uStep For j = vMin To vMax - vStep Step vStep ' first triangle arrEvalPt01 = Rhino.EvaluateSurface( strSrf, Array(i,j) ) arrEvalPt02 = Rhino.EvaluateSurface( strSrf, Array(i,j+vStep) ) arrEvalPt03 = Rhino.EvaluateSurface( strSrf, Array(i+uStep,j) ) ' second triangle arrEvalPt04 = Rhino.EvaluateSurface( strSrf, Array(i+uStep,j) ) arrEvalPt05 = Rhino.EvaluateSurface( strSrf, Array(i+uStep,j+vStep) ) arrEvalPt06 = Rhino.EvaluateSurface( strSrf, Array(i,j+vStep) ) ' put corner points in an array arrCnrPts = Array( arrEvalPt01, arrEvalPt02, arrEvalPt03 ) Rhino.AddSrfPt arrCnrPts arrCnrPts = Array( arrEvalPt04, arrEvalPt05, arrEvalPt06 ) Rhino.AddSrfPt arrCnrPts Next ' end j loop Next ' end i loop rhino.enableRedraw True rhino.print "!!! SCRIPT COMPLETED !!!" End Sub

Example 03: Surface Panel Division – Quads
Option Explicit 'Script written by www.supermanoeuvre.com Call srfPanelsQuads() Sub srfPanelsQuads() '------------------------------------------------------------------------------------------------------ ' USER INPUT Dim strSrf : strSrf = rhino.getObject("Gimme SURFACE object!", 8) If isNull(strSrf) Then Exit Sub Dim numSpans : numSpans = rhino.GetInteger("Gimme number of surface spans in each direction", 15, 6, 50) If isNull(numSpans) Then Exit Sub '------------------------------------------------------------------------------------------------------ ' SCRIPT BODY rhino.print "!!! SCRIPT STARTED !!!" rhino.enableRedraw False '------------------------------------------------------- ' Get U vals Dim arrSrfDomU : arrSrfDomU = Rhino.SurfaceDomain(strSrf,0) Dim uMin : uMin = arrSrfDomU(0) Dim uMax : uMax = arrSrfDomU(1) Dim uStep : uStep = (uMax-uMin) / numSpans '------------------------------------------------------- ' Get V vals Dim arrSrfDomV : arrSrfDomV = Rhino.SurfaceDomain(strSrf,1) Dim vMin : vMin = arrSrfDomV(0) Dim vMax : vMax = arrSrfDomV(1) Dim vStep : vStep = (vMax-vMin) / numSpans '------------------------------------------------------- ' Create nodes Dim i,j Dim arrEvalPt01, arrEvalPt02, arrEvalPt03, arrEvalPt04, arrCnrPts For i = uMin To uMax - uStep Step uStep For j = vMin To vMax - vStep Step vStep ' define quad corners arrEvalPt01 = Rhino.EvaluateSurface( strSrf, Array(i,j) ) arrEvalPt02 = Rhino.EvaluateSurface( strSrf, Array(i,j+vStep) ) arrEvalPt03 = Rhino.EvaluateSurface( strSrf, Array(i+uStep,j+vStep) ) arrEvalPt04 = Rhino.EvaluateSurface( strSrf, Array(i+uStep, j) ) ' put corner points in an array arrCnrPts = Array( arrEvalPt01, arrEvalPt02, arrEvalPt03, arrEvalPt04 ) Rhino.AddSrfPt arrCnrPts Next ' end j loop Next ' end i loop rhino.enableRedraw True rhino.print "!!! SCRIPT COMPLETED !!!" End Sub

Example 04: Surface Panel Division – Hexagons
Option Explicit 'Script written by www.supermanoeuvre.com Call srfPanelsHexagons() Sub srfPanelsHexagons() '------------------------------------------------------------------------------------------------------ ' USER INPUT Dim arrNames(1) arrNames(0) = "CRVS" arrNames(1) = "SRFS" Dim strCmd : strCmd = rhino.GetString("How do u want your hexagons",, arrNames ) If isNull(strCmd) Then Exit Sub Dim strSrf : strSrf = rhino.getObject("Gimme SURFACE object!", 8) If isNull(strSrf) Then Exit Sub Dim numSpans : numSpans = rhino.GetInteger("Gimme number of surface spans in each direction", 15, 6, 50) If isNull(numSpans) Then Exit Sub '------------------------------------------------------------------------------------------------------ ' SCRIPT BODY rhino.print "!!! SCRIPT STARTED !!!" rhino.enableRedraw False '------------------------------------------------------- ' Get U vals Dim arrSrfDomU : arrSrfDomU = Rhino.SurfaceDomain(strSrf,0) Dim uMin : uMin = arrSrfDomU(0) Dim uMax : uMax = arrSrfDomU(1) Dim uStep : uStep = (uMax-uMin) / numSpans '------------------------------------------------------- ' Get V vals Dim arrSrfDomV : arrSrfDomV = Rhino.SurfaceDomain(strSrf,1) Dim vMin : vMin = arrSrfDomV(0) Dim vMax : vMax = arrSrfDomV(1) Dim vStep : vStep = (vMax-vMin) / numSpans '------------------------------------------------------- ' Create hexagons Dim i,j For i = 0 To numSpans -1 Step 1 For j = 0 To numSpans -1 Step 1 ReDim arrPtsCnr(6) If abs(j) Mod 2 Then arrPtsCnr(0) = Rhino.EvaluateSurface(strSrf, Array(uStep*i+uStep/3,vStep*j)) arrPtsCnr(1) = Rhino.EvaluateSurface(strSrf, Array(uStep*i+uStep/6,vStep*j+vStep)) arrPtsCnr(2) = Rhino.EvaluateSurface(strSrf, Array(uStep*i-uStep/6,vStep*j+vStep)) arrPtsCnr(3) = Rhino.EvaluateSurface(strSrf, Array(uStep*i-uStep/3,vStep*j)) arrPtsCnr(4) = Rhino.EvaluateSurface(strSrf, Array(uStep*i-uStep/6,vStep*j-vStep)) arrPtsCnr(5) = Rhino.EvaluateSurface(strSrf, Array(uStep*i+uStep/6,vStep*j-vStep)) arrPtsCnr(6) = arrPtsCnr(0) ' Add hexagon Select Case strCmd Case "CRVS" Rhino.AddPolyline arrPtsCnr Case "SRFS" addHex(arrPtsCnr) End Select Else If j>0 And j<numSpans Then ' get points arrPtsCnr(0) = Rhino.EvaluateSurface(strSrf, Array(uStep*.5+uStep*i+uStep/3,vStep*j)) arrPtsCnr(1) = Rhino.EvaluateSurface(strSrf, Array(uStep*.5+uStep*i+uStep/6,vStep*j+vStep)) arrPtsCnr(2) = Rhino.EvaluateSurface(strSrf, Array(uStep*.5+uStep*i-uStep/6,vStep*j+vStep)) arrPtsCnr(3) = Rhino.EvaluateSurface(strSrf, Array(uStep*.5+uStep*i-uStep/3,vStep*j)) arrPtsCnr(4) = Rhino.EvaluateSurface(strSrf, Array(uStep*.5+uStep*i-uStep/6,vStep*j-vStep)) arrPtsCnr(5) = Rhino.EvaluateSurface(strSrf, Array(uStep*.5+uStep*i+uStep/6,vStep*j-vStep)) arrPtsCnr(6) = arrPtsCnr(0) ' Add hexagon Select Case strCmd Case "CRVS" Rhino.AddPolyline arrPtsCnr Case "SRFS" addHex(arrPtsCnr) End Select End If End If Next ' end j loop Next ' end i loop rhino.enableRedraw True rhino.print "!!! SCRIPT COMPLETED !!!" End Sub Function addHex(PTS) ' This function establishes a centroid for the hexagon ' Then builds & groups the triangulated surfaces that make up each hex addHex = Null ' As points do not define a planar curve ' We need to calculate the centroid of the 6 points Dim i, arrPtCntr Dim arrSum : arrSum = Array(0,0,0) Dim counter : counter = 0 For i = 0 To ubound(PTS) arrSum = rhino.VectorAdd( arrSum, PTS(i) ) counter = counter + 1 Next ' Average position arrPtCntr = rhino.VectorDivide( arrSum, counter ) ' Make triangular surfaces that create a hexagon surface Dim j Dim strGroup ReDim arrSrfTmp(5) For j = 0 To ubound(PTS) - 1 ReDim arrPts(2) If j = 5 Then arrPts(0) = PTS(j) arrPts(1) = PTS(0) arrPts(2) = arrPtCntr arrSrfTmp(j) = rhino.addSrfPt( arrPts ) Else arrPts(0) = PTS(j) arrPts(1) = PTS(j+1) arrPts(2) = arrPtCntr arrSrfTmp(j) = rhino.addSrfPt( arrPts ) End If Next ' Assign some random colour Rhino.ObjectColor arrSrfTmp, 255 - ( 255 * 1 / rnd*255 ) ' group the new surface objects strGroup = Rhino.AddGroup Rhino.AddObjectsToGroup arrSrfTmp, strGroup End Function
About this entry
You’re currently reading “RhinoScript – Surfaces: Part 02”, an entry on supermanoeuvre
- Published:
- 01.05.09 / 10am
- Category:
- RhinoScript, Tutorials
- Tags:
- Post Navigation:
- « RhinoScript – Vectors
Introduction to Processing: Part 01 – Sketch & Drawing Modes »
Comments are closed
Comments are currently closed on this entry.