WARNING: You're viewing the Rhino WIP version of this page! View the current version instead.

Airfoil Shapes

How to read point files that describe airfoils and create interpolated curves using RhinoScript.


Option Explicit

' Subroutine to import "Selig" formatted airfoil shapes
Sub ImportAirfoil

  ' Local constants
  Const ForReading = 1

  ' Local variables
  Dim objFSO, objFile
  Dim strFileName, strAirfoil, strLine, strCurve
  Dim arrPt, arrPoints(), nCount

  ' Prompt for an airfoil data file
  strFileName = Rhino.OpenFileName("Open", "Airfoil Data File (*.dat)|*.dat|")
  If IsNull(strFileName) Then Exit Sub

  ' Create a file system object
  Set objFSO = CreateObject("Scripting.FileSystemObject")

  ' Open the data file for reading
  On Error Resume Next
  Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
  If Err Then
    MsgBox Err.Description
    Exit Sub
  End If  

  ' Read the name of the airfoil
  strAirfoil = objFile.ReadLine

  ' Read through the file looking for point coordinates
  nCount = 0
  Do While objFile.AtEndOfStream <> True
    strLine = objFile.ReadLine
    ' Convert the string to a point
    arrPt = PointFromString(strLine)
    If IsArray(arrPt) Then
      ReDim Preserve arrPoints(nCount)
      arrPoints(nCount) = arrPt
      nCount = nCount + 1
    End If

  ' Close the curve
  ReDim Preserve arrPoints(nCount)
  arrPoints(nCount) = arrPoints(0)

  ' Add the named interpolated curve
  If IsArray(arrPoints) Then
    strCurve = Rhino.AddInterpCurveEx(arrPoints)
    Rhino.ObjectName strCurve, strAirfoil
  End If

  ' Close the file and release objects
  Set objFile = Nothing
  Set objFSO = Nothing

End Sub

' Function to generate a point from a string
Function PointFromString( strLine )
  Dim arrTokens, arrPoint, x, y
  PointFromString = Null
  If VarType(strLine) = vbString Then
    strLine = Trim(strLine)
    arrTokens = Rhino.StrTok(strLine, " ")
    If IsArray(arrTokens) And UBound(arrTokens) = 1 Then
      x = CDbl(arrTokens(0))
      y = CDbl(arrTokens(1))
      arrPoint = Array(x, y, 0.0)
      PointFromString = arrPoint
    End If
  End If
End Function