Maxscript image file handling
When you are working with larger numbers of files in folders you want to be clever about getting them. I used to have a lots of different functions all with their own identical or very similar file processing. Often I’d hardcode in extensions (bad) and sometimes I’d want to search for files with a keyword.
fn texturehandling texturefolder= ( image_diff_files = #() image_type = ".tga" -- Get all the TGA diffuse files diff_files = textureFolder + "*diff*" + image_type thefiles = getfiles diff_files for f in thefiles do ( append image_diff_files (uppercase(getfilenamefile f)) ) image_diff_files -- return this )
It works, but it has several issues. It assumes TGA files only, and it’s looking for filenames with “diff” as part of the filename. What if I want to look for specular maps with arbitrary names saved at BMP?
Define this in some common script header (so that it’s easily to find and extend):
textureTypes = #("*.tga","*.png","*.bmp","*.tif")
Then have this useful function:
-- Function to return an array of supported image files in a folder -- Takes an optional search string fn returnImageFiles inputFolder optionalFilter:"" = ( theImageFiles = #() if optionalfilter == unsupplied then optionalfilter = "" search_files = inputFolder + optionalfilter -- Get array of image files in a given folder for ft = 1 to textureTypes.count do ( tempfilelist = getfiles (search_files + textureTypes[ft]) join theImageFiles tempfilelist ) theImageFiles -- return this. )
Then call it with this:
image_all_files = returnImageFiles textureFolder optionalFilter:"" image_diff_files = returnImageFiles textureFolder optionalFilter:"*diff*"
There are a few minor issues that I should clean up
- I could have used a better name than optionalFilter, but it does the job.
- I don’t check that the texture folder name ends with a slash
- It doesn’t handle recursive folders
By the way, optional parameters in maxscript are very useful, though a little tricky at first.