You can use symbolic pathnames in the form $<name> anywhere a filename can be supplied to MAXScript.
This support was added in 3ds Max 4 and was largely enhanced in 3ds Max 9.
Any filename you provide to MAXScript can begin with a '$' followed by one of the symbolic directory names below.
The following symbolic names are recognized:
| Index | Symbolic Name | Directory | 
|---|---|---|
| 1 | $max | Main 3ds Max executable directory | 
| 2 | $maps | First directory in Maps directory config* | 
| 3 | $scenes | 3ds Max Scenes directory | 
| 4 | $fonts | Fonts directory | 
| 5 | $imports | File Imports directory | 
| 6 | $exports | File Exports directory | 
| 7 | $sounds | Sounds directory | 
| 8 | $matlibs | Material Libraries directory | 
| 9 | $scripts | Scripts directory | 
| 10 | $startupScripts | Auto-load startup scripts directory | 
| 11 | $plugins | First in the Plug-ins directory config* | 
| 12 | $plugcfg | Plugin configurations directory | 
| 13 | $images | Images directory | 
| 14 | $ui | User Interface files directory | 
| 15 | $macroScripts | macroScripts in UI directory | 
| 16 | $web | Web downloads directory | 
| 17 | $temp | System temp directory | 
| 18 | $renderPresets | Render presets directory | 
| 19 | $help | Help files directory | 
| 20 | $expressions | Expressions directory | 
| 21 | $previews | Previews directory | 
| 22 | $maxstart | Directory of MAXSTART.MAX | 
| 23 | $vpost | Video post directory | 
| 24 | $drivers | Drivers directory | 
| 25 | $autoback | Autobackup directory | 
| 26 | $marketDefaults | Market Defaults directory | 
| 27 | $icons | Icons directory | 
| 28 | $maxSysIcons | System icons directory | 
| 29 | $renderOutput | Render output directory | 
| 30 | $animation | Animations directory | 
| 31 | $archives | Archives directory | 
| 32 | $photometrics | Photometric files directory | 
| 33 | $renderAssets | Render Assets directory | 
| 34 | $userScripts | User Scripts directory | 
| 35 | $userMacros | User Macroscripts directory | 
| 36 | $userStartupScripts | User Startup Scripts directory | 
| 37 | $userIcons | User Icons directory | 
| 38 | $maxData | Max Data (Root) directory | 
| 39 | $downloads | Downloads directory | 
| 40 | $proxies | Bitmap Proxies directory | 
| 41 | $assemblies | Assemblies directory | 
| 42 | $hardwareShadersCache | Hardware shaders directory | 
| 43 | $plugcfg_ln | Plugcfg_ln directory | 
| 44 | $ui_ln | UI_LN directory | 
| 45 | $autodeskcloud | Autodesk cloud directory | 
| 46 | $userStartupTemplates | Startup templates directory | 
| 47 | $privateExchangeStoreInstallPath | Private Exchange Store install directory. Note: this is now an alias for $privatePluginPackageInstallPath, but is retained for backwards compatibility. | 
| 48 | $publicExchangeStoreInstallPath | Public Exchange Store install directory. Note: this is now an alias for $publicPluginPackageInstallPath, but is retained for backwards compatibility. | 
| 49 | $systemImage | System scene images directory | 
| 50 | $systemPhotometric | Photometric light definition (.ies) file directory | 
| 51 | $systemSound | System scene sound assets directory | 
| 52 | $pageFile | Temporary page file directory (in 3ds Max 2018.4 Update and later). | 
| 53 | $fluidSimulations | Fluid simulation file cache location (in 3ds Max 2020 Update and later). | 
| 54 | $userSettings | User settings location (in 3ds Max 2020 Update and later). | 
| 55 | $userTools | User settings for 3rd party tools (in 3ds Max 2020 Update and later). | 
| 56 | $privatePluginPackageInstallPath | Install location for private plugin bundle packages (in 3ds Max 2020 Update and later). | 
| 57 | $publicPluginPackageInstallPath | Install location for public plugin bundle packages (in 3ds Max 2020 Update and later). | 
| 58 | $plugindata | Plug-in data location | 
| 59 | $presets | Particle Flow presets location (in 3ds Max 2022 and later). | 
Please note that these are similar to the 3ds Max System Directories filetype_names which start with a "#"and are used as arguments to the GetDir() and SetDir() methods.
The following example will open the file "foo.ms" in the current 3ds Max Scripts directory.
EXAMPLE
fileIn "$scripts\foo.ms"
In 3ds Max 9 and higher , the $maps and $plugins symbolic pathnames can also specify an index. In this case, the indexed directory will be used.
EXAMPLE
"$maps[2]\\mybitmap.tga"
When no index is provided, the first map resp. plugins path will be used.
In 3ds Max 9 and higher, the SymbolicPaths struct provides methods to access existing and define new symbolic paths:
symbolicPaths.numPaths()Returns the number of symbolic path names. This includes both system and user-defined path names
symbolicPaths.getPathName<index>Returns the indexed symbolic path name.
EXAMPLE
for i =1 to symbolicPaths.numPaths() do
format "% : %\n" i (symbolicPaths.getPathName i)
symbolicPaths.isPathName <string>Returns true if the string corresponds to a symbolic path name, false otherwise.
EXAMPLE
symbolicPaths.isPathName "$maps"
true
symbolicPaths.isPathName "$map"
false
symbolicPaths.getPathValue {<index> | <string>}Returns the path associated with the specified symbolic path name (specified either by index or by name string).
EXAMPLE
symbolicPaths.getPathValue 2
"C:\Program Files\Autodesk\3ds Max 2012\maps"
symbolicPaths.getPathValue"$maps"
"C:\Program Files\Autodesk\3ds Max 2012\maps"
symbolicPaths.numUserPaths()Returns the number of user-defined symbolic path names.
symbolicPaths.getUserPathName <index>Returns the indexed user-defined symbolic path name.
symbolicPaths.isUserPathName <string>Returns true if the string corresponds to a user-defined symbolic path name, false otherwise.
symbolicPaths.getUserPathValue {<index> | <string>}Returns the path associated with the specified user-defined symbolic path name
symbolicPaths.setUserPathValue {<index> | <string>} <filepath>Sets path associated with the specified user-defined symbolic path name
symbolicPaths.addUserPath <string> <filepath>Adds user-defined symbolic path name and path
symbolicPaths.removeUserPath {<index> | <string>}Removes user-defined symbolic path name
symbolicPaths.expandFileName <filename>Returns expanded file nane
EXAMPLE
symbolicPaths.numUserPaths() --check foruser path- none by default
0
symbolicPaths.addUserPath "$test" "c:\\test" --define new user path
OK
symbolicPaths.numUserPaths() --check foruser path- there is one!
1
symbolicPaths.isUserPathName "$test" --is a user symbolic path?
true
--See if $temp is a user symbolic path.
--NOTE that $temp is aSYSTEMsymbolic path,
--but not aUSERsymbolic path:
symbolicPaths.isUserPathName "$temp"
false
symbolicPaths.getUserPathName 1 --get the name of the first path
"$test"
symbolicPaths.getUserPathValue 1 --get the first path
"c:\test"
symbolicPaths.getUserPathValue "$test" --get the path by name
"c:\test"
symbolicPaths.setUserPathValue "$test" "c:\\another\\path" --change
OK
symbolicPaths.getUserPathValue "$test" --see if itchangeg?
"c:\another\path"
symbolicPaths.expandFileName "$test\\somefile.txt" --expand a path
"c:\another\path\somefile.txt"
symbolicPaths.removeUserPath "$test" --remove the user path
OK
symbolicPaths.numUserPaths() --there are no user paths left
0