Batch Save Small
Windows only

Demonstrates how to recurse through a folder and save small every Rhino file using RhinoScript.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' BatchSaveSmall.rvb -- October 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

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Main subroutine
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub BatchSaveSmall()

  Dim sFolder, oFSO, oFolder

  sFolder = Rhino.BrowseForFolder(, "Select folder to recurse", "Batch SaveSmall")
  If IsNull(sFolder) Then Exit Sub

  Set oFSO = CreateObject("Scripting.FileSystemObject")
  Set oFolder = oFSO.GetFolder(sFolder)

  Call RecurseSaveSmall(oFolder)

  Call Rhino.DocumentModified(False)
  Call Rhino.Command("_-New _None", 0)
  Call Rhino.Print("Done!")

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' RecurseSaveSmall
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub RecurseSaveSmall(oFolder)

  Dim oFile, oSubFolder, dModified

  For Each oFile In oFolder.Files
    ' Save file modified date
    dModified = oFile.DateLastModified

    ' Do the "save small"
    Call DoSaveSmall(oFile.Path)

    ' Reset file modified date
    Call TouchDateModified(oFile.Path, dModified)
  Next

  ' If you want to recurse folders,
  ' just un-comment the following lines.
  'For Each oSubFolder In oFolder.SubFolders
  '  Call RecurseSaveSmall(oSubFolder)
  'Next

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' DoSaveSmall
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub DoSaveSmall(sPath)

  Dim aViews, sView

  If InStr(LCase(sPath), ".3dm") > 0 Then
    ' Open the file
    Call Rhino.DocumentModified(False)
    Call Rhino.Command("_-Open " & Chr(34) & sPath & Chr(34), 0)

    ' Set all of the viewports to wireframe before saving
    aViews = Rhino.ViewNames
    For Each sView In aViews
      Call Rhino.ViewDisplayMode(sView, 0)
    Next

    ' Save it
    Call Rhino.Command("_-SaveSmall _Enter", 0)
  End If

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' TouchDateModified
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub TouchDateModified(sPath, dModified)

  Dim oShell, oFolder, oFile
  Dim sDir, sFile, nPos

  nPos = InStrRev(sPath, "\")
  sDir = Left(sPath, nPos)
  sFile = Mid(sPath, nPos + 1)

  Set oShell = CreateObject("Shell.Application")
  Set oFolder = oShell.NameSpace(sDir)
  Set oFile = oFolder.ParseName(sFile)
  oFile.ModifyDate = dModified

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Rhino.AddStartupScript Rhino.LastLoadedScriptFile
Rhino.AddAlias "BatchSaveSmall", "_NoEcho _-RunScript (BatchSaveSmall)"