Drawing Steel Shapes
Windows only

Demonstrates how to draw steel shapes using RhinoScript.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Steel.rvb -- September 2008
' If this code works, it was written by Dale Fugier.
' If not, I don't know who wrote it.
' Works with Rhino 4.0.

Option Explicit

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
' Draws Steel Wide Flanges
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
Sub SteelWideFlange

  Dim cmdname, configfile, section
  Dim filename, entries, entry, value, data, bname
  Dim ip, d, b, tf, tw, c
  Dim p0, p1, p2, p3
  Dim e0, e1, e2, e3, a0

  cmdname = "Steel Wide Flange"
  configfile = "STEEL.INI"
  section = "STEEL_WIDE_FLANGE"

  filename = Rhino.FindFile(configfile)
  If IsNull(filename) Then
    Call MsgBox("Unable to locate " & configfile & ".", 17, cmdname)
    Exit Sub
  End If

  entries = Rhino.GetSettings(filename, section)
  If IsNull(entries) Then Exit Sub

  entry = Rhino.ListBox(entries, "Select a wide flange", cmdname)
  If IsNull(entry) Then Exit Sub

  bname = Replace(entry, ".", "_")

  If Rhino.IsBlock(bname) = False Then

    value = Rhino.GetSettings(filename, section, entry)
    If IsNull(value) Then Exit Sub

    data = Rhino.Strtok(value, ", ;")
    If IsNull(data) Or (UBound(data) <> 3) Then Exit Sub

    ' Hide the dirty work      
    Call Rhino.EnableRedraw(False)

    ip = Array(0,0,0)
    d = CDbl(data(0))
    b = CDbl(data(1))
    tf = CDbl(data(2))
    tw = CDbl(data(3))

    ' Top
    p0 = Rhino.Polar(Rhino.Polar(ip, 0, b/2), 270, tf)
    p1 = Rhino.Polar(ip, 0, b/2)
    p2 = Rhino.Polar(ip, 180, b/2)
    p3 = Rhino.Polar(p0, 180, b)
    e0 = Rhino.AddPolyline(Array(p0, p1, p2, p3))

    ' Bottom
    c = Rhino.Polar(ip, 270, d/2)
    e1 = Rhino.MirrorObject(e0, c, Rhino.Polar(c, 0, 1), True)

    ' Right side
    p1 = Rhino.Polar(p0, 180, (b-tw)/2)
    p2 = Rhino.Polar(p1, 270, (d-(tf*2)))
    p3 = Rhino.Polar(p2, 0, (b-tw)/2)
    e2 = Rhino.AddPolyline(Array(p0, p1, p2, p3))
    Call Rhino.Command("_-FilletCorners _SelID " & e2 & " _Enter " & CStr(0.9*tf), 0)

    ' Left side
    e3 = Rhino.MirrorObject(e2, c, ip, True)

    ' Join
    a0 = Rhino.JoinCurves(Array(e0, e1, e2, e3), True)

    ' Create the block
    Call Rhino.SelectObjects(a0)
    Call Rhino.Command("_-Block 0 " & Chr(34) & bname & Chr(34) & " _Enter _Enter _Enter", 0)

    ' Delete the block inserted by the Block command
    Call Rhino.DeleteObjects(Rhino.LastCreatedObjects)

    ' Enable redrawing
    Call Rhino.EnableRedraw(True)

  End If

  ' Insert the block
  Call Rhino.Command("_-Insert " & Chr(34) & bname & Chr(34) & " _Block", 0)

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
' Draws Steel Channels
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
Sub SteelChannel

  Dim cmdname, configfile, section
  Dim filename, entries, entry, value, data, bname
  Dim ip, d, b, tf, tw, tip
  Dim p0, p1, p2, p3, p4, p5
  Dim e0, e1, a0

  cmdname = "Steel Channel"
  configfile = "STEEL.INI"
  section = "STEEL_CHANNEL"

  filename = Rhino.FindFile(configfile)
  If IsNull(filename) Then
    Call MsgBox("Unable to locate " & configfile & ".", 17, cmdname)
    Exit Sub
  End If

  entries = Rhino.GetSettings(filename, section)
  If IsNull(entries) Then Exit Sub

  entry = Rhino.ListBox(entries, "Select a channel", cmdname)
  If IsNull(entry) Then Exit Sub

  bname = Replace(entry, ".", "_")

  If Rhino.IsBlock(bname) = False Then

    value = Rhino.GetSettings(filename, section, entry)
    If IsNull(value) Then Exit Sub

    data = Rhino.Strtok(value, ", ;")
    If IsNull(data) Or (UBound(data) <> 3) Then Exit Sub

    ' Hide the dirty work      
    Call Rhino.EnableRedraw(False)

    ip = Array(0,0,0)
    d = CDbl(data(0))
    b = CDbl(data(1))
    tf = CDbl(data(2))
    tw = CDbl(data(3))
    tip = tf * 0.7

    ' Top
    p0 = Rhino.Polar(Rhino.Polar(ip, 90, d/2), 0, b)
    p1 = Rhino.Polar(ip, 90, d/2)
    p2 = Rhino.Polar(ip, 270, d/2)
    p3 = Rhino.Polar(p0, 270, d)
    e0 = Rhino.AddPolyline(Array(p0, p1, p2, p3))

    ' Right
    p1 = Rhino.Polar(p0, 270, tip)
    p2 = Rhino.Polar(Rhino.Polar(p0, 180, b-tw), 270, tf)
    p3 = Rhino.Polar(p2, 270, d-(tf*2))
    p4 = Rhino.Polar(Rhino.Polar(p0, 270, d), 90, tip)
    p5 = Rhino.Polar(p0, 270, d)
    e1 = Rhino.AddPolyline(Array(p0, p1, p2, p3, p4, p5))
    Call Rhino.Command("_-FilletCorners _SelID " & e1 & " _Enter " & CStr(0.9*tip), 0)

    ' Join
    a0 = Rhino.JoinCurves(Array(e0, e1), True)

    ' Create the block
    Call Rhino.SelectObjects(a0)
    Call Rhino.Command("_-Block 0 " & Chr(34) & bname & Chr(34) & " _Enter _Enter _Enter", 0)

    ' Delete the block inserted by the Block command
    Call Rhino.DeleteObjects(Rhino.LastCreatedObjects)

    ' Enable redrawing
    Call Rhino.EnableRedraw(True)

  End If

  ' Insert the block
  Call Rhino.Command("_-Insert " & Chr(34) & bname & Chr(34) & " _Block", 0 )

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
' Draws Steel Angles
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
Sub SteelAngle

  Dim cmdname, configfile, section, tsection
  Dim filename, entries, entry, value, data, bname
  Dim tentries, tentry, tvalue
  Dim ip, xl, yl, thk
  Dim p0, p1, p2, p3, p4
  Dim e0, e1, a0

  cmdname = "Steel Angle"
  configfile = "STEEL.INI"
  section = "STEEL_ANGLE"
  tsection = "STEEL_ANGLE_THICKNESS"

  filename = Rhino.FindFile(configfile)
  If IsNull(filename) Then
    Call MsgBox("Unable to locate " & configfile & ".", 17, cmdname)
    Exit Sub
  End If

  entries = Rhino.GetSettings(filename, section)
  If IsNull(entries) Then Exit Sub

  entry = Rhino.ListBox(entries, "Select an angle", cmdname)
  If IsNull(entry) Then Exit Sub

  tentries = Rhino.GetSettings(filename, tsection)
  If IsNull(tentries) Then Exit Sub

  tentry = Rhino.ListBox(tentries, "Select an angle thickness", cmdname)
  If IsNull(tentry) Then Exit Sub

  tvalue = Rhino.GetSettings(filename, tsection, tentry)
  If IsNull(value) Then Exit Sub

  bname = Replace(entry, ".", "_") & Replace(tvalue, ".", "_")

  If Rhino.IsBlock(bname) = False Then

    value = Rhino.GetSettings(filename, section, entry)
    If IsNull(value) Then Exit Sub

    data = Rhino.Strtok(value, ", ;")
    If IsNull(data) Or (UBound(data) <> 1) Then Exit Sub

    ' Hide the dirty work      
    Call Rhino.EnableRedraw(False)

    ip = Array(0,0,0)
    xl = CDbl(data(0))
    yl = CDbl(data(1))
    thk = CDbl(tvalue)

    ' Top
    p0 = Rhino.Polar(ip, 90, yl)
    p1 = Rhino.Polar(ip, 0, xl)
    e0 = Rhino.AddPolyline(Array(ip, p0, ip, p1))

    ' Right
    p1 = Rhino.Polar(p0, 0, thk)
    p2 = Rhino.Polar(p1, 270, yl - thk)
    p3 = Rhino.Polar(p2, 0, xl - thk)
    p4 = Rhino.Polar(p3, 270, thk)
    e1 = Rhino.AddPolyline(Array(p0, p1, p2, p3, p4))
    Call Rhino.Command("_-FilletCorners _SelID " & e1 & " _Enter " & CStr(0.9*thk), 0 )

    ' Join
    a0 = Rhino.JoinCurves(Array(e0, e1), True)

    ' Create the block
    Call Rhino.SelectObjects(a0)
    Call Rhino.Command("_-Block 0 " & Chr(34) & bname & Chr(34) & " _Enter _Enter _Enter", 0)

    ' Delete the block inserted by the Block command
    Call Rhino.DeleteObjects(Rhino.LastCreatedObjects)

    ' Enable redrawing
    Call Rhino.EnableRedraw(True)

  End If

  ' Insert the block
  Call Rhino.Command("_-Insert " & Chr(34) & bname & Chr(34) & " _Block", 0 )

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
' Draws Steel T-Sections
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
Sub SteelTSection

  Dim cmdname, configfile, section
  Dim filename, entries, entry, value, data, bname
  Dim ip, d, b, tf, tw, tip
  Dim p0, p1, p2, p3, p4, p5
  Dim e0, e1, e2, e3, a0

  cmdname = "Steel T-Sections"
  configfile = "STEEL.INI"
  section = "STEEL_TSECTION"

  filename = Rhino.FindFile(configfile)
  If IsNull(filename) Then
    Call MsgBox("Unable to locate " & configfile & ".", 17, cmdname)
    Exit Sub
  End If

  entries = Rhino.GetSettings(filename, section)
  If IsNull(entries) Then Exit Sub

  entry = Rhino.ListBox(entries, "Select a channel", cmdname)
  If IsNull(entry) Then Exit Sub

  bname = Replace(entry, ".", "_")

  If Rhino.IsBlock(bname) = False Then

    value = Rhino.GetSettings(filename, section, entry)
    If IsNull(value) Then Exit Sub

    data = Rhino.Strtok(value, ", ;")
    If IsNull(data) Or (UBound(data) <> 3) Then Exit Sub

    ' Hide the dirty work      
    Call Rhino.EnableRedraw(False)

    ip = Array(0,0,0)
    d = CDbl(data(0))
    b = CDbl(data(1))
    tf = CDbl(data(2))
    tw = CDbl(data(3))

    ' Top
    p0 = Rhino.Polar(Rhino.Polar(ip, 0, b/2), 270, tf)
    p1 = Rhino.Polar(ip, 0, b/2)
    p2 = Rhino.Polar(ip, 180, b/2)
    p3 = Rhino.Polar(p0, 180, b)
    e0 = Rhino.AddPolyline(Array(p0, p1, p2, p3))

    ' Right
    p1 = Rhino.Polar(p0, 180, (b-tw)/2)
    p2 = Rhino.Polar(p1, 270, d-tf)
    p3 = Rhino.Polar(p2, 270, d-(tf*2))
    e1 = Rhino.AddPolyline(Array(p0, p1, p2, p3))
    Call Rhino.Command("_-FilletCorners _SelID " & e1 & " _Enter " & CStr(0.9*tf), 0)

    ' Mirror left
    e2 = Rhino.MirrorObject(e1, ip, Rhino.Polar(ip, 270, 1), True)

    ' Bottom
    e3 = Rhino.AddPolyline(Array(p3, Rhino.Polar(p3, 180, tw)))

    ' Join
    a0 = Rhino.JoinCurves(Array(e0, e1, e2, e3), True)

    ' Create the block
    Call Rhino.SelectObjects(a0)
    Call Rhino.Command("_-Block 0 " & Chr(34) & bname & Chr(34) & " _Enter _Enter _Enter", 0)

    ' Delete the block inserted by the Block command
    Call Rhino.DeleteObjects(Rhino.LastCreatedObjects)

    ' Enable redrawing
    Call Rhino.EnableRedraw(True)

  End If

  ' Insert the block
  Call Rhino.Command("_-Insert " & Chr(34) & bname & Chr(34) & " _Block", 0 )

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
' Startup and Aliases
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''    
Rhino.AddStartupScript Rhino.LastLoadedScriptFile
Rhino.AddAlias "SteelWideFlange", "_NoEcho _-RunScript (SteelWideFlange)"
Rhino.AddAlias "SteelChannel", "_NoEcho _-RunScript (SteelChannel)"
Rhino.AddAlias "SteelAngle", "_NoEcho _-RunScript (SteelAngle)"
Rhino.AddAlias "SteelTSection", "_NoEcho _-RunScript (SteelTSection)"