Overview
The scripts listed on this page are often used by the Chaos Support team while working with users' scenes. They can be used as a reference point for automating one's daily work.
Here we answer questions such as:
- How to automate the rendering of multiple *.vrscene files?
- How to write scripts to automate repetitive or time-consuming tasks?
Automatically Render All *.vrscene Files in a Specific Directory
Note: -imgfile="%%a.jpg" attribute overrides the output file name and format. Use this
parameter only if output is not specified in *.vrscene files.
echo off
FOR %%I in (*.vrscene) DO (
FOR /F "tokens=1 delims=. " %%a in ("%%I") DO (
"C:\Program Files\Chaos Group\V-Ray\Standalone for x64\bin\vray.exe" -scenefile="%%I" -autoclose=1 -imgfile="%%a.jpg"
)
)
Change the Mode of All VRayLightSelect Render Elements to Direct Diffuse
MAXScript
manager = maxOps.getCurRenderElementMgr()
numElements = manager.numrenderelements()
for n = 0 to (numElements-1) do
(
element = manager.getRenderElement n
if classof element == VRayLightSelect then
(
element.mode = 2
)
)
Select All VRayProxy Objects Sharing the Same *.vrmesh File as the Selected Prox
MAXScript
if classof($) == VRayProxy then ( searchFileName = $.fileName ) else ( print "Not a VRayProxy" deselect $ ) for each in Objects do ( if classof(each) == VRayProxy and each.fileName == searchFileName then ( selectmore each ) ) searchFileName = null
Turn off Unlocked Highlight Glossiness of All VRayMtl Nodes in the Scene
MAXScript
for each in SceneMaterials where
classof each == VRayMtl do
(
each.reflection_lockGlossiness = true
)
Export All Objects in 3ds Max Selection Set to *.vrmesh Files
(Works with wildcards *)
Note: Replace "OUTPUT_FOLDER" with the path where the the *.vrmesh files will be exported.
For example "C:\proxy-library\"
MAXScript
rollout ProxyExport "Proxy Export" width:300
(
label label1 "Enter Selection Set Name (wildcards * or partial-name):"
edittext setQuery
button createBtn "Create"
on createBtn pressed do
(
for i = 1 to getNumNamedSelSets() do
(
if matchPattern (getNamedSelSetName i) pattern:(setQuery.text) then select selectionSets[i]
)
vrayMeshExport meshFile: @"OUTPUT_FOLDER"
)
)
createDialog ProxyExport
Change the Specified V-Ray Object Properties of the Selected Objects
Note: V-Ray Object Property names could be found in:
3ds Max Object Properties > User Defined Tab
Note that the property names are written only if the V-Ray Objects Properties window has
been opened at least once.
MAXScript
for each in Selection do
(
try(setUserProp each "VRay_GI_Generate" true)catch()
try(setUserProp each "VRay_GI_Receive" true)catch()
)
Find 3ds Max Hair and Fur Effect and Adjust Motion Blur Duration and Interval Type
Note: It is important to specify the X and Y values for the Duration and respectively, for
the Interval Type.
MAXScript
TheEffects = (for i = 1 to numEffects where classof (getEffect i) == HairEffect collect (getEffect i))
theEffects[1].mbDuration = X
theEffects[1].mbIntervalType = Y
Find and Disconnect All VRayDirt Maps
MAXScript
maps = getClassInstances VRayDirt asTrackViewPick:on
for map in maps do
for ref = 1 to refs.getNumRefs map.client where refs.getReference map.client ref == map.anim do
(
refs.replaceReference map.client ref undefined
notifyDependents map.client
)
Reset the Self-illumination Parameters of All Assigned VRayMtl Instances to Default
Note: This script works only with materials assigned to scene objects.
MAXScript
for each in sceneMaterials do
(
if classOf each == VRayMtl then
(
each.selfIllumination = color 0 0 0;
each.selfIllumination_gi = false;
each.selfIllumination_multiplier = 1.0;
each.texmap_self_illumination = undefined;
each.texmap_self_illumination_on = true;
each.texmap_self_illumination_multiplier = 100.0;
each.compensate_camera_exposure = false;
)
)
Work with VRayOptionRE
Add VRayOptionRE, set metadata, enable render elements if disabled, set the Raw image output and initiate a render
Note: Replace the "OUTPUT_PATH\OUTPUT_FILE.exr" value to the location and filename where
you want to save the output file.
MAXScript
re_manager = maxOps.GetCurRenderElementMgr()
metadata = "MyMetaData=True"
current_element = VRayOptionRE()
current_element.elementName = "file_metadata"
current_element.exr_metadata = metadata
re_manager.AddRenderElement(current_element)
if re_manager.GetElementsActive() == false then re_manager.SetElementsActive(true)
renderers.current.output_saveRawFile = True
renderers.current.output_rawFileName = @"OUTPUT_PATH\OUTPUT_FILE.exr"
render vfb:False
Export Selected Objects and Their Materials to *.vrmesh and *.mat Files
Note: *.vrmesh and *.mat filenames are taken from object-name
MAXScript
function ExportProxyAndMatLib =
(
filesSavePath = getSavePath()
for eachObject in selection do
(
try
(
local matLib = MaterialLibrary()
append matLib eachObject.material
saveTempMaterialLibrary matLib (filesSavePath + "\\" + eachObject.name + ".mat")
vraymeshexport meshfile:(filesSavePath + "\\" + eachObject.name + ".vrmesh")
)
catch()
)
)
ExportProxyAndMatLib()
Select and Delete the Currently Active Camera
MAXScript
cam = getActiveCamera()
select cam
delete cam
Replace VRayFastSSS2 Nodes with Default VRayMtl Keeping the Outgoing Connections
MAXScript
for each in (getclassinstances VRayFastSSS2) do
replaceinstances each (VrayMtl())
Select All Objects with Specific Value of a Specific Custom User Property
Note: Custom properties are defined from 3ds Max Objects Properties > User Defined rollout
MAXScript
for each in objects where (getuserprop each "my_property" == 2) do
(
selectmore each
)
Turn Selected Object into VRayClipper in Mesh Mode with Replace Mesh on Pick Option Enabled
MAXScript
clipMesh = $
clipper = VRayClipper()
clipper.enable_mesh_mode = True
clipper.mesh_replaceOnPick = True
clipper.mesh_source = clipMesh
clipper.pos = clipMesh.pos
clipper.parent = clipMesh
clipMesh.renderable = false
hide clipMesh
Export Each Camera to Separate *.vrscene File in Specified Folder
Note: If the camera is animated (position only), the *.vrscene will be exported with
animation from the first to the last keyframe. The script also sets a separate image output
sub-folder for each animated camera.
MAXScript
fn ExportCamerasToVRScenes =
(
savePath = getSavePath()
for eachCam in Cameras where classof eachCam != Targetobject do
(
if savePath == undefined then continue
renderers.current.output_saveRawFile = true
renderers.current.output_rawFileName = savePath + "\Output\\" + eachCam.name + ".exr"
viewport.SetCamera eachCam
exportLocation = savePath + "\\" + eachCam.name
if eachCam.pos.isAnimated then
(
renderers.current.output_rawFileName = savePath + "\Output\\" + eachCam.name + "_Sequence\\" + eachCam.name + ".exr"
animRange = getTimeRange eachCam.position.controller #allKeys #children
animRangeStartFrame = (integer)animRange.Start
animRangeEndFrame = (integer)animRange.End
vrayExportVRScene exportLocation startFrame:animRangeStartFrame endFrame:animRangeEndFrame
)
else
(
vrayExportVRScene exportLocation
)
)
)
ExportCamerasToVRScenes()
Clean up Leftover Animation Layers and MotionClips Controllers
The benefit of this cleanup is that the scene will save and load faster and the file size will be smaller.
MAXScript
t=trackviewnodes
n=t[#Anim_Layer_Control_Manager]
deleteTrackViewController t n.controller
gc()
t=trackviewnodes
n=t[#Max_MotionClip_Manager]
deleteTrackViewController t n.controller
gc()
Apply Existing Material to Selection
Note: Non-assigned materials are not listed. Only the ones assigned to geometry are.
MAXScript
try(destroyDialog AssingExistingMat)catch()
rollout AssingExistingMat "Assign Existing Material"
(
listbox matListUI "Material List"
fn PopulateList =
(
for each in sceneMaterials do
(
appendString = each.name + " (" + (classof(each)as string) + ")"
matListUI.items = append matListUI.items appendString
)
)
on matListUI doubleClicked itm do
(
try
(
$.material = SceneMaterials[itm]
destroyDialog AssingExistingMat
)catch()
)
on AssingExistingMat open do
(
try (PopulateList())catch()
)
)
createDialog AssingExistingMat
Print All Property-Value Pairs of the Selected Object’s Material
MAXScript
for p in getPropNames $.material do
format "% = %\n" p (getProperty $.material p)
Toggle Selected Physical/V-Ray Camera’s Cone On or Off
MAXScript
for p in getPropNames $.material do
format "% = %\n" p (getProperty $.material p)
Custom V-Ray Raw Image Save File Dialog
MAXScript
try(destroyDialog saveRollout)catch()
rollout setRawFile "Save Raw file"
(
edittext pathText
button browseButton "Browse"
checkbox useHalf "EXR/VRST 32-bit output"
checkbox useDeep "Deep EXR"
checkbox useDots "Dot-deliminated frame number"
checkbox useCorr "Save VFB color corrections to RGB channel"
on setRawFile open do
(
renderers.current.output_saveRawFile=true
useHalf.checked = not renderers.current.output_rawExrUseHalf
useDeep.checked = renderers.current.output_rawExrDeep
useDots.checked = renderers.current.fileName_addDot
useCorr.checked = renderers.current.output_rawSaveColorCorrections
pathText.Text = renderers.current.output_rawFileName
)
on useHalf changed current_state do renderers.current.output_rawExrUseHalf = not current_state
on useDeep changed current_state do renderers.current.output_rawExrDeep = current_state
on useDots changed current_state do renderers.current.fileName_addDot = current_state
on useCorr changed current_state do renderers.current.output_rawSaveColorCorrections = current_state
on browseButton pressed do
(
try
(
renderers.current.output_rawFileName = getSaveFileName types:"V-Ray image files(*.vrimg)|*.vrimg|OpenEXR image files(*.exr)|*.exr|V-Ray deep image files(*.vrst)|*.vrst|"
pathText.Text = renderers.current.output_rawFileName
)catch()
)
)
CreateDialog setRawFile 500 150
Render Custom Frame Range and Output to File Only the effectsResult Channel
Note: The frame range is controlled by the startFrame and endFrame variables. The Output
location is controlled by outputImg variable
MAXScript
fn SaveEffectsResultOnly =
(
startFrame = 0
endFrame = 50
for i = startFrame to endFrame do
(
slidertime = i
max quick render
outputImg = @"D:\" + i as string + ".exr"
vfbControl #setchannel (vfbControl #getchannel effectsresult)[1]
vfbControl #saveimage outputImg
)
)
try(SaveEffectsResultOnly())catch()
Replace Part of or the Whole Filename String of All VRayBitmap Nodes in the Scene
Note: Enter the string you would like to replace in “STRING_TO_REPLACE” and the replacing
string should be added to “STRING_TO_REPLACE_WITH”.
MAXScript
fn ReplaceVRayHDRIFilePath =
(
replaceThis = @"STRING_TO_REPLACE"
withThis = @"STRING_TO_REPLACE_WITH"
for each in (getclassinstances vrayhdri) do
(
each.hdrimapname = substitutestring each.hdrimapname replaceThis withThis
)
)
try (ReplaceVRayHDRIFilePath())catch()
Add Path as Prefix to the Filename of the VRayBitmap Node
It works if the said path doesn’t already exist in the string.
Note: Enter the string in the vraymatlibpath variable.
MAXScript
vraymatlibpath = @"D:\Test\"
for each in (getclassinstances VRayBitmap) do
(
if ((findstring each.hdrimapname vraymatlibpath)==undefined) then
each.hdrimapname = vraymatlibpath + each.hdrimapname
)