------------------------------------------------------------------------------ -- BatchCameraRender.ms -- By Sergo Pogosyan (www.sergepogosyan.com, contact@sergepogosyan.com) -- v 1.4 -- Created On: 2009-02-23 -- tested using Max 2009 ------------------------------------------------------------------------------- -- Description: -- macroscript aims to replace builtin batch render ------------------------------------------------------------------------------- -- Installing and usage: -- When you start this script it iterates over all cameras in scene and list them in the dialog box. -- To each of these cameras you can assign frame resolution, number of frames to render including -- nonsequential frames, output file location and lighting setup. All these properties can be changed -- for one or several selected cameras. Output file location is split to folder path and file name, -- so you can specify new folder for all selected cameras in scene. 'Lighting assignement' section contains -- three list: Solo light list contains lights that will be only lights turned on during the rendering, 'Forced On' -- and 'Forced Off' lights are turned on or off respectively during the rendering. After all these settings are setted -- up check the camera(s) in the list and hit Render button. Check Net Render checkbox to submit network render job. ------------------------------------------------------------------------------- -- TO DO list: -- Major features -- done - check light names before render submitting -- done - BUG: aspect ratio -- done - BUG: if included lights are listed excluded lights don't work -- remeber camera checked state -- get frame range from camera animation -- check if render is production and not iterative --done - add preview functionality - save file checkbox. --done -- add Scene State property to camera object --done (not saving in camera data)-- add Render Every Nth Frame spinner to UI -- fixed BUG: If scene contains object with the name same as selected camera's name "Select camera" button selects that object instead of camera. -- done add "Folder by camera name" checkbox -- done add Vray image format saving option. -- Minor features -- done - When assigning new render path, check if it exists, if not suggest to create this path. -- done - Add Folder button -- done Add option to derive file names from camera names -- done via selecting camera. You can switch vieport to selected camera easily - Switch current viewport to camera selected from the list -- done - Open camera's folder with button -- Get settings from max settings -- done - Sort the camera list ------------------------------------------------------------------------------- -- history -- 2008-12-12: start -- 2009-02-04: main features are ready -- 2009-02-10: most minor features are ready -- 2009-02-11: description is ready -- 2009-02-12: made macroscript, ready to publish -- 2009-02-16: converted to dotNet version for x64 platform, bug fixes, refactoring -- 2009-03-02: bugfixes and improvement -- 2009-03-27: SceneState property added. Bugfixes. -- 2009-04-03: Split to script and functions file. -- 2009-04-03: New option added - "Folder by camera name" checkbox -- 2009-04-07: New optin added - "Save V-ray Raw Image file" checkbox ------------------------------------------------------------------------------- --THIS STRUCTURE IS NOT USED --JUST UNSORTED PROPERTIES WITH "BatchCameraRender_" HEADER --camera properties structure-- --header - sergo_batchCameraRender_data --frame --frame_range --frames --width --heigth --pixelaspect --outputfile --lighting section --solo_lights --force_on_lights --force_off_lights --end of lighting section --enumerate cameras in scene --propagate list of cameras with camera objects --read properties from selected camera object --derive output folder properties from full path in camera properties --setting the output folder --if none of the camera is selected then changing the output folder changes output paths for all camera objects. --if one or more camera is selected then changing the output folder changes output paths for selected camera objects only. --propagating output folder property in dialog window --if output folder is common for all the cameras then set this output path in property field --if some property changed in dialog window then update camera property --when render button pressed apply properties to render command and start render 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 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 --########################-- --FUNCTIONS for batch camera render script --version 1.4 --2009-04-07 --########################-- -- --function to switch winodw element's activity state fn elements_active state = ( --main section batchCameraRender_mainRollOut.render_start.enabled = state batchCameraRender_mainRollOut.net_render.enabled = state batchCameraRender_mainRollOut.select_camera.enabled = state --filename section batchCameraRender_mainRollOut.save_file.enabled = state batchCameraRender_mainRollOut.file_button.enabled = state batchCameraRender_mainRollOut.file_name.enabled = state batchCameraRender_mainRollOut.folder_button.enabled = state batchCameraRender_mainRollOut.file_path.enabled = state batchCameraRender_mainRollOut.clear_render_output.enabled = state batchCameraRender_mainRollOut.file_from_camera.enabled = state batchCameraRender_mainRollOut.open_current_folder.enabled = state batchCameraRender_mainRollOut.folder_from_camera.enabled = state if (findString ((classof (renderers.current)) as string) "v_ray") != undefined then batchCameraRender_mainRollOut.save_vray_image_file.enabled = state --lights section batchCameraRender_mainRollOut.add_solo_lights_button.enabled = state batchCameraRender_mainRollOut.clear_solo_lights_button.enabled = state batchCameraRender_mainRollOut.add_forceon_lights_button.enabled = state batchCameraRender_mainRollOut.clear_forceon_lights_button.enabled = state batchCameraRender_mainRollOut.add_forceoff_lights_button.enabled = state batchCameraRender_mainRollOut.clear_forceoff_lights_button.enabled = state batchCameraRender_mainRollOut.light_box_solo.enabled = state batchCameraRender_mainRollOut.light_box_forceon.enabled = state batchCameraRender_mainRollOut.light_box_forceoff.enabled = state --frame range section batchCameraRender_mainRollOut.rendType1.enabled = state batchCameraRender_mainRollOut.clear_frames.enabled = state batchCameraRender_mainRollOut.rendType2.enabled = state batchCameraRender_mainRollOut.render_from.enabled = state batchCameraRender_mainRollOut.render_to.enabled = state batchCameraRender_mainRollOut.rendType3.enabled = state batchCameraRender_mainRollOut.render_frames.enabled = state batchCameraRender_mainRollOut.render_every_nth.enabled = state batchCameraRender_mainRollOut.label99.enabled = state --resolution section batchCameraRender_mainRollOut.out_size_list.enabled = state batchCameraRender_mainRollOut.clear_resolution.enabled = state batchCameraRender_mainRollOut.pixel_aspect_spinner.enabled = state batchCameraRender_mainRollOut.lock_aspect.enabled = state batchCameraRender_mainRollOut.frame_height.enabled = state batchCameraRender_mainRollOut.frame_width.enabled = state --scene state section batchCameraRender_mainRollOut.label111.enabled = state batchCameraRender_mainRollOut.scene_states_list.enabled = state batchCameraRender_mainRollOut.clear_scene_states.enabled = state ) --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 (i.SubItems.Item "scene_state").text = state --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 batchCameraRender_mainRollOut.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 batchCameraRender_mainRollOut.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") batchCameraRender_mainRollOut.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 batchCameraRender_mainRollOut.folder_from_camera.checked = temp_state else batchCameraRender_mainRollOut.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 = batchCameraRender_mainRollOut.rendType1 rendType2 = batchCameraRender_mainRollOut.rendType2 rendType3 = batchCameraRender_mainRollOut.rendType3 render_from = batchCameraRender_mainRollOut.render_from render_to = batchCameraRender_mainRollOut.render_to render_frames = batchCameraRender_mainRollOut.render_frames --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" if (temp_string1 != undefined and temp_string1 != "undefined") then ( --render_frames rendType1.state = 0 rendType2.state = 0 rendType3.state = 1 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 render_from.enabled = render_to.enabled = render_frames.enabled = false render_from.value = temp_string2 as integer render_to.value = temp_string3 as integer ) else ( --frame range rendType1.state = 0 rendType2.state = 1 rendType3.state = 0 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 = batchCameraRender_mainRollOut.result_file_name file_name = batchCameraRender_mainRollOut.file_name file_path = batchCameraRender_mainRollOut.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 = batchCameraRender_mainRollOut.light_box_solo on_lights = batchCameraRender_mainRollOut.light_box_forceon off_lights = batchCameraRender_mainRollOut.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_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_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 ) ) ) --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_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 messagebox ("Light \"" + light_name + "\" not found.") title:"Error" ) --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:3 checkbox net_render "Net Render" align:#left offset: [-55,4] button select_camera "Select Camera(s) in Scene" align:#left width:150 offset: [-56,0] --#####-- --list button event handlers-- --#####-- 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 ) on uncheck_all pressed do ( for i in LV_ITEMS do i.checked = 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 Would you like to close it now?" 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 viewport.setCamera camera_to_render --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" 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 = batchCameraRender_mainRollOut.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 = batchCameraRender_mainRollOut.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 = batchCameraRender_mainRollOut.save_vray_image_file.checked vr.output_saveRawFile = batchCameraRender_mainRollOut.save_vray_image_file.checked vr.output_rawFileName = (getFilenamePath temp_string) + (getFilenameFile temp_string) + ".vrimg" ) ) --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 --render rendUseNet = net_render.checked max quick render ) ) ) --ENDOF TRY BLOCK catch ( format "*** % ***\n" (getCurrentException()) ) --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 lights state restore_lighting_state() --restore viewport type and camera if viewport_type == #view_camera then viewport.setCamera old_camera else viewport.setType viewport_type ) else ( --cancellation ) ) group "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] ) --##########-- --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" ) ) ) group "FrameRange" ( radiobuttons rendType1 labels:#("Single (Current)") columns:1 default:1 align:#left across:4 label label99 "Every Nth Frame:(not saving)" align:#right offset: [70,0] spinner render_every_nth range:[1,10000,0] type:#integer width:70 align:#right offset: [30,0] enabled:false button clear_frames "Clear" width:65 align:#right radiobuttons rendType2 labels:#("Range") columns:1 default:0 align:#left across:4 spinner render_from range:[0,10000,0] type:#integer width:70 align:#left offset: [-50,0] enabled:false label label9 "To" align:#left offset: [-85,0] spinner render_to range:[0,10000,10] type:#integer width:70 align:#left offset: [-180,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 ) --#####-- --render type switch event handler-- --#####-- on rendType1 changed val do ( if val==1 then ( rendType2.state = 0 rendType3.state = 0 render_from.enabled = render_to.enabled = render_frames.enabled = false set_frame_single LV_ITEMS sliderTime.frame ) ) on rendType2 changed val do ( if val==1 then ( rendType1.state = 0 rendType3.state = 0 render_from.enabled = render_to.enabled = true 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 render_from.enabled = render_to.enabled = false render_frames.enabled = true if render_frames.text != "" then set_frames LV_ITEMS render_frames.text ) ) --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 ) --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" ) ) ) --#####-- --end of render type switch event handler-- --#####-- group "Render Output" ( checkbox save_file "Save File (not saving)" align:#left checked:true across:2 checkbox save_vray_image_file "Save V-ray Raw Image File (not saving)" align:#left enabled:false checked:SAVE_VRAY_IMAGE_FILE_STATE button file_button "File..." align:#left width:60 across:3 edittext result_file_name width:254 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 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_cmd = "explorer.exe /n," + file_path.text DOSCommand temp_cmd ) 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 ) group "Scene State" ( label label111 "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_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 ) ) ) group "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 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 for camera_obj in CAMERA_LIST do ( 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" 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 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 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 = #() for i=0 to (lv_objects.Items.Count - 1) do append LV_ITEMS (lv_objects.Items.Item i) --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 --scene state dropdown list scenestate_count = sceneStateMgr.GetCount() temparray = #("undefined") for i=1 to scenestate_count do append temparray (sceneStateMgr.GetSceneState i) scene_states_list.items = temparray render_every_nth.value = 1 elements_active 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 frame_width.value = temp_string as integer temp_string = getUserProp obj_itself "BatchCameraRender_frame_heigth" if (temp_string != undefined and temp_string != "undefined") then frame_height.value = temp_string as integer --set the pixel aspect PIXEL_ASPECT = pixel_aspect_spinner.value = (frame_width.value as float)/(frame_height.value as float) lock_aspect.checked = false 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_list.selection = (sceneStateMgr.FindSceneState temp_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 elements_active false ) ) rollout aboutRoll "About" ( label lb_about "Camera Manager 1.4" 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" ) try(CloseRolloutFloater batchCameraRender_floater)catch() batchCameraRender_floater = newRolloutFloater "Batch Camera Render 1.4" 500 850 addRollout batchCameraRender_mainRollOut batchCameraRender_floater addRollout aboutRoll batchCameraRender_floater aboutRoll.open = False batchCameraRender_mainRollOut.lv_objects.Refresh() --refresh the dotNet control escapeEnable = false )