From d0bf764257ca11fd24c1029c96060f1d25cc9b08 Mon Sep 17 00:00:00 2001 From: Daniel Dresser Date: Fri, 28 Nov 2025 18:56:35 -0800 Subject: [PATCH] Prototype : Profile Focus Node Menu Option --- startup/gui/performanceMonitor.py | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/startup/gui/performanceMonitor.py b/startup/gui/performanceMonitor.py index 1074a676d9e..a709b280ed1 100644 --- a/startup/gui/performanceMonitor.py +++ b/startup/gui/performanceMonitor.py @@ -85,6 +85,41 @@ def __clearPerformanceMonitor( menu ) : del script.__performanceMonitor Gaffer.MonitorAlgo.removePerformanceAnnotations( script ) +def __evaluateFocusNode( script ) : + import GafferImage + import GafferImageTest + import GafferScene + import GafferSceneTest + + for i in script.focusSet(): + for p in Gaffer.Plug.RecursiveOutputRange( i ) : + if p.isInstanceOf( GafferImage.ImagePlug ): + GafferImageTest.processTiles( p ) + return + if p.isInstanceOf( GafferScene.ScenePlug ): + GafferSceneTest.traverseScene( p ) + return + + IECore.msg( IECore.Msg.Level.Error, "Performance Monitor", "No image or scene plug found to evaluate" ) + +def __profileFocusNodeEvaluation( menu ) : + + script = menu.ancestor( GafferUI.ScriptWindow ).scriptNode() + performanceMonitor = __performanceMonitor( menu ) + if performanceMonitor: + del script.__performanceMonitor + Gaffer.MonitorAlgo.removePerformanceAnnotations( script ) + + __clearCaches( menu ) + + __startPerformanceMonitor( menu ) + + __evaluateFocusNode( script ) + + __stopPerformanceMonitor( menu ) + imagePlug = None + scenePlug = None + def __currentContextMonitor( menu ) : # We store a monitor per script, so that we don't pollute @@ -166,6 +201,19 @@ def __profilingSubMenu( menu ) : "active" : performanceMonitor is not None and not performanceMonitor.__running } ) + result.append( + "/Performance Monitor/Divider2", + { + "divider" : True, + } + ) + result.append( + "/Performance Monitor/Profile Focus Node Evaluation", + { + "command" : __profileFocusNodeEvaluation, + "active" : not ( performanceMonitor and performanceMonitor.__running ) + } + ) # ContextMonitor