There is some inconsistency in the behavior of the file knob's internal
knob_changed callback (the one that sets file_type, which then creates or
destroys the format-dependent knobs) depending on whether the node's control
panel is open.
To get around this in a knobChanged callback on your file knob, you can do
the following:
1) Parse the extension off the new value
2) Temporarily set the KNOB_CHANGED_RECURSIVE flag on the file_type knob
3) Set the file_type knob
4) Clear the aforementioned flag
5) Check if the format actually changed and make sure the extension is valid
and, if so, make your format-specific changes to the dynamic knobs.
There is one other very important thing to note about this process: If you
make changes to the format-dependent knobs in a GUI session, you must reset
them to their default values before changing file_type knob programmatically
again. If you fail to do this, Nuke will crash immediately, regardless of
whether KNOB_CHANGED_RECURSIVE is set (this is logged as bug #21137, so if
you ping support about it, it may get bumped up the priority list).
def sampleKnobChanged():
n = nuke.thisNode()
k = nuke.thisKnob()
if k is n['file']:
ft = n['file_type']
old = ft.value()
buf = k.value().rsplit('.', 1)
if len(buf) == 1: # No extension
return
# MAKE SURE TO RESET ANY FORMAT-DEPENDENT KNOBS
# YOU CHANGED LAST TIME TO THEIR DEFAULTS HERE
ft.setFlag(nuke.KNOB_CHANGED_RECURSIVE)
ft.setValue(buf[1])
ft.clearFlag(nuke.KNOB_CHANGED_RECURSIVE)
new = ft.value().strip()
if (not new) or new == old: # Same or invalid extension
return
# Should be in good shape to do your compression changes here
Hope this makes sense,
-Nathan
-----Original Message-----
From: Justin Israel
Sent: Monday, March 26, 2012 11:03 AM
To: Nuke Python discussion
Subject: Re: [Nuke-python] file_type specific knobs not immediately avail
inWrite node callback?
::bump::
Nothing on this anyone?
On Mar 22, 2012, at 6:38 PM, Justin Israel wrote:
This is a somewhat similar situation to something Bjorn Fredriksson asked
on Nov 16, regarding crashes in a gizmo that wraps a Write node.
I also have a Gizmo that wraps a Write node and exposes only very basic
custom knobs. One thing I am doing right now in a knobChanged callback is
to check the file_type and set certain relevant compression settings.
Specifically, for example, when tif is selected from the file_type
dropdown, I ensure that LZW is set in the compression knob.
This currently works fine when the callback is responding to the file_type
knob being directly changed, but when I change the file extension in the
file knob to .tif, the same callback code can't see the compression knob
existing yet.
Am I missing something about how I am referencing the node in the
callback, or some deferred action taking place to update the Write nodes
file_type specific compression knob?
When I test this manually from the script editor, I can change the
extension in the file knob and then check the value of the compression
knob and it does exist. I must be somehow checking before the Write node
has updated itself.
-- justin
_______________________________________________
Nuke-python mailing list
Nuke-python@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
_______________________________________________
Nuke-python mailing list
Nuke-python@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
_______________________________________________
Nuke-python mailing list
Nuke-python@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python