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