Overview
The scripts listed in this page are often used by 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
-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
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 Proxy
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
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 *
Replace "OUTPUT_FOLDER" with the path where the the *.vrmesh files will be exported. For example "C:\proxy-library\"
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
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.
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
It is important to specify the X and Y values for the Duration and respectively, for the Interval Type.
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
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
This script works only with materials assigned to scene objects.
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
Replace the "OUTPUT_PATH\OUTPUT_FILE.exr" value to the location and filename where you want to save the output file.
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
*.vrmesh and *.mat filenames are taken from object-name.
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
cam = getActiveCamera() select cam delete cam
Replace VRayFastSSS2 Nodes with Default VRayMtl Keeping the Outgoing Connections
for each in (getclassinstances VRayFastSSS2) do replaceinstances each (VrayMtl())
Select All Objects with Specific Value of a Specific Custom User Property
Custom properties are defined from 3ds Max Objects Properties > User Defined rollout.
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
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
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.
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.
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
Non-assigned materials are not listed. Only the ones assigned to geometry are.
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
for p in getPropNames $.material do format "% = %\n" p (getProperty $.material p)
Toggle Selected Physical/V-Ray Camera’s Cone On or Off
for p in getPropNames $.material do format "% = %\n" p (getProperty $.material p)
Custom V-Ray Raw Image Save File Dialog
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
The frame range is controlled by the startFrame and endFrame variables. The Output location is controlled by outputImg variable.
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
Enter the string you would like to replace in “STRING_TO_REPLACE” and the replacing string should be added to “STRING_TO_REPLACE_WITH”.
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
Works if said path doesn’t already exist in the string.
Enter the string in the vraymatlibpath variable.
vraymatlibpath = @"D:\Test\" for each in (getclassinstances VRayBitmap) do ( if ((findstring each.hdrimapname vraymatlibpath)==undefined) then each.hdrimapname = vraymatlibpath + each.hdrimapname )