1 import nuke
2 import nukescripts
3
4
5
6
7
8
9 _gLastState = {}
10
20
22 """Store the knob's current value as the 'last state' for the next time the dialog is opened.
23 Values are stored in a dict referenced by knob name, so names must be unique!"""
24 global _gLastState
25 _gLastState[knob.name()] = knob.value()
26
27
28
29
30
31
32
33
36 nukescripts.PythonPanel.__init__( self, "Link to Tracker", "uk.co.thefoundry.LinkToTrackPanel" )
37
38
39 trackers = []
40 with nuke.toNode(groupContext):
41 for n in nuke.allNodes():
42 if n.linkableKnobs(nuke.KnobType.eXYKnob):
43 trackers.append( n.name() )
44 self._tracker = nuke.Enumeration_Knob( "trackers", "tracker node", trackers )
45 self._tracker.setTooltip( "The Tracker node to link to." )
46 self._tracker.setValue( _getLastState( self._tracker, trackers[0] ) )
47 self.addKnob( self._tracker )
48
49
50 self._link_to = nuke.Enumeration_Knob( "link_to", "link to", ["position", "translate", "translate as offset"] )
51 self._link_to.setValue( _getLastState( self._link_to, 'translate' ) )
52 self._link_to.setTooltip( "Choose whether to link to the translation computed in the Tracker's Transform tab or to a specific track point position. If multiple track points are chosen they will be averaged." )
53 self.addKnob( self._link_to )
54 self._link_to.setFlag( nuke.ENDLINE )
55
56
57
58
59
60
61 self._track_points = []
62 for t in xrange(1,5):
63 knobname = 'track'+str(t)
64 point = nuke.Boolean_Knob( knobname, knobname )
65
66
67 point.setValue( _getLastState( point, (t==1) ) )
68 point.setTooltip( "Use this track point when linking to 'position'." )
69 self._track_points.append( point )
70 self.addKnob( point )
71
72 self._updatePointsEnabled()
73
74
75
76 self._expression = nuke.EvalString_Knob( "expression" )
77 self._expression.setTooltip( "This is the expression that will be applied. You can edit it before closing the dialog but changing settings on this panel will rebuild it, losing your changes." )
78 self.addKnob( self._expression )
79 self._updateExpression()
80
81
83 """Update the expression to reflect the current settings."""
84 if self._link_to.value() == 'translate':
85 self._expression.setValue( self._tracker.value() + ".translate" )
86 elif self._link_to.value() == 'translate as offset':
87 self._expression.setValue( "curve + " + self._tracker.value() + ".translate" )
88 else:
89 pointCount = 0
90 expr = " + ".join([self._tracker.value() + "." + point.name() for point in self._track_points if point.value()])
91 pointCount = sum( (1 for point in self._track_points if point.value()) )
92 if pointCount > 1:
93 expr = "(" + expr + ")/" + str(pointCount)
94 self._expression.setValue( expr )
95
96
98 """Enable the track point bools when linking to position; disable otherwise."""
99 use_points = ( self._link_to.value() == 'position' )
100 for point in self._track_points:
101 point.setEnabled( use_points )
102
103
105 """Return the expression field value."""
106 return self._expression.value()
107
108
122
125
126
127
129 d = LinkToTrackPanel(groupContext)
130 if d.showModalDialog() == True:
131 return d.getExpression()
132