Right, good call on the recursive knobChanged limitation Ivan. That slipped my 
mind for some reason.

I would agree that just calling whatever import function you define directly 
from your PyScript knob is the simplest and most elegant solution. Depending on 
whether you’re after a persistent GUI, you may want to throw in a call to hide 
your dialog as well.

-Nathan



From: Ivan Busquets 
Sent: Sunday, November 04, 2012 2:28 PM
To: Nuke Python discussion 
Subject: Re: [Nuke-python] Import fbx via PythonPanel

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 
    Sent: Sunday, November 04, 2012 1:35 PM
    To: Nuke Python discussion 
    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 
      Sent: Sunday, November 04, 2012 11:04 AM
      To: Nuke Python discussion 
      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
_______________________________________________
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