Python Code – Mass Convert (GUI)
[codesyntax lang=”python”]
######################################################################################################
# Convert between 3d object formats using Vue
#
# - massconvert.py
# - By Mark Caldwell
# - Version 0.5.1
# - 17th June 2007
# - Copyright Mark Caldwell 2007
# - Tested with Vue 6 Infinite on a PC
#
# Requires wxPython to be installed in to Vue to use.
#
# How to use in 2 easy steps
#
# 1. Download this file onto your computer
#
# 2. Run the script then follow the in script help for
# more information
#
# Conversion options are those currently selected under
# File -> Export As
#
######################################################################################################
######################################################################################################
#
# Set up by importing libraries
#
######################################################################################################
import os # import os libraries
import sys
VuePythonPath = sys.path[1] # get the Vue python path
VuePythonFolder = os.path.abspath(os.path.join(VuePythonPath[0:VuePythonPath.find("Python")],"Python"))
wxPythonFolder = os.path.abspath(os.path.join(VuePythonFolder,"PythonLib/wx"))
os.chdir(wxPythonFolder)
import wx # import the wx libraries
import wx.html # import the wx html libraries
import string # import string libraries
import time # import time
# get the Vue Python Folder
VuePythonFolder,junk = os.path.split(VuePythonPath)
# Get the Vue Root Path
VueRootPath,junk = os.path.split(VuePythonFolder)
######################################################################################################
#
# Create lists of file types that can be imported and exported
#
######################################################################################################
InExtensions=['3dmf','3ds','cob','dxf','lwo','obj','pz3','raw','shd','skp','vob']
OutExtensions=['3ds','c4d','dxf','lwo','obj','shd','vob']
######################################################################################################
#
# Class for the Main GUI
#
######################################################################################################
class MassConvertApp(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent = None, id = -1,
title = "MassConvert",
size = (600,400),
style = (wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | wx.RESIZE_BOX | wx.MAXIMIZE_BOX)))
self.SetFont(wx.Font(10,wx.DEFAULT,wx.NORMAL,wx.NORMAL)) # Set Default Font
BoldFont=wx.Font(10,wx.DEFAULT,wx.NORMAL,wx.BOLD) # Create Bold Font for later use
self.ClearBackground()
# Set Some variables to use later
self.inFilepath = VueRootPath
self.outFilepath = VueRootPath
self.out_vob=0
self.InExtensionsBox=[]
self.OutExtensionsBox=[]
panel = wx.Panel(self) # Create Panel
panel.SetBackgroundColour('White')
statusBar = self.CreateStatusBar() # Create Status Bar
# Create Menu Structure
menuBar = wx.MenuBar()
menu1 = wx.Menu()
in_dir=menu1.Append(wx.NewId(), "&Import...", "Directory to import files from")
self.Bind(wx.EVT_MENU, self.OnIn, in_dir)
out_dir=menu1.Append(wx.NewId(), "&Export...", "Directory to export files to")
self.Bind(wx.EVT_MENU, self.OnOut, out_dir)
menu1.AppendSeparator()
exit=menu1.Append(wx.NewId(), "Exit")
self.Bind(wx.EVT_MENU, self.OnExit, exit)
menuBar.Append(menu1, "&File")
menu2 = wx.Menu()
helpmenu=menu2.Append(wx.NewId(), "&Help", "Help using MassConvert")
self.Bind(wx.EVT_MENU, self.OnHelp, helpmenu)
about=menu2.Append(wx.NewId(), "&About", "About MassConvert")
self.Bind(wx.EVT_MENU, self.OnAbout, about)
menuBar.Append(menu2, "&Help")
self.SetMenuBar(menuBar)
CheckBoxSize=(90, 20)
InColumnX=35
OutColumnX=180
inc=20
StartY=60
# Create File Path Text Display
text=wx.StaticText(panel,-1,"Import File Path:",(10,10))
text.SetFont(BoldFont)
self.InFilePathText=wx.StaticText(panel,-1,self.inFilepath,(120,10))
text=wx.StaticText(panel,-1,"Export File Path:",(10,10+inc))
text.SetFont(BoldFont)
self.OutFilePathText=wx.StaticText(panel,-1,self.outFilepath,(120,10+inc))
# Create File Import / Export Count Display
self.NumberOfFilesImportedLabel=wx.StaticText(panel,-1,'',(300,60))
self.NumberOfFilesImportedLabel.SetFont(BoldFont)
self.NumberOfFilesImported=wx.StaticText(panel,-1,'',(470,60))
self.NumberOfFilesExportedLabel=wx.StaticText(panel,-1,'',(300,80))
self.NumberOfFilesExportedLabel.SetFont(BoldFont)
self.NumberOfFilesExported=wx.StaticText(panel,-1,'',(470,80))
self.ConvertTimeLabel=wx.StaticText(panel,-1,'',(300,100))
self.ConvertTimeLabel.SetFont(BoldFont)
self.ConvertTime=wx.StaticText(panel,-1,'',(470,100))
# Create Check Boxes for Import Types
y=StartY
text=wx.StaticText(panel,-1,'Input File Types: ',(10,y))
text.SetFont(BoldFont)
y=y+inc
x=InColumnX
for Extension in InExtensions:
Box=wx.CheckBox(panel, -1, Extension, (x, y), CheckBoxSize)
self.InExtensionsBox.append((Extension,Box))
y=y+inc
yBottom=y+inc+inc
# Create Check Boxes for Output Type
y=StartY
x=OutColumnX
text=wx.StaticText(panel,-1,'Output File Types: ',(155,y))
text.SetFont(BoldFont)
y=y+inc
for Extension in OutExtensions:
Box=wx.CheckBox(panel, -1, Extension, (x, y), CheckBoxSize)
self.OutExtensionsBox.append((Extension,Box))
y=y+inc
y=y+inc+inc
# Create Convert Button
self.button = wx.Button(panel, -1, 'Convert', pos=(OutColumnX, y))
self.Bind(wx.EVT_BUTTON, self.OnClickConvert, self.button)
self.button.SetDefault()
self.CenterOnParent() # Center the GUI on the Vue Window
self.ClearBackground()
self.Show(True) # Show the GUI
######################################################################################################
#
# When the convert button is clicked
#
######################################################################################################
def OnClickConvert(self, event):
OutExtensionList=[]
InExtensionList=[]
objImportCount=0
objExportCount=0
startTime=time.time()
for Extension,Check in self.InExtensionsBox:
if Check.IsChecked():
InExtensionList.append(Extension)
for Extension,Check in self.OutExtensionsBox:
if Check.IsChecked():
OutExtensionList.append(Extension)
filenames=os.listdir(self.inFilepath)
for filename in filenames:
for extensionin in InExtensionList:
if '.'+extensionin in filename:
fullPath=self.inFilepath+'/'+filename
obj=ImportObject(fullPath)
if obj:
objImportCount=objImportCount+1
for extensionout in OutExtensionList:
newFileName=self.outFilepath+'/'+filename.replace('.'+extensionin,'.'+extensionout)
if os.path.exists(newFileName)!=True:
SelectOnly(obj)
ExportObject (newFileName)
objExportCount=objExportCount+1
SelectOnly(obj)
Delete()
endTime=time.time()
elapsedTime=endTime-startTime
self.NumberOfFilesImportedLabel.SetLabel('Number of Files Imported:')
self.NumberOfFilesExportedLabel.SetLabel('Number of Files Exported:')
self.ConvertTimeLabel.SetLabel('Time:')
self.NumberOfFilesImported.SetLabel(str(objImportCount))
self.NumberOfFilesExported.SetLabel(str(objExportCount))
self.ConvertTime.SetLabel(str(int(elapsedTime))+' seconds')
self.Raise()
######################################################################################################
#
# When exit and close are clicked
#
######################################################################################################
def OnExit(self, event):
self.Close()
def OnCloseMe(self, event):
self.Close(True)
def OnCloseWindow(self, event):
self.Destroy()
######################################################################################################
#
# Read the Input Directory
#
######################################################################################################
def OnIn(self, event):
dialog = wx.DirDialog(None, "Choose a directory to import from:",self.inFilepath,
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
self.inFilepath = dialog.GetPath()
self.InFilePathText.SetLabel(self.inFilepath)
dialog.Destroy()
######################################################################################################
#
# Read the Export Directory
#
######################################################################################################
def OnOut(self, event):
dialog = wx.DirDialog(None, "Choose a directory to export to:",self.outFilepath,
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
self.outFilepath=dialog.GetPath()
self.OutFilePathText.SetLabel(self.outFilepath)
dialog.Destroy()
######################################################################################################
#
# When About is clicked
#
######################################################################################################
def OnAbout(self, event):
dialog = MassConvertAbout(self)
dialog.ShowModal()
dialog.Destroy()
######################################################################################################
#
# When Help is clicked
#
######################################################################################################
def OnHelp(self, event):
dialog = MassConvertHelp(self)
dialog.ShowModal()
dialog.Destroy()
######################################################################################################
#
# About Window
#
######################################################################################################
class MassConvertAbout(wx.Dialog):
text = '''
<html>
<body bgcolor="#ffffff">
<center><table bgcolor="#ffffff" width="100%" cellspacing="0"
cellpadding="0" border="1">
<tr>
<td align="center"><h1>MassConvert</h1></td>
</tr>
</table>
</center>
<p align="center">Version 0.5.0</p>
<p align="center">http://www.impworks.co.uk/</p>
<p align="center">Copyright Mark Caldwell 2007</p>
<p align="center">Tested with Vue 6 Infinite on a PC</p>
</body>
</html>
'''
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, 'About MassConvert',
size=(440, 300) )
html = wx.html.HtmlWindow(self)
html.SetPage(self.text)
button = wx.Button(self, wx.ID_OK, "Okay")
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(html, 1, wx.EXPAND|wx.ALL, 5)
sizer.Add(button, 0, wx.ALIGN_CENTER|wx.ALL, 5)
self.SetSizer(sizer)
self.Layout()
######################################################################################################
#
# Help Window
#
######################################################################################################
class MassConvertHelp(wx.Dialog):
text = '''
<html>
<body bgcolor="#ffffff">
<center><table bgcolor="#ffffff" width="100%" cellspacing="0"
cellpadding="0" border="1">
<tr>
<td align="center"><h1>MassConvert Help</h1></td>
</tr>
</table>
</center>
<p>This Vue python script reads 3d object files from a selected import directory and saves them in new formats to
a selected export directory. If it finds a file of the same name as one it is trying to create already exists in the
export directory it doesn't export the file.</p>
<p>Select the directory to import files from in the <em>File</em> menu with <em>Import...</em>.</p>
<p>Select the directory to export files from in the <em>File</em> menu with <em>Export...</em>.</p>
<p>Select the types of file to import and the types of file to export with the check boxes.</p>
<p>Once you've made your selections click the <em>Convert</em> button and Vue will import the selected files
and export them in the selected formats.</p>
<p>The export will use the settings from the last export you did with Vue.</p>
<p>When converting some file formats (such as poser) Vue will ask you to make choices during the import.</p>
</body>
</html>
'''
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, 'MassConvert Help',
size=(440, 550) )
html = wx.html.HtmlWindow(self)
html.SetPage(self.text)
button = wx.Button(self, wx.ID_OK, "Close")
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(html, 1, wx.EXPAND|wx.ALL, 5)
sizer.Add(button, 0, wx.ALIGN_CENTER|wx.ALL, 5)
self.SetSizer(sizer)
self.Layout()
######################################################################################################
#
# Start of Program
#
######################################################################################################
app = None # Clear out any previous instances of app
del app # destroy it completely
app = wx.PySimpleApp() # Create a new wx application instance
frame = MassConvertApp() # Create the GUI instance
app.MainLoop() # Execute wx
Refresh()
[/codesyntax]
Python Code – Mass Convert (No GUI)
[codesyntax lang=”python”]
#******************************************************
# Convert between two formats using Vue
#
# - massconvert.py
# - By Mark Caldwell
# - Version 0.5.1 (No GUI)
# - 6th August 2007
# - Copyright Mark Caldwell 2007
# - Tested with Vue 6 Infinite Pre Release
#
# How to use in 4 easy steps
#
# 1. Download this file onto your computer
#
# 2. Place the files to be converted in the same directory
# as the script
#
# 3. Edit the script to change output_directory. This is
# the directory the files will be put in and is relative
# to the root directory of your vue installation.
# eg if Vue python is in to:
# C:\Program Files\e-on software\Vue 6 Infinite\Python
# and you want to save the files to:
# C:\Program Files\e-on software\Vue 6 Infinite\Python\Scripts\outfiles
# Change output directory to:
# output_directory='\Scripts\outfiles'
#
# Make sure the directory you want to save to exists.
# If it doesn't the files will not be saved.
#
# 4. Then run script and wait for it to work supplying
# responses when prompted.
#
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
# Do not run using quick load options
#
# Available input formats are:
# 3dmf
# 3ds
# cob
# dxf
# lwo
# obj
# pz3
# raw
# shd
# skp
# vob
#
# Available output formats are:
# 3ds
# c4d
# dxf
# lwo
# obj
# shd
# vob
#
# Conversion options are those currently selected under
# File -> Export As
#
#******************************************************
#----------------------------------------------
# Configuration: Set these to alter end result
#----------------------------------------------
# Change the line below to change where files are saved
# see instructions above for more details
output_directory='/scripts/massconvert'
#----------------------------------------------
# Internal Variables Set Up: Don't alter these
#----------------------------------------------
import os
import string
# get the Vue python path
VuePythonPath = sys.path[1]
# get the Vue Python Folder
VuePythonFolder,junk = os.path.split(VuePythonPath)
# Get the Vue Root Path
VueRootPath,junk = os.path.split(VuePythonFolder)
# Set where to put the output files
output_path=VuePythonFolder+output_directory
obj=[]
objectlist=[]
extensionin='obj'
extensionout='3ds'
#---------------------------------------------------
# Get User Input
#---------------------------------------------------
extensionin=Prompt('File extension of files to import\nobj 3ds lwo c4d cob dxf pz3 shd vob',extensionin,true,'Input File Extension')
extensionout=Prompt('File extension on files to output\nobj 3ds lwo c4d cob dxf shd vob',extensionout,true,'Output File Extension')
#---------------------------------------------------
# Main Script Body
#---------------------------------------------------
# Load objects
filenames=os.listdir(os.curdir)
for filename in filenames:
if '.'+extensionin in filename:
obj=ImportObject(filename)
newfilename=output_path+'/'+filename.replace('.'+extensionin,'.'+extensionout)
print filename+" to "+newfilename
SelectOnly(obj)
print ExportObject (newfilename)
Delete()
Refresh()
[/codesyntax]

