3delight cloud

45 views
Skip to first unread message

Robert Kolbeins

unread,
May 27, 2025, 8:45:52 AMMay 27
to gaffer-dev
Using local dispatcher I submit render using 3delight cloud.  It does one frame at a time.  I try put number in batch section but same one frame at a time.   Is there a way to dispatch frames in chunks with local dispatcher without manually setting frame masks  ?
Thanks,
R

Robert Kolbeins

unread,
May 27, 2025, 11:13:20 AMMay 27
to gaffer-dev
import Gaffer
import GafferDispatch
import imath

Gaffer.Metadata.registerValue( parent, "serialiser:milestoneVersion", 1, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:majorVersion", 6, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:minorVersion", 0, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 0, persistent=False )

__children = {}

__children["Wedge"] = GafferDispatch.Wedge( "Wedge" )
parent.addChild( __children["Wedge"] )
__children["Wedge"]["preTasks"].resize( 2 )
__children["Wedge"]["ramp"].clearPoints()
__children["Wedge"]["ramp"].addChild( Gaffer.ValuePlug( "p0", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"]["ramp"]["p0"].addChild( Gaffer.FloatPlug( "x", defaultValue = 0.0, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"]["ramp"]["p0"].addChild( Gaffer.Color3fPlug( "y", defaultValue = imath.Color3f( 0, 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"]["ramp"].addChild( Gaffer.ValuePlug( "p1", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"]["ramp"]["p1"].addChild( Gaffer.FloatPlug( "x", defaultValue = 1.0, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"]["ramp"]["p1"].addChild( Gaffer.Color3fPlug( "y", defaultValue = imath.Color3f( 1, 1, 1 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["LocalDispatcher"] = GafferDispatch.LocalDispatcher( "LocalDispatcher" )
parent.addChild( __children["LocalDispatcher"] )
__children["LocalDispatcher"]["tasks"].resize( 2 )
__children["LocalDispatcher"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["PythonCommand"] = GafferDispatch.PythonCommand( "PythonCommand" )
parent.addChild( __children["PythonCommand"] )
__children["PythonCommand"]["variables"].addChild( Gaffer.NameValuePlug( "", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), True, "member1", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["PythonCommand"]["variables"].addChild( Gaffer.NameValuePlug( "", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), True, "member2", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["PythonCommand"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["LocalDispatcher1"] = GafferDispatch.LocalDispatcher( "LocalDispatcher1" )
parent.addChild( __children["LocalDispatcher1"] )
__children["LocalDispatcher1"]["tasks"].resize( 2 )
__children["LocalDispatcher1"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Expression"] = Gaffer.Expression( "Expression" )
parent.addChild( __children["Expression"] )
__children["Expression"]["__in"].addChild( Gaffer.IntPlug( "p0", defaultValue = 5, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Expression"]["__in"].addChild( Gaffer.IntPlug( "p1", defaultValue = 1, minValue = 1, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Expression"]["__out"].addChild( Gaffer.StringPlug( "p0", direction = Gaffer.Plug.Direction.Out, defaultValue = '1-100x10', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Expression"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Wedge"]["preTasks"][0].setInput( __children["LocalDispatcher1"]["task"] )
__children["Wedge"]["dispatcher"]["batchSize"].setValue( 10 )
__children["Wedge"]["dispatcher"]["deadline"]["pool"].setValue( 'none' )
__children["Wedge"]["dispatcher"]["deadline"]["secondaryPool"].setValue( 'none' )
__children["Wedge"]["dispatcher"]["deadline"]["group"].setValue( 'none' )
__children["Wedge"]["mode"].setValue( 1 )
__children["Wedge"]["intMin"].setValue( 1001 )
__children["Wedge"]["intMax"].setValue( 1092 )
__children["Wedge"]["intStep"].setValue( 5 )
__children["Wedge"]["__uiPosition"].setValue( imath.V2f( 56.8000031, -15.600008 ) )
__children["LocalDispatcher"]["dispatcher"]["deadline"]["pool"].setValue( 'none' )
__children["LocalDispatcher"]["dispatcher"]["deadline"]["secondaryPool"].setValue( 'none' )
__children["LocalDispatcher"]["dispatcher"]["deadline"]["group"].setValue( 'none' )
__children["LocalDispatcher"]["tasks"][0].setInput( __children["Wedge"]["task"] )
__children["LocalDispatcher"]["framesMode"].setValue( 2 )
__children["LocalDispatcher"]["frameRange"].setValue( '1001-1092' )
__children["LocalDispatcher"]["jobName"].setValue( '${script:name}' )
__children["LocalDispatcher"]["jobsDirectory"].setValue( '${project:rootDirectory}/dispatcher/local' )
__children["LocalDispatcher"]["executeInBackground"].setValue( True )
__children["LocalDispatcher"]["__uiPosition"].setValue( imath.V2f( 57.5000038, -29.1000004 ) )
__children["PythonCommand"]["dispatcher"]["deadline"]["pool"].setValue( 'none' )
__children["PythonCommand"]["dispatcher"]["deadline"]["secondaryPool"].setValue( 'none' )
__children["PythonCommand"]["dispatcher"]["deadline"]["group"].setValue( 'none' )
__children["PythonCommand"]["command"].setValue( 'frame = context.getFrame()\nprint(frame)\n\n#val = variables["val"]\n#print(val)\n\n#ind = variables["ind"]\n#print(ind)' )
__children["PythonCommand"]["variables"]["member1"]["name"].setValue( 'val' )
__children["PythonCommand"]["variables"]["member1"]["value"].setValue( '${wedge:value}' )
__children["PythonCommand"]["variables"]["member2"]["name"].setValue( 'ind' )
__children["PythonCommand"]["variables"]["member2"]["value"].setValue( '${wedge:index}' )
__children["PythonCommand"]["__uiPosition"].setValue( imath.V2f( 55.4000015, 6.19999504 ) )
__children["LocalDispatcher1"]["dispatcher"]["deadline"]["pool"].setValue( 'none' )
__children["LocalDispatcher1"]["dispatcher"]["deadline"]["secondaryPool"].setValue( 'none' )
__children["LocalDispatcher1"]["dispatcher"]["deadline"]["group"].setValue( 'none' )
__children["LocalDispatcher1"]["tasks"][0].setInput( __children["PythonCommand"]["task"] )
__children["LocalDispatcher1"]["framesMode"].setValue( 2 )
__children["LocalDispatcher1"]["frameRange"].setInput( __children["Expression"]["__out"]["p0"] )
__children["LocalDispatcher1"]["jobName"].setValue( '${script:name}' )
__children["LocalDispatcher1"]["jobsDirectory"].setValue( '${project:rootDirectory}/dispatcher/local' )
__children["LocalDispatcher1"]["executeInBackground"].setValue( True )
__children["LocalDispatcher1"]["__uiPosition"].setValue( imath.V2f( 56.1000023, -4.90000868 ) )
__children["Expression"]["__in"]["p0"].setInput( __children["Wedge"]["intMax"] )
__children["Expression"]["__in"]["p1"].setInput( __children["Wedge"]["intStep"] )
__children["Expression"]["__uiPosition"].setValue( imath.V2f( 44.8078346, -4.90001488 ) )
__children["Expression"]["__engine"].setValue( 'python' )
__children["Expression"]["__expression"].setValue( '\nwedge = context.get(\'wedge:value\', 1)\nintStep = parent["__in"]["p1"]\nmax_frame = parent["__in"]["p0"]\n\n# Calculate the proposed end frame\nproposed_end = int(wedge) + int(intStep) - 1\n\n# Ensure we don\'t go beyond the maximum frame\nendFrame = min(proposed_end, max_frame)\n\nparent["__out"]["p0"] = str(wedge) + "-" + str(endFrame)' )


del __children

Ivan Imanishi

unread,
May 29, 2025, 11:28:35 PMMay 29
to gaffe...@googlegroups.com
I believe you should be setting the PythonCommand's framesMode to "Batch" (under the Advanced tab), and then you'll have access to a `frames` list in the python execution (instead of getting the frame from the context):

for frame in frames:
    print(frame)




--
You received this message because you are subscribed to the Google Groups "gaffer-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to gaffer-dev+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/gaffer-dev/165fc3aa-e5ae-4719-b9a5-fe3df4f61e09n%40googlegroups.com.

Robert Kolbeins

unread,
Jun 2, 2025, 8:27:49 AMJun 2
to gaffer-dev

This is how I managed to get it submitting in batches, not sure if the best way.

import Gaffer
import GafferDispatch
import IECore

import imath

Gaffer.Metadata.registerValue( parent, "serialiser:milestoneVersion", 1, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:majorVersion", 5, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:minorVersion", 14, persistent=False )

Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 0, persistent=False )

__children = {}

__children["Batch_Dispatcher"] = Gaffer.Box( "Batch_Dispatcher" )
parent.addChild( __children["Batch_Dispatcher"] )
__children["Batch_Dispatcher"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.IntPlug( "frameStart", defaultValue = 0, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.StringPlug( "frameEnd", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.StringPlug( "batchSize", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( GafferDispatch.LocalDispatcher( "LocalDispatcher" ) )
__children["Batch_Dispatcher"]["LocalDispatcher"]["tasks"].resize( 2 )
__children["Batch_Dispatcher"]["LocalDispatcher"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.StringPlug( "submit", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.StringVectorDataPlug( "batches", defaultValue = IECore.StringVectorData( [  ] ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.BoxIn( "BoxIn" ) )
__children["Batch_Dispatcher"]["BoxIn"].setup( GafferDispatch.TaskNode.TaskPlug( "out", ) )
__children["Batch_Dispatcher"]["BoxIn"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( GafferDispatch.TaskNode.TaskPlug( "in", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"].addChild( Gaffer.Expression( "Expression1" ) )
__children["Batch_Dispatcher"]["Expression1"]["__in"].addChild( Gaffer.StringPlug( "p0", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"]["Expression1"]["__in"].addChild( Gaffer.StringPlug( "p1", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"]["Expression1"]["__in"].addChild( Gaffer.IntPlug( "p2", defaultValue = 0, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"]["Expression1"]["__out"].addChild( Gaffer.BoolPlug( "p0", direction = Gaffer.Plug.Direction.Out, defaultValue = False, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"]["Expression1"]["__out"].addChild( Gaffer.StringVectorDataPlug( "p1", direction = Gaffer.Plug.Direction.Out, defaultValue = IECore.StringVectorData( [  ] ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Batch_Dispatcher"]["Expression1"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["PythonCommand1"] = GafferDispatch.PythonCommand( "PythonCommand1" )
parent.addChild( __children["PythonCommand1"] )
__children["PythonCommand1"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"], 'noduleLayout:customGadget:addButtonTop:visible', False )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"], 'noduleLayout:customGadget:addButtonBottom:visible', False )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"], 'noduleLayout:customGadget:addButtonLeft:visible', False )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"], 'noduleLayout:customGadget:addButtonRight:visible', False )
__children["Batch_Dispatcher"]["__uiPosition"].setValue( imath.V2f( 82.0809479, -66.6898727 ) )
__children["Batch_Dispatcher"]["frameStart"].setValue( 1001 )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["frameStart"], 'nodule:type', '' )
__children["Batch_Dispatcher"]["frameEnd"].setValue( '1036' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["frameEnd"], 'nodule:type', '' )
__children["Batch_Dispatcher"]["batchSize"].setValue( '10' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["batchSize"], 'nodule:type', '' )
__children["Batch_Dispatcher"]["LocalDispatcher"]["dispatcher"]["deadline"]["pool"].setValue( 'none' )
__children["Batch_Dispatcher"]["LocalDispatcher"]["dispatcher"]["deadline"]["secondaryPool"].setValue( 'none' )
__children["Batch_Dispatcher"]["LocalDispatcher"]["dispatcher"]["deadline"]["group"].setValue( 'none' )
__children["Batch_Dispatcher"]["LocalDispatcher"]["tasks"][0].setInput( __children["Batch_Dispatcher"]["BoxIn"]["out"] )
__children["Batch_Dispatcher"]["LocalDispatcher"]["jobName"].setValue( '${script:name}' )
__children["Batch_Dispatcher"]["LocalDispatcher"]["jobsDirectory"].setValue( '${project:rootDirectory}/dispatcher/local' )
__children["Batch_Dispatcher"]["LocalDispatcher"]["executeInBackground"].setValue( True )
__children["Batch_Dispatcher"]["LocalDispatcher"]["ignoreScriptLoadErrors"].setInput( __children["Batch_Dispatcher"]["Expression1"]["__out"]["p0"] )
__children["Batch_Dispatcher"]["LocalDispatcher"]["__uiPosition"].setValue( imath.V2f( -37.1999931, 5.89999866 ) )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["submit"], 'nodule:type', '' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["submit"], 'plugValueWidget:type', 'GafferUI.ButtonPlugValueWidget' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["submit"], 'buttonPlugValueWidget:clicked', 'import GafferDispatch\n#import os,re,ast\nimport GafferUI\n\ndef generate_ranges(start, end, batch_size):\n    return [f"{i}-{min(i+batch_size-1, end)}" for i in range(start, end+1, batch_size)]\n    \nnode = plug.node()\nscriptWindow = button.ancestor( GafferUI.ScriptWindow )\t\nroot = scriptWindow.scriptNode()\nscriptName = root.context()["script:name"]\n\nframeStart = node[\'frameStart\'].getValue()\nframeEnd = node[\'frameEnd\'].getValue()\nbatchSize = node[\'batchSize\'].getValue()\n\n#### DISPATCHER\nranges = generate_ranges(int(frameStart),int(frameEnd),int(batchSize))\n\nfor range in ranges:\n\tdispatcher = GafferDispatch.LocalDispatcher()\n\tdispatcher["framesMode"].setValue( dispatcher.FramesMode.CustomRange )\n\t\n\tdispatcher["jobName"].setValue(scriptName+str(range))\n\n\tdispatcher["frameRange"].setValue(range)\n\t# Uncomment to tell dispatcher where to put temporary files used during dipatch.\n\t#dispatcher["jobsDirectory"].setValue( "/tmp" )\n\tdispatcher["executeInBackground"].setValue(True)\n\n\t#dispatcher.dispatch([ node["FrameMask"] ])\n\tdispatcher.dispatch([ node["LocalDispatcher"] ])\n\n\t' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["submit"], 'label', 'SUBMIT' )
__children["Batch_Dispatcher"]["batches"].setInput( __children["Batch_Dispatcher"]["Expression1"]["__out"]["p1"] )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["batches"], 'nodule:type', '' )
__children["Batch_Dispatcher"]["BoxIn"]["__in"].setInput( __children["Batch_Dispatcher"]["in"] )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["BoxIn"]["__in"], 'description', 'Output connections to downstream nodes which must\nnot be executed until after this node.' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["BoxIn"]["__in"], 'plugValueWidget:type', '' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["BoxIn"]["__in"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["BoxIn"]["out"], 'noduleLayout:section', 'bottom' )
__children["Batch_Dispatcher"]["BoxIn"]["__uiPosition"].setValue( imath.V2f( -37.8999939, 19.8000011 ) )
__children["Batch_Dispatcher"]["in"].setInput( __children["PythonCommand1"]["task"] )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["in"], 'description', 'Output connections to downstream nodes which must\nnot be executed until after this node.' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["in"], 'plugValueWidget:type', '' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["in"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Batch_Dispatcher"]["in"], 'noduleLayout:section', 'top' )
__children["Batch_Dispatcher"]["Expression1"]["__in"]["p0"].setInput( __children["Batch_Dispatcher"]["batchSize"] )
__children["Batch_Dispatcher"]["Expression1"]["__in"]["p1"].setInput( __children["Batch_Dispatcher"]["frameEnd"] )
__children["Batch_Dispatcher"]["Expression1"]["__in"]["p2"].setInput( __children["Batch_Dispatcher"]["frameStart"] )
__children["Batch_Dispatcher"]["Expression1"]["__uiPosition"].setValue( imath.V2f( -28.8236771, 11.8008223 ) )
__children["PythonCommand1"]["dispatcher"]["deadline"]["pool"].setValue( 'none' )
__children["PythonCommand1"]["dispatcher"]["deadline"]["secondaryPool"].setValue( 'none' )
__children["PythonCommand1"]["dispatcher"]["deadline"]["group"].setValue( 'none' )
__children["PythonCommand1"]["command"].setValue( '\nfor frame in frames:\n\tprint(frame)\n\n\n' )
__children["PythonCommand1"]["framesMode"].setValue( 2 )
__children["PythonCommand1"]["__uiPosition"].setValue( imath.V2f( 82.0809479, -56.6655922 ) )
__children["Batch_Dispatcher"]["Expression1"]["__engine"].setValue( 'python' )
__children["Batch_Dispatcher"]["Expression1"]["__expression"].setValue( 'parent["__out"]["p0"] = False\n\ndef generate_ranges(start, end, batch_size):\n    return [f"{i}-{min(i+batch_size-1, end)}" for i in range(start, end+1, batch_size)]\n    \nframeStart = parent["__in"]["p2"]\nframeEnd = parent["__in"]["p1"]\nbatchSize = parent["__in"]["p0"]\n\nranges = generate_ranges(int(frameStart),int(frameEnd),int(batchSize))\n\nparent["__out"]["p1"] = IECore.StringVectorData( ranges )' )


del __children
Reply all
Reply to author
Forward
0 new messages