Site Tools


Batch Save Small

Developer: RhinoScript
Summary: Demonstrates how to recurse through a folder and “save small” every Rhino file

Question

I have several files that I would like to save small to save disk space. Is there a script to help automate this? Or, do I just have to open each model one at a time.

Answer

The following RhinoScript will recurse through a selected folder, open each Rhino model, and perform as save small operation.

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 ' 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)"


developer/scriptsamples/batchsavesmall.txt · Last modified: 2016/02/11 by sandy