macroScript BatchCameraRender category:"Sergo Pogosyan" toolTip:"Render scene cameras with specified rendering parameters" buttonText:"BatchCameraRender" ( --########################-- --GLOBAL VARS-- --########################-- --cameras CAMERA_LIST = for obj in cameras where iskindof obj camera collect obj --lights LIGHT_LIST = for obj in lights where iskindof obj light collect obj --lighting state array structure: #( #(light_name, on/off), #(light_name, on/off), #(light_name, on/off) ... ) LIGHTING_STATE = #() --render size presets RESOLUTIONS = #([640,480],[768,576],[900,600],[1200,800],[1200,960],[1500,1000],[1920,1080],[2400,1200],[2400,1920]) --file name to render to IMAGE_FILE_NAME = undefined --main rollout batchCameraRender_mainRollOut Output_Size_Rollout Render_Output_Rollout Frame_Range_Rollout Scene_States_Rollout Light_Assignement_Rollout Net_Render_Options_Rollout global batchCameraRender_floater --pixel aspect PIXEL_ASPECT = 1.333 --listView items array LV_ITEMS = #() --default vray image file saving state SAVE_VRAY_IMAGE_FILE_STATE = false --########################-- --Session-wide persistent variables --########################-- global BatchCam_save_file global BatchCam_save_vray_image_file global BatchCam_rollout_state global BatchCam_net_render_state global BatchCam_show_submit_dialog_state global BatchCam_dialog_height global BatchCam_listItem_state --########################-- --end of session-wide persistent variables --########################-- --########################-- --FUNCTIONS for batch camera render script --version 1.6 --2009-09-02 --########################-- -- --function to switch render buttons' activity state fn render_buttons_active state = ( --main section batchCameraRender_mainRollOut.render_start.enabled = state batchCameraRender_mainRollOut.net_render.enabled = state batchCameraRender_mainRollOut.show_net_submit.enabled = batchCameraRender_mainRollOut.net_render.checked and batchCameraRender_mainRollOut.net_render.enabled if (batchCameraRender_mainRollOut.net_render.checked and batchCameraRender_mainRollOut.net_render.enabled) \ and not batchCameraRender_mainRollOut.show_net_submit.checked then for control_element in Net_Render_Options_Rollout.controls do control_element.enabled = true else for control_element in Net_Render_Options_Rollout.controls do control_element.enabled = false ) --function to switch window element's activity state fn elements_active state = ( batchCameraRender_mainRollOut.select_camera.enabled = state --filename section for control_element in Render_Output_Rollout.controls do control_element.enabled = state if (findString ((classof (renderers.current)) as string) "v_ray") != undefined then Render_Output_Rollout.save_vray_image_file.enabled = state --lights section for control_element in Light_Assignement_Rollout.controls do control_element.enabled = state --frame range section for control_element in Frame_Range_Rollout.controls do control_element.enabled = state --resolution section for control_element in Output_Size_Rollout.controls do control_element.enabled = state --scene state section for control_element in Scene_States_Rollout.controls do control_element.enabled = state ) fn leadingZero num digitCount= ( str = num as string while str.count < digitCount do str = "0" + str str ) fn netrender_submit_progress total current = ( format "Progress: completed % out of %\n" current total ) --function to submit current scene to backburner manager fn net_render_auto_submit camera_name = ( batchManager = NetRender.GetManager() --get NetRender Interface --batchManager.connect #manual [port:] --batchManager.connect #automatic [port:] --batchManager.connect #manual managerName -- netrender_port = Net_Render_Options_Rollout.Port.text as integer -- if netrender_port == undefined then netrender_port = 3234 if not (batchManager.connect (if Net_Render_Options_Rollout.Auto_Search.checked then #automatic else #manual) Net_Render_Options_Rollout.Name_Or_Mask.text) then --throw error to catch at main try block in on_start_render event handler throw ("Failed to connect to manager "+ (Net_Render_Options_Rollout.Name_Or_Mask.text)) else ( batchJob = batchManager.NewJob() batchJob.renderCamera = camera_name jobName = batchJob.name + " " + batchJob.renderCamera --add camera name to job name nameCounter = 1 alreadyHasName = true -- do loop to correctly name render job. -- job names composed of scene name + camera name + counter number. do ( tempjobName = jobName + " " + (leadingZero nameCounter ((nameCounter as string).count + 1)) existingJobs = batchManager.getjobs filter:#name key:tempjobName if existingJobs.count == 0 then ( alreadyHasName = false batchJob.name = tempjobName ) else nameCounter = nameCounter + 1 ) while alreadyHasName ) --set render frames from max render dialog batchJob.nthFrame = rendNThFrame if rendTimeType == 3 then ( batchJob.fromFrame = rendStart batchJob.toFrame = rendEnd ) else if rendTimeType == 4 then ( batchJob.frames = rendPickupFrames batchJob.nonSeqFrames = true ) else --if frame range paramter is undefined then render one current frame ( batchJob.fromFrame = currentTime.frame batchJob.toFrame = currentTime.frame ) batchJob.Submit() -- doesn't work -- batchManager.setCallback #progress netrender_submit_progress -- format "callback after set:%\n" (batchManager.getCallback #update ) batchManager.Disconnect() ) --returns min and max frames from object's animation or (0f, 0f) for non animated camera fn get_key_range obj= ( frame_array = #() --standard transformation section try if obj.pos.controller.keys.count > 0 then frame_array = frame_array + (for i in obj.pos.controller.keys collect i.time) else append frame_array 0f catch () try if obj.rotation.controller.keys.count > 0 then frame_array = frame_array + (for i in obj.rotation.controller.keys collect i.time) else append frame_array 0f catch () try if obj.scale.controller.keys.count > 0 then frame_array = frame_array + (for i in obj.scale.controller.keys collect i.time) else append frame_array 0f catch () --object properties section prop_controller_array = for prop in getPropNames obj where isPropertyAnimatable obj prop collect (getPropertyController obj prop) --get controllers prop_controller_array = for prop in prop_controller_array where prop != undefined collect prop --collect only existing controller if prop_controller_array.count > 0 then for controller in prop_controller_array do ( key_array = controller.keys if key_array.count > 0 then frame_array = frame_array + (for i in key_array collect i.time) else append frame_array 0f ) --object modifers section if obj.modifiers.count > 0 then for one_modifier in obj.modifiers do ( modifier_controller_array = for prop in getPropNames one_modifier where isPropertyAnimatable one_modifier prop collect (getPropertyController one_modifier prop) modifier_controller_array = for prop in modifier_controller_array where prop != undefined collect prop if modifier_controller_array.count > 0 then for controller in modifier_controller_array do ( key_array = controller.keys if key_array.count > 0 then frame_array = frame_array + (for i in key_array collect i.time) else append frame_array 0f ) ) result = #() append result (amin frame_array) append result (amax frame_array) result ) --function to set scene state to selected cameras in listitems fn set_scene_state cameraItems state = ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name setUserProp obj_itself "BatchCameraRender_scene_state" (state as string) (i.SubItems.Item "scene_state").text = (state as string) --set text to activex control (i.SubItems.Item "scene_state").ForeColor = (i.SubItems.Item "scene_state").ForeColor.Black ) ) ) --function to set frame size to selected cameras in listitems fn set_resolution cameraItems width height = ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name x_res = width as integer y_res = height as integer setUserProp obj_itself "BatchCameraRender_frame_width" x_res setUserProp obj_itself "BatchCameraRender_frame_heigth" y_res (i.SubItems.Item "resolution").text = x_res as string + " x " + y_res as string --set text to activex control (i.SubItems.Item "resolution").ForeColor = (i.SubItems.Item "resolution").ForeColor.Black ) ) ) fn set_render_output cameraItems fullfilename= ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name if Render_Output_Rollout.file_from_camera.checked then ( file_name_str = getFilenameFile fullfilename --get filename from the filename edittext file_type_str = getFilenameType fullfilename --get file type from the filename edittext temp_file_name = file_name_str + "" + obj_name + file_type_str --modify filename with camera name temp_path = getFilenamePath fullfilename --get folder path temp_fullname = pathConfig.appendPath temp_path temp_file_name --create new path temp_fullname = pathConfig.convertPathToAbsolute temp_fullname ) else temp_fullname = fullfilename setUserProp obj_itself "BatchCameraRender_render_output" (temp_fullname as string) (i.SubItems.Item "path").text = temp_fullname as string --set text to activex control (i.SubItems.Item "path").ForeColor = (i.SubItems.Item "path").ForeColor.Black ) ) ) fn set_render_folder cameraItems foldername= ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name temp_string = getUserProp obj_itself "BatchCameraRender_render_output" --get path from function parameters temp_path = foldername if temp_string != undefined then ( --get name from camera properties temp_name = filenameFromPath temp_string temp_fullname = pathConfig.appendPath temp_path temp_name temp_fullname = pathConfig.convertPathToAbsolute temp_fullname isPathExist = doesFileExist foldername --check if folder path exists if isPathExist then --if it exists then set path to camera ( setUserProp obj_itself "BatchCameraRender_render_output" (temp_fullname as string) (i.SubItems.Item "path").text = temp_fullname as string --set text to activex control (i.SubItems.Item "path").ForeColor = (i.SubItems.Item "path").ForeColor.Black ) else --if doesn't exist confirm to create it ( temp_answer = queryBox "Path does not exist. Would you like to create it?" title:"Path does not exist." if temp_answer then if not makeDir foldername all:true then messagebox "Failed to create a folder." title:"Error" else setUserProp obj_itself "BatchCameraRender_render_output" (temp_fullname as string) (i.SubItems.Item "path").text = temp_fullname as string --set text to activex control (i.SubItems.Item "path").ForeColor = (i.SubItems.Item "path").ForeColor.Black ) ) ) ) ) fn set_render_file cameraItems file_name_only= ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name temp_string = getUserProp obj_itself "BatchCameraRender_render_output" --get name from function parameters temp_name = file_name_only if temp_string != undefined then ( if Render_Output_Rollout.file_from_camera.checked then ( file_name_str = getFilenameFile temp_name --get filename from the filename edittext file_type_str = getFilenameType temp_name --get file type from the filename edittext temp_name = file_name_str + "" + obj_name + file_type_str ) --get path from camera properties temp_path = getFilenamePath temp_string temp_fullname = pathConfig.appendPath temp_path temp_name temp_fullname = pathConfig.convertPathToAbsolute temp_fullname setUserProp obj_itself "BatchCameraRender_render_output" (temp_fullname as string) (i.SubItems.Item "path").text = temp_fullname as string --set text to activex control (i.SubItems.Item "path").ForeColor = (i.SubItems.Item "path").ForeColor.Black ) ) ) ) --function to set flag if subfolder with camera name should be added to render path fn set_add_subfolder cameraItems add_subfolder_state= ( for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name state_text = if add_subfolder_state then "Yes" else "No" setUserProp obj_itself "BatchCameraRender_add_subfolder" state_text (i.SubItems.Item "add_subfolder").text = state_text (i.SubItems.Item "add_subfolder").ForeColor = (i.SubItems.Item "add_subfolder").ForeColor.Black ) ) ) --set checkbox state in UI fn populate_add_folder_state cameraItems= ( selected_listitems = for i in cameraItems where i.selected collect i if selected_listitems.count > 0 then ( temp_state = false i = selected_listitems[1] obj_name = i.text obj_itself = getNodeByName obj_name temp_string = getUserProp obj_itself "BatchCameraRender_add_subfolder" if (temp_string != undefined and temp_string != "undefined") then temp_state = (temp_string == "Yes") Render_Output_Rollout.folder_from_camera.checked = temp_state if selected_listitems.count > 1 then ( temp_state_2 = false for i in selected_listitems do ( obj_name = i.text obj_itself = getNodeByName obj_name temp_string = getUserProp obj_itself "BatchCameraRender_add_subfolder" if (temp_string != undefined and temp_string != "undefined") then temp_state_2 = (temp_string == "Yes") ) if temp_state_2 == temp_state then Render_Output_Rollout.folder_from_camera.checked = temp_state else Render_Output_Rollout.folder_from_camera.triState = 2 --grey-out checkbox if selected cameras have different flag states ) ) ) --populate frame range parameters fn populate_framerange cameraItems = ( lis = cameraItems rendType1 = Frame_Range_Rollout.rendType1 rendType2 = Frame_Range_Rollout.rendType2 rendType3 = Frame_Range_Rollout.rendType3 rendType5 = Frame_Range_Rollout.rendType5 render_from = Frame_Range_Rollout.render_from render_to = Frame_Range_Rollout.render_to render_anim_from = Frame_Range_Rollout.render_anim_from render_anim_to = Frame_Range_Rollout.render_anim_to render_frames = Frame_Range_Rollout.render_frames render_single = Frame_Range_Rollout.render_single --exclude selected items selected_items = #() for i in lis do if i.selected then append selected_items i if selected_items.count == 1 then ( i = selected_items[1] obj_name = i.text obj_itself = getNodeByName obj_name temp_string1 = getUserProp obj_itself "BatchCameraRender_frames" temp_string2 = getUserProp obj_itself "BatchCameraRender_framerange_from" temp_string5 = getUserProp obj_itself "BatchCameraRender_anim_frame_range" if (temp_string5 != undefined and temp_string5 != "undefined") then ( --render_frames rendType1.state = 0 rendType2.state = 0 rendType3.state = 0 rendType5.state = 1 render_anim_from.enabled = render_anim_to.enabled = true render_single.enabled = render_frames.enabled = render_from.enabled = render_to.enabled = false temp_frame_range = get_key_range obj_itself render_anim_from.text = (temp_frame_range[1].frame as integer) as string render_anim_to.text = (temp_frame_range[2].frame as integer) as string ) else if (temp_string1 != undefined and temp_string1 != "undefined") then ( --render_frames rendType1.state = 0 rendType2.state = 0 rendType3.state = 1 rendType5.state = 0 render_frames.text = temp_string1 as string render_from.enabled = render_to.enabled = false render_frames.enabled = true ) else if (temp_string2 != undefined and temp_string2 != "undefined") then ( temp_string3 = getUserProp obj_itself "BatchCameraRender_framerange_to" if (temp_string2 as integer == temp_string3 as integer) then ( --single frame rendType1.state = 1 rendType2.state = 0 rendType3.state = 0 rendType5.state = 0 render_from.enabled = render_to.enabled = render_frames.enabled = false render_single.value = temp_string2 as integer ) else ( --frame range rendType1.state = 0 rendType2.state = 1 rendType3.state = 0 rendType5.state = 0 render_single.enabled = false render_from.enabled = render_to.enabled = true render_from.value = temp_string2 as integer render_to.value = temp_string3 as integer ) ) ) else --multiple selection ( ) ) fn populate_filename_fields cameraItems= ( --get selected items --get filename from one item --split to name and path --compare to UIfield text --if differs then enter "varies" text --go to next item lis = cameraItems result_file_name = Render_Output_Rollout.result_file_name file_name = Render_Output_Rollout.file_name file_path = Render_Output_Rollout.file_path --exclude selected items selected_items = #() for i in lis do if i.selected then append selected_items i if selected_items.count == 1 then ( i = selected_items[1] obj_name = i.text obj_itself = getNodeByName obj_name temp_string = getUserProp obj_itself "BatchCameraRender_render_output" if (temp_string != undefined and temp_string != "undefined") then ( result_file_name.text = temp_string file_name.text = filenameFromPath temp_string file_path.text = getFilenamePath temp_string ) else ( result_file_name.text = "undefined" file_name.text = "undefined" file_path.text = "undefined" ) ) else ( prev_fullname = "" prev_path = "" prev_file = "" for i in selected_items do ( obj_name = i.text obj_itself = getNodeByName obj_name temp_string = getUserProp obj_itself "BatchCameraRender_render_output" if (temp_string != undefined and temp_string != "undefined") then ( --if multiple items are selected --show only similar parts of the filename --if full path of selected items is equal --show all parts if temp_string == prev_fullname then ( result_file_name.text = temp_string file_name.text = filenameFromPath temp_string file_path.text = getFilenamePath temp_string ) --if full path varies but folder is similar --show the folder path --in other parts show "varies" text else if prev_path == (getFilenamePath temp_string) then ( result_file_name.text = "Varies" file_name.text = "Varies" file_path.text = getFilenamePath temp_string ) --if folder path varies but filename is equal --show the filename part --in other parts show "varies" text else if prev_file == (filenameFromPath temp_string) then ( result_file_name.text = "Varies" file_name.text = filenameFromPath temp_string file_path.text = "Varies" ) --if all parts are different --show "varies" text in all parts else ( result_file_name.text = "Varies" file_name.text = "Varies" file_path.text = "Varies" ) prev_fullname = temp_string prev_path = getFilenamePath temp_string prev_file = filenameFromPath temp_string ) else ( result_file_name.text = "Varies" file_name.text = "Varies" file_path.text = "Varies" --put "undefined" text to UI fields ) ) ) ) fn populate_light_state cameraItems= ( lis = cameraItems solo_lights = Light_Assignement_Rollout.light_box_solo on_lights = Light_Assignement_Rollout.light_box_forceon off_lights = Light_Assignement_Rollout.light_box_forceoff --exclude selected items selected_items = #() for i in lis do if i.selected then append selected_items i if selected_items.count == 1 then ( i = selected_items[1] obj_name = i.text obj_itself = getNodeByName obj_name temp_string1 = getUserProp obj_itself "BatchCameraRender_solo_lights" temp_string2 = getUserProp obj_itself "BatchCameraRender_on_lights" temp_string3 = getUserProp obj_itself "BatchCameraRender_off_lights" if (temp_string1 != undefined and temp_string1 != "undefined") then ( temparray = filterString temp_string1 "," solo_lights.items = temparray ) else ( solo_lights.items = #() ) if (temp_string2 != undefined and temp_string2 != "undefined") then ( temparray = filterString temp_string2 "," on_lights.items = temparray ) else ( on_lights.items = #() ) if (temp_string3 != undefined and temp_string3 != "undefined") then ( temparray = filterString temp_string3 "," off_lights.items = temparray ) else ( off_lights.items = #() ) ) ) --Function to set frame range to camera objects --Frame range fn set_frame_range cameraItems frame_from frame_to= ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name frame_from = frame_from as integer frame_to = frame_to as integer setUserProp obj_itself "BatchCameraRender_anim_frame_range" undefined setUserProp obj_itself "BatchCameraRender_framerange_from" frame_from setUserProp obj_itself "BatchCameraRender_framerange_to" frame_to setUserProp obj_itself "BatchCameraRender_frames" undefined (i.SubItems.Item "Frames").text = frame_from as string + "..." + frame_to as string --set text to activex control (i.SubItems.Item "Frames").ForeColor = (i.SubItems.Item "Frames").ForeColor.Black ) ) ) --Single frame fn set_frame_single cameraItems frame_num = ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name frame_from = frame_num as integer frame_to = frame_num as integer setUserProp obj_itself "BatchCameraRender_anim_frame_range" undefined setUserProp obj_itself "BatchCameraRender_framerange_from" frame_from setUserProp obj_itself "BatchCameraRender_framerange_to" frame_to setUserProp obj_itself "BatchCameraRender_frames" undefined (i.SubItems.Item "Frames").text = frame_from as string --set text to activex control (i.SubItems.Item "Frames").ForeColor = (i.SubItems.Item "Frames").ForeColor.Black ) ) ) --animated frame range fn set_anim_frame_range cameraItems = ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name temp_frame_range = get_key_range obj_itself frame_from = temp_frame_range[1].frame frame_to = temp_frame_range[2].frame setUserProp obj_itself "BatchCameraRender_anim_frame_range" true setUserProp obj_itself "BatchCameraRender_framerange_from" undefined setUserProp obj_itself "BatchCameraRender_framerange_to" undefined setUserProp obj_itself "BatchCameraRender_frames" undefined (i.SubItems.Item "Frames").text = "anim.range:" + (frame_from as integer) as string + "..." + (frame_to as integer) as string --set text to activex control (i.SubItems.Item "Frames").ForeColor = (i.SubItems.Item "Frames").ForeColor.Black Frame_Range_Rollout.render_anim_from.text = (temp_frame_range[1].frame as integer) as string Frame_Range_Rollout.render_anim_to.text = (temp_frame_range[2].frame as integer) as string ) ) ) --set frames string to render individual frames fn set_frames cameraItems frames = ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name setUserProp obj_itself "BatchCameraRender_anim_frame_range" undefined setUserProp obj_itself "BatchCameraRender_frames" frames as string setUserProp obj_itself "BatchCameraRender_framerange_from" undefined setUserProp obj_itself "BatchCameraRender_framerange_to" undefined (i.SubItems.Item "Frames").text = frames as string --set text to activex control (i.SubItems.Item "Frames").ForeColor = (i.SubItems.Item "Frames").ForeColor.Black ) ) ) --functions to switch the lights fn switch_lights light_name state = ( light_obj = getNodeByName light_name if light_obj != undefined then --check if light_obj exist in scene ( if hasProperty light_obj "on" then light_obj.on = state else if hasProperty light_obj "enabled" then light_obj.enabled = state else if hasProperty light_obj "Area_Enable" then --for MR Lights light_obj.on = state ) else --if doesn't exist ( --throw error to catch at main try block in on_start_render event handler throw ("Light \"" + light_name + "\" not found.") ) ) --function to get one light object state --written to support different light objects fn get_light_state light_obj = ( local light_state if hasProperty light_obj "on" then light_state = light_obj.on else if hasProperty light_obj "enabled" then light_state = light_obj.enabled else if hasProperty light_obj "Area_Enable" then --for MR Lights light_state = light_obj.on light_state ) --function to store lighting state in the scene --stores light state to the 2 dimensional array fn store_lighting_state = ( LIGHTING_STATE = #() local light_state local light_name for light_obj in LIGHT_LIST do ( light_state = get_light_state light_obj light_name = light_obj.name one_light_state = #(light_name, light_state) append LIGHTING_STATE one_light_state ) ) --function restore lighting state in the scene fn restore_lighting_state = ( for light_obj in LIGHTING_STATE do switch_lights light_obj[1] light_obj[2] ) --function to turn on solo lights and switch off all other lights in scene fn turn_solo_lights_on solo_lights = ( -- format "solo lights: %\n" solo_lights local light_obj for light_obj in LIGHT_LIST do ( if finditem solo_lights light_obj.name == 0 then -- turn off lights that are not in sololight list -- format "off light %\n" light_obj.name switch_lights light_obj.name false ) --now turn lights from sololight list one by one to check their existance in scene for light_name in solo_lights do switch_lights light_name true ) --function to force on lights fn force_lights_on forced_on_lights = ( for light_name in forced_on_lights do switch_lights light_name true ) --function to force off lights fn force_lights_off forced_off_lights = ( for light_name in forced_off_lights do switch_lights light_name false ) --function to store light state to the camera properties fn set_light_state cameraItems: solo_lights: on_lights: off_lights: = ( --cameraItems - listItems in activeX control for i in cameraItems do ( if i.selected then ( tempstr = "" --this string contains light names obj_name = i.text --this is camera name obj_itself = getNodeByName obj_name --get the camera to set properties to if solo_lights != unsupplied then ( for str in solo_lights do if tempstr.count != 0 then --if string is empty don't add comma tempstr = tempstr + "," + str as string else tempstr = tempstr + str as string setUserProp obj_itself "BatchCameraRender_solo_lights" tempstr (i.SubItems.Item "solo_lights").text = tempstr as string --set text to activex control if tempstr == "undefined" then (i.SubItems.Item "solo_lights").ForeColor = (i.SubItems.Item "solo_lights").ForeColor.Gray else (i.SubItems.Item "solo_lights").ForeColor = (i.SubItems.Item "solo_lights").ForeColor.Black ) if on_lights != unsupplied then ( for str in on_lights do if tempstr.count != 0 then tempstr = tempstr + "," + str as string else tempstr = tempstr + str as string setUserProp obj_itself "BatchCameraRender_on_lights" tempstr (i.SubItems.Item "on_lights").text = tempstr as string --set text to activex control if tempstr == "undefined" then (i.SubItems.Item "on_lights").ForeColor = (i.SubItems.Item "on_lights").ForeColor.Gray else (i.SubItems.Item "on_lights").ForeColor = (i.SubItems.Item "on_lights").ForeColor.Black ) if off_lights != unsupplied then ( for str in off_lights do if tempstr.count != 0 then tempstr = tempstr + "," + str as string else tempstr = tempstr + str as string setUserProp obj_itself "BatchCameraRender_off_lights" tempstr (i.SubItems.Item "off_lights").text = tempstr as string --set text to activex control if tempstr == "undefined" then (i.SubItems.Item "off_lights").ForeColor = (i.SubItems.Item "off_lights").ForeColor.Gray else (i.SubItems.Item "off_lights").ForeColor = (i.SubItems.Item "off_lights").ForeColor.Black ) ) ) ) --########################-- --ROLLOUT-- --########################-- rollout batchCameraRender_mainRollOut "Camera Manager Settings" ( dotNetControl lv_objects "System.Windows.Forms.ListView" height:170 button select_all "Select All" align:#left width:65 across:4 button select_none "Select None" align:#left width:65 offset: [-45,0] button check_all "Check All" align:#left width:85 offset: [-70,0] button uncheck_all "Uncheck All" align:#left width:85 offset: [-95,0] button render_start "Render" align:#left width:85 offset: [0,0] across:4 checkbox net_render "Net Render" align:#left offset: [-15,4] checkbox show_net_submit "Show Submit Dialog" align:#left offset: [-40,4] button select_camera "Select Camera(s) in Scene" align:#right width:150 offset: [9,0] on batchCameraRender_mainRollOut resized height do BatchCam_dialog_height = height[2] --#####-- --list button event handlers-- --#####-- on net_render changed state do ( BatchCam_net_render_state = state --state save to global var show_net_submit.enabled = state for control_element in Net_Render_Options_Rollout.controls do control_element.enabled = state ) on show_net_submit changed state do ( BatchCam_show_submit_dialog_state = state --state save to global var state = not state for control_element in Net_Render_Options_Rollout.controls do control_element.enabled = state ) on select_all pressed do ( for i in LV_ITEMS do i.selected = true lv_objects.HideSelection = false elements_active true ) on select_none pressed do ( for i in LV_ITEMS do i.selected = false lv_objects.HideSelection = false elements_active false ) on check_all pressed do ( for i in LV_ITEMS do i.checked = true render_buttons_active true ) on uncheck_all pressed do ( for i in LV_ITEMS do i.checked = false render_buttons_active false ) on select_camera pressed do ( camera_selection_names = for obj in LV_ITEMS where obj.selected collect obj.text --get camera names from selected items in list camera_selection = for obj in camera_list where ((findItem camera_selection_names obj.name) != 0) collect obj --collect camera objects with names is in previous array select camera_selection ) --#####-- --render button event hadler-- --#####-- on render_start pressed do ( --check if render dialog is open query_approved = true if renderSceneDialog.isOpen() then query_approved = queryBox "Render Setup Dialog is open. To proceed with rendering Render Setup Dialog should be closed.\n\nWould you like to close it now?" title:"Caution" if query_approved and getRenderType() != #view and getRenderType() != #normal then query_approved = queryBox ("Render Type set to \"" + (getRenderType() as string) + "\".\n\nWould you like continue?") title:"Caution" if query_approved then ( renderSceneDialog.close() --here we must read all parameters set in camera properties --set these properties to render parameteres --store changed render parameters --start render --restore render parameteres or go to next camera --store parameter old_rendUseActiveView = rendUseActiveView rendUseActiveView = true --store viewport type and camera viewport_type = viewport.getType() if viewport_type == #view_camera then old_camera = viewport.getCamera() --store frame range oldrendType = rendTimeType oldrendStart = rendStart oldrendEnd = rendEnd oldrendPickupFrames = rendPickupFrames oldrendNThFrame = rendNThFrame --store resolution oldrenderWidth = renderWidth oldrenderHeight = renderHeight --store filename oldfilename = rendOutputFilename oldsavestate = rendSaveFile --store V-ray image properties oldoutput_saveRawFile = false oldoutput_rawFileName = "" oldoutput_on = false vr = renderers.current if (findString ((classof vr) as string) "v_ray") != undefined then ( oldoutput_saveRawFile = vr.output_saveRawFile oldoutput_rawFileName = vr.output_rawFileName oldoutput_on = vr.output_on ) --netrender status oldrenderUseNet = rendUseNet --save lights state store_lighting_state() --scene state saving --there's no current scenestate properties in maxscript --oldscenestate = -- THIS SECTION SHOULD BE UNDER TRY-CATCH BLOCK try ( for i in LV_ITEMS do ( if i.checked then ( --get camera name camera_name = i.text camera_to_render = getNodeByName camera_name --set frame range temp_string1 = getUserProp camera_to_render "BatchCameraRender_frames" temp_string2 = getUserProp camera_to_render "BatchCameraRender_framerange_from" temp_string3 = getUserProp camera_to_render "BatchCameraRender_framerange_to" temp_string5 = getUserProp camera_to_render "BatchCameraRender_anim_frame_range" if (temp_string5 != undefined and temp_string5 != "undefined") then ( rendTimeType = 3 temp_frame_range = get_key_range camera_to_render rendStart = temp_frame_range[1].frame rendEnd = temp_frame_range[2].frame ) else if (temp_string1 != undefined and temp_string1 != "undefined") then ( --render_frames rendTimeType = 4 rendPickupFrames = temp_string1 as string ) else if (temp_string2 != undefined and temp_string2 != "undefined") then ( --single frame --frame range rendTimeType = 3 rendStart = temp_string2 as integer rendEnd = temp_string3 as integer ) rendNThFrame = Frame_Range_Rollout.render_every_nth.value as integer --get and set frame resolution xres_prop = getUserProp camera_to_render "BatchCameraRender_frame_width" yres_prop = getUserProp camera_to_render "BatchCameraRender_frame_heigth" if (xres_prop != undefined and xres_prop != "undefined") and (yres_prop != undefined and yres_prop != "undefined") then ( renderWidth = xres_prop as integer renderHeight = yres_prop as integer ) --get and set file name temp_string = getUserProp camera_to_render "BatchCameraRender_render_output" if (temp_string != undefined and temp_string != "undefined") then ( add_folder_flag_string = getUserProp camera_to_render "BatchCameraRender_add_subfolder" if (add_folder_flag_string == "Yes") then ( temp_path = getFilenamePath temp_string temp_name = filenameFromPath temp_string temp_folder = pathConfig.appendPath temp_path (camera_to_render.name) if not (doesFileExist temp_folder) then --check if folder path exists if not makeDir temp_folder all:true then --if folder doesn't exists then make it ( messagebox "Failed to create a folder with camera name." title:"Error" --if makeDir fails then use old path, w/o camera name folder ) else temp_string = pathConfig.appendPath temp_folder temp_name --if path is created then use new path else --if new path already exists temp_string = pathConfig.appendPath temp_folder temp_name ) rendSaveFile = Render_Output_Rollout.save_file.checked rendOutputFilename = temp_string --V-ray settings vr=renderers.current if (findString ((classof vr) as string) "v_ray") != undefined then ( vr.output_on = Render_Output_Rollout.save_vray_image_file.checked vr.output_saveRawFile = Render_Output_Rollout.save_vray_image_file.checked file_extension = Render_Output_Rollout.vray_extension_list.items[Render_Output_Rollout.vray_extension_list.selection] vr.output_rawFileName = (getFilenamePath temp_string) + (getFilenameFile temp_string) + file_extension ) ) --get lightstate temp_string1 = getUserProp camera_to_render "BatchCameraRender_solo_lights" temp_string2 = getUserProp camera_to_render "BatchCameraRender_on_lights" temp_string3 = getUserProp camera_to_render "BatchCameraRender_off_lights" if (temp_string1 != undefined and temp_string1 != "undefined") then ( temparray = filterString temp_string1 "," turn_solo_lights_on temparray ) else --if solo lights are listed then don't process other light setting ( if (temp_string3 != undefined and temp_string3 != "undefined") then --turn off exclude lights first, then turn on include lights ( temparray = filterString temp_string3 "," force_lights_off temparray ) if (temp_string2 != undefined and temp_string2 != "undefined") then --turn on include lights. ( temparray = filterString temp_string2 "," force_lights_on temparray ) ) --set scene state temp_string = getUserProp camera_to_render "BatchCameraRender_scene_state" if (temp_string != undefined and temp_string != "undefined") then sceneStateMgr.RestoreAllParts temp_string if net_render.checked and (not show_net_submit.checked) then net_render_auto_submit camera_name else ( --set viewport camera viewport.setCamera camera_to_render --set net render flag rendUseNet = net_render.checked --render max quick render ) --restore lights state --light state have to be restored after each camera iteration restore_lighting_state() ) -- if close ) -- end of for loop ) -- end of try close catch ( messagebox (getCurrentException()) title:"Error" -- format "*** % ***\n" (getCurrentException()) -- --restore lights state restore_lighting_state() ) -- print "run in any case" --restore parameter rendUseActiveView = old_rendUseActiveView --restore frame range rendTimeType = oldrendType rendStart = oldrendStart rendEnd = oldrendEnd rendPickupFrames = oldrendPickupFrames rendNThFrame = oldrendNThFrame --restore resolution renderWidth = oldrenderWidth renderHeight = oldrenderHeight --restore filename rendOutputFilename = oldfilename rendSaveFile = oldsavestate vr = renderers.current if (findString ((classof vr) as string) "v_ray") != undefined then ( vr.output_saveRawFile = oldoutput_saveRawFile vr.output_rawFileName = oldoutput_rawFileName vr.output_on = oldoutput_on ) --restore netrender rendUseNet = oldrenderUseNet --restore viewport type and camera if not silent submit mode if (show_net_submit.enabled and show_net_submit.checked) or (not net_render.checked) then ( if viewport_type == #view_camera then viewport.setCamera old_camera else viewport.setType viewport_type ) ) else ( --cancellation ) ) --############ --ON OPEN event handler --initialization --############ on batchCameraRender_mainRollOut open do ( --dotNet object initialization lv_objects.GridLines = true --same as in ActiveX lv_objects.CheckBoxes = true lv_objects.Sorting = (dotNetClass "System.Windows.Forms.SortOrder").Ascending lv_objects.HeaderStyle = (dotNetClass "System.Windows.Forms.ColumnHeaderStyle").NonClickable lv_objects.View = (dotNetClass "System.Windows.Forms.View").Details lv_objects.FullRowSelect = true --same as in ActiveX --lv_objects.Activation = (dotNetClass "System.Windows.Forms.ItemActivation").Standard lv_objects.HideSelection = false layout_def = #("Camera", "Frames", "Resolution", "Path", "Subfolder", "Solo Lights", "Lights On", "Lights Off", "Scene State") for i in layout_def do lv_objects.Columns.add i --96 --add column with name and optional width --fill in spreadshit dotNet version ItemsArray = #() --array to collect the list items if CAMERA_LIST.count > 0 then ( listItem_counter = 0 --only to count list items. to save and restore their checked state for camera_obj in CAMERA_LIST do ( listItem_counter += 1 li = dotNetObject "System.Windows.Forms.ListViewItem" camera_obj.name li.UseItemStyleForSubItems = false sub_li = undefined --subitem variable --get framerange temp_string1 = getUserProp camera_obj "BatchCameraRender_frames" temp_string2 = getUserProp camera_obj "BatchCameraRender_framerange_from" temp_string3 = getUserProp camera_obj "BatchCameraRender_framerange_to" temp_string5 = getUserProp camera_obj "BatchCameraRender_anim_frame_range" if (temp_string5 != undefined and temp_string5 != "undefined") then ( --render_frames temp_frame_range = get_key_range camera_obj frame_from = temp_frame_range[1].frame as string frame_to = temp_frame_range[2].frame as string sub_li = li.SubItems.add ("anim.range:" + (frame_from as integer) as string + "..." + (frame_to as integer) as string) sub_li.ForeColor = sub_li.ForeColor.Black ) else if (temp_string1 != undefined and temp_string1 != "undefined") then ( --render_frames sub_li = li.SubItems.add (temp_string1 as string) sub_li.ForeColor = sub_li.ForeColor.Black ) else if (temp_string2 != undefined and temp_string2 != "undefined") then ( if (temp_string2 as integer == temp_string3 as integer) then ( --single frame sub_li = li.SubItems.add (temp_string2 as string) sub_li.ForeColor = sub_li.ForeColor.Black ) else ( --frame range sub_li = li.SubItems.add (temp_string2 as string + "..." + temp_string3 as string) sub_li.ForeColor = sub_li.ForeColor.Black ) ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "frames" --set subitem name for the .Key property in SubItemCollection method --get frame size xres_prop = getUserProp camera_obj "BatchCameraRender_frame_width" yres_prop = getUserProp camera_obj "BatchCameraRender_frame_heigth" if (xres_prop != undefined and xres_prop != "undefined") and (yres_prop != undefined and yres_prop != "undefined") then ( sub_li = li.SubItems.add (xres_prop as string + " x " + yres_prop as string ) sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "resolution" --set subitem name for the .Key property in SubItemCollection method --get filename temp_string = getUserProp camera_obj "BatchCameraRender_render_output" if (temp_string != undefined and temp_string != "undefined") then ( sub_li = li.SubItems.add temp_string sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "path" --set subitem name for the .Key property in SubItemCollection method --get subfolder property temp_string = getUserProp camera_obj "BatchCameraRender_add_subfolder" if (temp_string != undefined and temp_string != "undefined") then ( sub_li = li.SubItems.add temp_string sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "add_subfolder" --set subitem name for the .Key property in SubItemCollection method --get lightstate temp_string = getUserProp camera_obj "BatchCameraRender_solo_lights" if (temp_string != undefined and temp_string != "undefined") then ( sub_li = li.SubItems.add temp_string sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "solo_lights" --set subitem name for the .Key property in SubItemCollection method temp_string = getUserProp camera_obj "BatchCameraRender_on_lights" if (temp_string != undefined and temp_string != "undefined") then ( sub_li = li.SubItems.add temp_string sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "on_lights" --set subitem name for the .Key property in SubItemCollection method temp_string = getUserProp camera_obj "BatchCameraRender_off_lights" if (temp_string != undefined and temp_string != "undefined") then ( sub_li = li.SubItems.add temp_string sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "off_lights" --set subitem name for the .Key property in SubItemCollection method --scene state part temp_string = getUserProp camera_obj "BatchCameraRender_scene_state" if (temp_string != undefined and temp_string != "undefined") then ( sub_li = li.SubItems.add (temp_string as string) sub_li.ForeColor = sub_li.ForeColor.Black ) else ( sub_li = li.SubItems.add ("undefined") sub_li.ForeColor = sub_li.ForeColor.Gray ) sub_li.name = "scene_state" --set subitem name for the .Key property in SubItemCollection method --code to restore list items' checked state --initialize state varialble if it is undefined or if camera count doesn't match with state's count if BatchCam_listItem_state == undefined then BatchCam_listItem_state = #() BatchCam_listItem_state.count = CAMERA_LIST.count if BatchCam_listItem_state[listItem_counter] == true then li.checked = true else ( BatchCam_listItem_state[listItem_counter] = false li.checked = false ) --end of restore code append ItemsArray li --we add the list item to the array ) lv_objects.Items.AddRange ItemsArray--when done, we populate the ListView lv_objects.AutoResizeColumns (dotNetClass "System.Windows.Forms.ColumnHeaderAutoResizeStyle").HeaderSize lv_objects.Refresh() LV_ITEMS = #() --this array contains listview items for convinience for i=0 to (lv_objects.Items.Count - 1) do append LV_ITEMS (lv_objects.Items.Item i) --init ui elements with session persistent variables --net render checkbox if BatchCam_net_render_state != undefined then net_render.checked = BatchCam_net_render_state else ( net_render.checked = false BatchCam_net_render_state = false ) if BatchCam_show_submit_dialog_state != undefined then show_net_submit.checked = BatchCam_show_submit_dialog_state else ( show_net_submit.checked = false BatchCam_show_submit_dialog_state = false ) --show or not render buttons is_selected = false --temporary value --check if some list item is checked format "" for state in BatchCam_listItem_state do is_selected = (is_selected or state) --if checked then activate render buttons if is_selected then render_buttons_active true else render_buttons_active false ) else ( --no camera in scene --deactivate render buttons render_buttons_active false --and all other elements too for control_element in batchCameraRender_mainRollOut.controls do control_element.enabled = false ) ) --##########-- --select item event handler - DOTNET VERSION-- --##########-- on lv_objects Click val do ( -- format "SelectedItems - %\n" lv_objects.SelectedItems -- showmethods lv_objects.SelectedItems -- format "SelectedItems.Count - %\n" lv_objects.SelectedItems.Count -- lv_objects.SelectedItems.Item 0 --create selected Items array lis = #() for i=0 to (lv_objects.SelectedItems.Count - 1) do append lis (lv_objects.SelectedItems.Item i) if lis.count > 0 then ( --populate image size fields if lis.count == 1 then ( obj_name = lis[1].text obj_itself = getNodeByName obj_name --get frame size temp_string = getUserProp obj_itself "BatchCameraRender_frame_width" if (temp_string != undefined and temp_string != "undefined") then Output_Size_Rollout.frame_width.value = temp_string as integer temp_string = getUserProp obj_itself "BatchCameraRender_frame_heigth" if (temp_string != undefined and temp_string != "undefined") then Output_Size_Rollout.frame_height.value = temp_string as integer --set the pixel aspect PIXEL_ASPECT = Output_Size_Rollout.pixel_aspect_spinner.value = (Output_Size_Rollout.frame_width.value as float)/(Output_Size_Rollout.frame_height.value as float) Output_Size_Rollout.lock_aspect.checked = false Output_Size_Rollout.pixel_aspect_spinner.enabled = true --display scene state in dropdown list temp_string = getUserProp obj_itself "BatchCameraRender_scene_state" if (temp_string != undefined and temp_string != "undefined") then Scene_States_Rollout.scene_states_list.selection = (sceneStateMgr.FindSceneState (temp_string as string)) + 1 -- plus 1 because dropdown list contains "undefined" as firs item ) --get filename --function to populate filename parts elements_active true populate_filename_fields lis --populate framerandge populate_framerange lis --populate light_state populate_light_state lis populate_add_folder_state lis ) else ( --deactivate rollout elements elements_active false is_selected = false --temporary value --check if some list item is checked for state in BatchCam_listItem_state do is_selected = (is_selected or state) --if checked then activate render buttons if is_selected then render_buttons_active true ) ) --check event handler --used to save items' checked state --and to activate render button on lv_objects ItemCheck val do ( BatchCam_listItem_state[val.index + 1] = (val.CurrentValue.value__ == 0) is_selected = false --temporary value if (val.CurrentValue.value__ == 1) then -- if item is unchecked then ( --check if some list item is checked for state in BatchCam_listItem_state do is_selected = (is_selected or state) --if checked then activate render buttons if not is_selected then render_buttons_active false ) else render_buttons_active true ) on batchCameraRender_mainRollOut rolledUp state do BatchCam_rollout_state[1] = state ) rollout Net_Render_Options_Rollout "Net Render Options (beta)" ( -- group "Net Job Naming" -- ( -- label label_jobname_01 "Job name = prefix:" align:#left across:5 enabled:false -- edittext net_job_prefix align:#left fieldWidth:80 offset: [-7,0] enabled:false -- label label_jobname_02 "+ camera name + suffix:" align:#left offset: [-10,0] enabled:false -- edittext net_job_suffix align:#left fieldWidth:80 offset: [8,0] enabled:false -- label label_jobname_03 " + number" align:#left offset: [5,0] enabled:false -- ) group "Connection Options" ( checkbox Auto_Search "Automatic Search" align:#left offset: [0,0] edittext Name_Or_Mask "Manager Name or IP Address:" labelOnTop:true align:#left fieldWidth:180 offset: [0,0] across:2 edittext Port "Port:" labelOnTop:true align:#left fieldWidth:80 offset: [0,0] tooltip:"Doesn't work in this version." ) on Auto_Search changed state do ( if state then ( Name_Or_Mask.caption = "Subnet Mask:" Name_Or_Mask.text = "255.255.255.0" ) else ( Name_Or_Mask.caption = "Manager Name or IP Address:" Name_Or_Mask.text = "vavilon" ) ) on Net_Render_Options_Rollout open do ( --turn on all elements if net_render is checked and enabled and show_dialog is off if (batchCameraRender_mainRollOut.net_render.checked and batchCameraRender_mainRollOut.net_render.enabled) \ and not batchCameraRender_mainRollOut.show_net_submit.checked then for control_element in Net_Render_Options_Rollout.controls do control_element.enabled = true else for control_element in Net_Render_Options_Rollout.controls do control_element.enabled = false Auto_Search.checked = True Name_Or_Mask.caption = "Subnet Mask:" Name_Or_Mask.text = "255.255.255.0" Port.text = "Default" ) on Net_Render_Options_Rollout rolledUp state do BatchCam_rollout_state[2] = state ) rollout Output_Size_Rollout "Output Size" ( dropdownlist out_size_list width:200 across:2 button clear_resolution "Clear" width:65 align:#right label label1 "Width:" align:#left across:5 spinner frame_width range:[0,10000,640] type:#integer width:70 offset: [-60,0] label label11 "Image Aspect:" align:#left offset: [-20,0] spinner pixel_aspect_spinner range:[0,10000,1.333] type:#float width:70 offset: [-70,0] checkbutton lock_aspect "Lock" width:30 align:#left offset: [-57,-3] label label2 "Height:" align:#left across:2 spinner frame_height range:[0,10000,480] type:#integer width:70 offset: [-300,0] on Output_Size_Rollout open do ( --resolution dropdownlist init temparray = #() for i in RESOLUTIONS do ( append temparray ("" + (i[1] as integer) as string + " x " + (i[2] as integer) as string) ) out_size_list.items = temparray ) --##########-- --set render size event handler-- --##########-- on out_size_list selected item do ( frame_width.value = RESOLUTIONS[item][1] frame_height.value = RESOLUTIONS[item][2] pixel_aspect_spinner.value = RESOLUTIONS[item][1] as float / RESOLUTIONS[item][2] as float PIXEL_ASPECT = pixel_aspect_spinner.value --call method to add/update properties to selected camera object set_resolution LV_ITEMS RESOLUTIONS[item][1] RESOLUTIONS[item][2] ) on frame_width changed val do ( val = val as float if lock_aspect.checked then frame_height.value = val / PIXEL_ASPECT as float else pixel_aspect_spinner.value = PIXEL_ASPECT = val / frame_height.value as float --call method to add/update properties to selected camera object set_resolution LV_ITEMS (frame_width.value) (frame_height.value) ) on frame_height changed val do ( val = val as float if lock_aspect.checked then frame_width.value = val * PIXEL_ASPECT as float else pixel_aspect_spinner.value = PIXEL_ASPECT = frame_width.value as float / val --call method to add/update properties to selected camera object set_resolution LV_ITEMS (frame_width.value) (frame_height.value) ) on lock_aspect changed state do ( pixel_aspect_spinner.enabled = (state != true) ) on pixel_aspect_spinner changed val do ( PIXEL_ASPECT = val as float frame_height.value = frame_width.value / PIXEL_ASPECT set_resolution LV_ITEMS frame_width.value frame_height.value ) on clear_resolution pressed do ( for i in LV_ITEMS do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name setUserProp obj_itself "BatchCameraRender_frame_width" undefined setUserProp obj_itself "BatchCameraRender_frame_heigth" undefined (i.SubItems.Item "resolution").ForeColor = (i.SubItems.Item "resolution").ForeColor.Gray (i.SubItems.Item "resolution").text = "undefined" ) ) ) on Output_Size_Rollout rolledUp state do BatchCam_rollout_state[3] = state ) rollout Render_Output_Rollout "Render Output" ( checkbox save_file "Save File" tooltip:"Common property for all camera.\nPersistent during current 3dsmax session" align:#left across:3 checkbox save_vray_image_file "Save V-ray Raw Image File (not saving)" offset:[40,0] align:#left enabled:false checked:SAVE_VRAY_IMAGE_FILE_STATE dropdownlist vray_extension_list width:55 offset: [0,-2] align:#right button file_button "File..." align:#left width:60 across:3 edittext result_file_name width:320 offset: [-90,0] readonly:true button clear_render_output "Clear" width:65 align:#right label label3 "Filename:" align:#left across:3 edittext file_name width:180 offset: [-90,0] checkbox file_from_camera "Filename From Camera Name" align:#left offset: [-50,0] button folder_button "Folder..." align:#left width:60 offset: [0,-2] across:3 edittext file_path width:180 align:#left offset: [-90,0] checkbox folder_from_camera "Add Folders From Camera Name" align:#left offset: [-50,0] button open_current_folder "Open Folder" width:65 align:#left on Render_Output_Rollout open do ( temparray = #(".exr", ".vrimg") vray_extension_list.items = temparray -- format "BatchCam_save_file - %\n" BatchCam_save_file --get settings from global variables --save file state if BatchCam_save_file != undefined then save_file.checked = BatchCam_save_file else ( save_file.checked = true BatchCam_save_file = true ) --save vray image setting if BatchCam_save_vray_image_file != undefined then save_vray_image_file.checked = BatchCam_save_vray_image_file else ( save_vray_image_file.checked = false BatchCam_save_vray_image_file = false ) ) --save settings in global vars. on save_file changed state do BatchCam_save_file = state --save settings in global vars. on save_vray_image_file changed state do BatchCam_save_vray_image_file = state on file_button pressed do ( try IMAGE_FILE_NAME = getBitmapSaveFileName() catch (getCurrentException()) if IMAGE_FILE_NAME != undefined then ( file_name.text = filenameFromPath IMAGE_FILE_NAME file_path.text = getFilenamePath IMAGE_FILE_NAME result_file_name.text = IMAGE_FILE_NAME set_render_output LV_ITEMS IMAGE_FILE_NAME populate_filename_fields LV_ITEMS ) ) on file_name entered val do ( --get full path from camera --get filename --change filename --create new fullpath --save full path to camera --go to next camera set_render_file LV_ITEMS val populate_filename_fields LV_ITEMS ) on file_path entered val do ( --get full path from camera --get folder path --change folder path --create new fullpath --save full path to camera --go to next camera set_render_folder LV_ITEMS val populate_filename_fields LV_ITEMS ) --set the folder via the dialog box on folder_button pressed do ( folder_name = getSavePath caption:"Choose Folder" initialDir:file_path.text if folder_name != undefined then ( set_render_folder LV_ITEMS folder_name populate_filename_fields LV_ITEMS ) ) on open_current_folder pressed do ( temp_res = ShellLaunch ("explorer.exe") ( "/n, " + file_path.text) -- print temp_res ) on folder_from_camera changed state do ( --if this checkbox is set new subfolder will be added to the render path. --this vairiable should be saved in camera properties. --also this variable should be listed in dotNet listbox. Preferably show this item as checkbox after path column set_add_subfolder LV_ITEMS state ) on clear_render_output pressed do ( for i in LV_ITEMS do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name setUserProp obj_itself "BatchCameraRender_render_output" undefined setUserProp obj_itself "BatchCameraRender_add_subfolder" undefined (i.SubItems.Item "path").ForeColor = (i.SubItems.Item "path").ForeColor.Gray (i.SubItems.Item "add_subfolder").ForeColor = (i.SubItems.Item "add_subfolder").ForeColor.Gray (i.SubItems.Item "path").text = "undefined" (i.SubItems.Item "add_subfolder").text = "undefined" ) ) populate_filename_fields LV_ITEMS ) on Render_Output_Rollout rolledUp state do BatchCam_rollout_state[5] = state ) rollout Frame_Range_Rollout "Frame Range" ( radiobuttons rendType1 labels:#("Single") columns:1 default:1 align:#left across:4 spinner render_single range:[-10000,10000,0] type:#integer width:70 align:#left offset: [-50,0] enabled:false button set_current "Set Current" offset: [-66,-3] width:65 align:#left --button to set current frame button clear_frames "Clear" width:65 align:#right radiobuttons rendType2 labels:#("Range") columns:1 default:0 align:#left across:6 spinner render_from range:[0,10000,0] type:#integer width:70 align:#left offset: [-10,0] enabled:false label label9 "To" align:#left offset: [-9,0] spinner render_to range:[0,10000,10] type:#integer width:70 align:#left offset: [-65,0] enabled:false label label99 "Every Nth Frame:(not saving)" align:#right offset: [0,0] spinner render_every_nth range:[1,10000,0] type:#integer width:70 align:#right offset: [0,0] enabled:false radiobuttons rendType3 labels:#("Frames") columns:1 default:0 align:#left across:2 edittext render_frames fieldWidth:250 offset: [-167,0] enabled:false radiobuttons rendType5 labels:#("Anim. Range") columns:1 default:0 align:#left across:3 edittext render_anim_from width:70 offset: [-70,0] readonly:true edittext render_anim_to width:70 offset: [-150,0] readonly:true --#####-- --render type switch event handler-- --#####-- on Frame_Range_Rollout open do ( render_every_nth.value = 1 ) on rendType1 changed val do ( if val==1 then ( rendType2.state = 0 rendType3.state = 0 rendType5.state = 0 render_single.enabled = true render_anim_to.enabled=render_anim_from.enabled= render_from.enabled = render_to.enabled = render_frames.enabled = false set_frame_single LV_ITEMS render_single.value ) ) --button to set current frame on set_current pressed do ( rendType1.state = 1 rendType2.state = 0 rendType3.state = 0 rendType5.state = 0 render_single.enabled = true render_anim_to.enabled=render_anim_from.enabled= render_from.enabled = render_to.enabled = render_frames.enabled = false render_single.value = sliderTime.frame set_frame_single LV_ITEMS render_single.value ) on rendType2 changed val do ( if val==1 then ( rendType1.state = 0 rendType3.state = 0 rendType5.state = 0 render_from.enabled = render_to.enabled = true set_current.enabled = render_single.enabled = render_anim_to.enabled=render_anim_from.enabled= render_frames.enabled = false set_frame_range LV_ITEMS render_from.value render_to.value ) ) on rendType3 changed val do ( if val==1 then ( rendType1.state = 0 rendType2.state = 0 rendType5.state = 0 set_current.enabled = render_anim_to.enabled=render_anim_from.enabled= render_from.enabled = render_to.enabled = false render_frames.enabled = true if render_frames.text != "" then set_frames LV_ITEMS render_frames.text ) ) on rendType5 changed val do ( if val==1 then ( rendType1.state = 0 rendType2.state = 0 rendType3.state = 0 set_current.enabled = render_single.enabled = render_frames.enabled = render_from.enabled = render_to.enabled = false render_anim_to.enabled=render_anim_from.enabled= true set_anim_frame_range LV_ITEMS ) ) --handlers to handle start and end frames on render_from changed val do ( set_frame_range LV_ITEMS render_from.value render_to.value ) on render_to changed val do ( set_frame_range LV_ITEMS render_from.value render_to.value ) on render_single changed val do ( set_frame_single LV_ITEMS render_single.value ) --event handler to prevent entering symbols except digits, commas and "-"-s on render_frames changed val do ( tempstring = "" teststr = #("0","1","2","3","4","5","6","7","8","9","-",","," ") for i=1 to val.count do ( tempchar = val[i] if finditem teststr tempchar != 0 then tempstring = tempstring + tempchar ) render_frames.text = tempstring ) --this event handler calls set_frames function to set frame to render to camera properties --there's no error checking because on_entered handler should filter unwanted symbols --so just copy this string to rendPickupFrames global variable on render_frames entered val do ( rendType1.state = 0 rendType2.state = 0 render_from.enabled = render_to.enabled = false set_frames LV_ITEMS val ) on clear_frames pressed do ( for i in LV_ITEMS do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name setUserProp obj_itself "BatchCameraRender_framerange_from" undefined setUserProp obj_itself "BatchCameraRender_framerange_to" undefined (i.SubItems.Item "frames").ForeColor = (i.SubItems.Item "frames").ForeColor.Gray (i.SubItems.Item "frames").text = "undefined" ) ) ) on Frame_Range_Rollout rolledUp state do BatchCam_rollout_state[4] = state ) rollout Scene_States_Rollout "Scene State" ( label label1 "Scene State" align:#left offset:[0,2] across:3 dropdownlist scene_states_list width:200 align:#left offset:[-85,0] button clear_scene_states "Clear" width:65 align:#right on Scene_States_Rollout open do ( scenestate_count = sceneStateMgr.GetCount() temparray = #("undefined") for i=1 to scenestate_count do append temparray ((sceneStateMgr.GetSceneState i) as string) scene_states_list.items = temparray ) on scene_states_list selected item do ( -- print scene_states_list.selected set_scene_state LV_ITEMS scene_states_list.selected ) on clear_scene_states pressed do ( for i in LV_ITEMS do ( if i.selected then ( obj_name = i.text obj_itself = getNodeByName obj_name setUserProp obj_itself "BatchCameraRender_scene_state" undefined (i.SubItems.Item "scene_state").ForeColor = (i.SubItems.Item "scene_state").ForeColor.Gray (i.SubItems.Item "scene_state").text = "undefined" scene_states_list.selection = 1 ) ) ) on Scene_States_Rollout rolledUp state do BatchCam_rollout_state[6] = state ) rollout Light_Assignement_Rollout "Light Assignement" ( label label6 "Solo Lights"align:#left across:3 label label7 "Lights Forced On" align:#left label label8 "Lights Forced Off" align:#left button add_solo_lights_button "Add..." align:#left width:65 across:6 button clear_solo_lights_button "Clear" align:#right width:45 offset:[-20,0] button add_forceon_lights_button "Add..." align:#left width:65 button clear_forceon_lights_button "Clear" align:#right width:45 offset:[-20,0] button add_forceoff_lights_button "Add..." align:#left width:65 button clear_forceoff_lights_button "Clear" align:#right width:45 offset:[-20,0] MultiListBox light_box_solo height:5 across:3 MultiListBox light_box_forceon height:5 MultiListBox light_box_forceoff height:5 edittext label10 text:"Lists are given in order of priority: If Solo lights are present then Off and On lights are ignored.\r\nOn lights are on even if they're present in Off lights list. " height:32 align:#left readonly:true on add_solo_lights_button pressed do ( --call dialog box to select the lights --store solo-light list --fill multilistbox with light names fn light_filt obj = isKindOf obj Light templights = selectByName title:"Select Lights" buttonText:"Select" filter:light_filt showHidden:true single:false --select objects by name if templights != undefined then ( for i=1 to templights.count do templights[i] = templights[i].name light_box_solo.items = templights --fill in the listbox ui set_light_state cameraItems:LV_ITEMS solo_lights:templights ) ) on clear_solo_lights_button pressed do ( light_box_solo.items = #() set_light_state cameraItems:LV_ITEMS solo_lights:#("undefined") ) on add_forceon_lights_button pressed do ( --call dialog box to select the lights --store solo-light list --fill multilistbox with light names fn light_filt obj = isKindOf obj Light templights = selectByName title:"Select Lights" buttonText:"Select" filter:light_filt showHidden:true single:false if templights != undefined then ( for i=1 to templights.count do templights[i] = templights[i].name light_box_forceon.items = templights --fill in the listbox ui set_light_state cameraItems:LV_ITEMS on_lights:templights ) ) on clear_forceon_lights_button pressed do ( light_box_forceon.items = #() set_light_state cameraItems:LV_ITEMS on_lights:#("undefined") ) on add_forceoff_lights_button pressed do ( --call dialog box to select the lights --store solo-light list --fill multilistbox with light names fn light_filt obj = isKindOf obj Light templights = selectByName title:"Select Lights" buttonText:"Select" filter:light_filt showHidden:true single:false if templights != undefined then ( for i=1 to templights.count do templights[i] = templights[i].name light_box_forceoff.items = templights set_light_state cameraItems:LV_ITEMS off_lights:templights ) ) on clear_forceoff_lights_button pressed do ( light_box_forceoff.items = #() set_light_state cameraItems:LV_ITEMS off_lights:#("undefined") ) on Light_Assignement_Rollout rolledUp state do BatchCam_rollout_state[7] = state ) rollout aboutRoll "About" ( label lb_about "Camera Manager 1.6" label lb_author "Sergo Pogosyan" hyperLink lb_email "sergo.pogosyan@gmail.com" address:"mailto:sergo.pogosyan@gmail.com" align:#center hyperLink lb_homepage "www.sergepogosyan.com" address:"http://www.sergepogosyan.com" align:#center label lb_year "2009" on aboutRoll rolledUp state do BatchCam_rollout_state[8] = state ) try(CloseRolloutFloater batchCameraRender_floater)catch() batchCameraRender_floater = newRolloutFloater "Batch Camera Render 1.6" 500 (if BatchCam_dialog_height == undefiend then 850 else BatchCam_dialog_height) addRollout batchCameraRender_mainRollOut batchCameraRender_floater addRollout Net_Render_Options_Rollout batchCameraRender_floater addRollout Output_Size_Rollout batchCameraRender_floater addRollout Frame_Range_Rollout batchCameraRender_floater addRollout Render_Output_Rollout batchCameraRender_floater addRollout Scene_States_Rollout batchCameraRender_floater addRollout Light_Assignement_Rollout batchCameraRender_floater addRollout aboutRoll batchCameraRender_floater elements_active false --rollout state store and restore function for i=1 to batchCameraRender_floater.rollouts.count do ( if BatchCam_rollout_state == undefined then ( BatchCam_rollout_state = #() --initial state if no saved state aboutRoll.open = False Light_Assignement_Rollout.open = False Scene_States_Rollout.open = False Net_Render_Options_Rollout.open = False ) if BatchCam_rollout_state[i] != undefined then ( batchCameraRender_floater.rollouts[i].open = BatchCam_rollout_state[i] ) else ( BatchCam_rollout_state[i] = batchCameraRender_floater.rollouts[i].open -- format "roll - %, state - %\n" batchCameraRender_floater.rollouts[i] batchCameraRender_floater.rollouts[i].open ) ) batchCameraRender_mainRollOut.lv_objects.Refresh() --refresh the dotNet control escapeEnable = false )