RhinoScript – Surfaces: Part 02

srfnorms

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

paneltriangles

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

panelquads

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

panelhexes

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