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 <bjork.si...@gmail.com> 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 <nathan_ru...@hotmail.com>
>
>>   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 <bjork.si...@gmail.com>
>> *Sent:* Sunday, November 04, 2012 1:35 PM
>> *To:* Nuke Python discussion <nuke-python@support.thefoundry.co.uk>
>> *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 <nathan_ru...@hotmail.com>
>>
>>>   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 <bjork.si...@gmail.com>
>>> *Sent:* Sunday, November 04, 2012 11:04 AM
>>> *To:* Nuke Python discussion <nuke-python@support.thefoundry.co.uk>
>>> *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
>>> 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
>>
>>
>> _______________________________________________
>> 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

Reply via email to