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 <[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
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 <[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
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
[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
_______________________________________________
Nuke-python mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python