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