The problem with the knobChanged approach is that you're preventing other
knobChanged callbacks to be executed.
The fbx_take_name and fbx_node_name both have knobChanged callbacks to set
the values for other knobs. But if you're already setting them WITHIN a
knobChanged callback, they will not be executed (knobChanged callbacks are
not called recursively)
Since you're already using a PyScript knob, I think the easiest would be to
just use your camera creation routine/function as the knob's value, rather
than in a knobChanged event:
As in:
class import_camera(nukescripts.PythonPanel):
def __init__(self):
nukescripts.PythonPanel.__init__(self, 'import camera')
self.import_camera = nuke.PyScript_Knob("import_camera", "import
camera")
self.addKnob(self.import_camera)
self.import_camera.setValue("test()")
import_camera().show()
def test():
filepath = "C:/Users/Simon/Desktop/A018_C001_05075H_baked.fbx"
cam_name = "Camera_A018_C001_05075H"
c = nuke.createNode('Camera2', 'file "%s" read_from_file True' %
filepath)
c.forceValidate()
c["fbx_take_name"].setValue("Take 001")
c["fbx_node_name"].setValue(cam_name)
Otherwise, if you must go with the knobChanged approach, you could use the
"hack" of temporarily enabling the KNOB_CHANGED_RECURSIVE flag on the
fbx_node_name knob, like so:
# Set the take knob
c["fbx_take_name"].setValue("Take 001")
# Set the KNOB_CHANGED_RECURSIVE flag
c["fbx_node_name"].setFlag(nuke.KNOB_CHANGED_RECURSIVE)
#Set the node name value. This should now trigger any knob-changed events
associated with this knob
c["fbx_node_name"].setValue(cam_name)
# Clear the KNOB_CHANGED_RECURSIVE flag
c["fbx_node_name"].clearFlag(nuke.KNOB_CHANGED_RECURSIVE)
Hope that helps.
Cheers,
Ivan
On Sun, Nov 4, 2012 at 2:04 PM, Simon Björk <[email protected]> wrote:
> Ah, yes, I re-read your last mail a couple of times and finally got it :).
> It actually does work to do it that way, but that leaves me with the
> default ok/cancel buttons and showModalDialog() instead of show(), correct?
> Still seems strange that it gives different results.
>
> Thanks Nathan!
>
> Cheers,
> Simon
>
> 2012/11/4 Nathan Rusch <[email protected]>
>
>> Sorry, I probably should have been a little more clear. What I meant
>> is basically using the GUI itself as a front-end for user input and
>> confirmation only, and then gathering its values after the fact. Very
>> simple example:
>>
>> class ImportCameraDialog(nukescripts.PythonPanel):
>> def __init__(self):
>> super(ImportCameraDialog, self).__init__('import camera')
>> self.fbxFile = ''
>> self.fbxFileKnob = nuke.File_Knob('fbx_path', 'fbx path')
>> self.addKnob(self.fbxFileKnob)
>>
>> def knobChanged(self, knob):
>> if knob is self.fbxFileKnob:
>> self.fbxFile = self.fbxFileKnob.value()
>>
>>
>> d = ImportCameraDialog()
>> if d.showModalDialog():
>> fbxPath = d.fbxFile.strip()
>> if fbxPath:
>> # Validate path, create your node here, etc.
>> pass
>>
>>
>> I don’t necessarily know if this will make a difference, but I think it’s
>> worth a try.
>>
>> -Nathan
>>
>>
>> *From:* Simon Björk <[email protected]>
>> *Sent:* Sunday, November 04, 2012 1:35 PM
>> *To:* Nuke Python discussion <[email protected]>
>> *Subject:* Re: [Nuke-python] Import fbx via PythonPanel
>>
>> Hi Nathan,
>>
>> thanks for your reply. I'm not really sure I understand how you mean, but
>> I tried this and got the same results (not working).
>>
>> class import_camera(nukescripts.PythonPanel):
>> def __init__(self):
>> nukescripts.PythonPanel.__init__(self, 'import camera')
>> self.import_camera = nuke.PyScript_Knob("import_camera", "import
>> camera")
>> self.addKnob(self.import_camera)
>>
>> def knobChanged(self, knob):
>> if knob is self.import_camera:
>> test()
>>
>> import_camera().show()
>>
>> def test():
>>
>> filepath = "C:/Users/Simon/Desktop/A018_C001_05075H_baked.fbx"
>> cam_name = "Camera_A018_C001_05075H"
>> c = nuke.createNode('Camera2', 'file "%s" read_from_file True' %
>> filepath)
>> c.forceValidate()
>> c["fbx_take_name"].setValue("Take 001")
>> c["fbx_node_name"].setValue(cam_name)
>>
>> Cheers,
>> Simon
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> 2012/11/4 Nathan Rusch <[email protected]>
>>
>>> Have you tried using your PythonPanel subclass the same way you’re
>>> using the simple Panel, as opposed to encapsulating your node creation code
>>> in the class itself?
>>>
>>> -Nathan
>>>
>>>
>>> *From:* Simon Björk <[email protected]>
>>> *Sent:* Sunday, November 04, 2012 11:04 AM
>>> *To:* Nuke Python discussion <[email protected]>
>>> *Subject:* [Nuke-python] Import fbx via PythonPanel
>>>
>>> I'm trying to import an fbx file using a PythonPanel, but for some
>>> reason it doesn't work. Using forceValidate() the camera loads, but it
>>> doesn't set animation, focal etc. Strange thing is it works perfectly if I
>>> use a simple panel istead (I don't even have to use forceValidate()).
>>> Anyone have any idea why this is? I've found old treads where people had
>>> problems loading an fbx from a terminal session.
>>>
>>> *Example code PythonPanel (does not work):*
>>>
>>> class import_camera(nukescripts.PythonPanel):
>>> def __init__(self):
>>> nukescripts.PythonPanel.__init__(self, 'import camera')
>>> self.import_camera = nuke.PyScript_Knob("import_camera", "import
>>> camera")
>>> self.addKnob(self.import_camera)
>>>
>>> def knobChanged(self, knob):
>>> if knob is self.import_camera:
>>>
>>> filepath =
>>> "C:/Users/Simon/Desktop/A018_C001_05075H_baked.fbx"
>>> cam_name = "Camera_A018_C001_05075H"
>>>
>>> c = nuke.createNode('Camera2', 'file "%s" read_from_file
>>> True' % filepath)
>>> c.forceValidate()
>>> c["fbx_take_name"].setValue("Take 001")
>>> c["fbx_node_name"].setValue(cam_name)
>>>
>>> import_camera().show()
>>>
>>> *Example code simple panel (works):*
>>>
>>> p = nuke.Panel("import camera")
>>> result = p.show()
>>> if result:
>>>
>>> filepath = "C:/Users/Simon/Desktop/A018_C001_05075H_baked.fbx"
>>> cam_name = "Camera_A018_C001_05075H"
>>>
>>> c = nuke.createNode('Camera2', 'file "%s" read_from_file True' %
>>> filepath)
>>> c["fbx_take_name"].setValue("Take 001")
>>> c["fbx_node_name"].setValue(cam_name)
>>>
>>> Cheers,
>>> Simon
>>> ------------------------------
>>> _______________________________________________
>>> Nuke-python mailing list
>>> [email protected], http://forums.thefoundry.co.uk/
>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
>>>
>>> _______________________________________________
>>> Nuke-python mailing list
>>> [email protected], http://forums.thefoundry.co.uk/
>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
>>>
>>>
>>
>> ------------------------------
>> _______________________________________________
>> Nuke-python mailing list
>> [email protected], http://forums.thefoundry.co.uk/
>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
>>
>>
>> _______________________________________________
>> Nuke-python mailing list
>> [email protected], http://forums.thefoundry.co.uk/
>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
>>
>>
>
> _______________________________________________
> Nuke-python mailing list
> [email protected], http://forums.thefoundry.co.uk/
> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
>
>
_______________________________________________
Nuke-python mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python