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 |
Auto-backup 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 direcotory |
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 |
48 |
$publicExchangeStoreInstallPath |
Public Exchange Store install directory |
54 |
$CFD |
User CFD scene assets directory |
54 |
$systemImage |
System scene images directory |
54 |
$systemPhotometric |
Photometric light definition (.ies) file directory |
54 |
$systemSound |
System sene sound assets directory |
54 |
$systemCFD |
System CFD scene assets directory |
54 |
$pageFile |
Temporary page file directory (in 3ds Max 2018.4 Update 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 |