I was waiting for that answer :P

I'm looking to move our dept to 1.0.2.  In the meantime I can wrap things
up with the createNode method.

Thanks Paul, appreciate the help.

On Tue, Nov 1, 2011 at 12:34 PM, Paul Molodowitch <[email protected]>wrote:

> Hmm... well, possibly the custom creation is broken in that revision.
> We do still consider the virtual node stuff experimental... so use at your
> own risk. =P
>
> - Paul
>
>
> On Tue, Nov 1, 2011 at 11:10 AM, Justin Rosen <[email protected]>wrote:
>
>> renaming the create method throws a different error
>>
>>
>> import maya.cmds as cmds
>>
>> import pymel.core as pm
>>
>> from pymel.internal import factories
>>
>>
>>  class CrowdGroupNode(pm.nt.CROWD_GroupNode):
>>
>> @classmethod
>>
>> def _createVirtual(cls, **kwargs):
>>
>> print 'CREATING MY NODE!'
>>
>> return cmds.createNode('CROWD_GroupNode', **kwargs)
>>
>>
>>
>> @classmethod
>>
>> def _isVirtual( cls, obj, name ):
>>
>> return True
>>
>>
>>
>> def test(self):
>>
>> print 'MY NODE!'
>>
>>
>>  factories.registerVirtualClass(CrowdGroupNode, nameRequired=False)
>>
>> node = CrowdGroupNode()
>>
>>
>> # Error: AttributeError: type object 'CrowdGroupNode' has no attribute
>> 'createVirtual' #
>>
>>
>> Keeping the previous method name createVirtual results in the creation of
>> a locator and the following error
>>
>> # Error: ValueError: unexpect result locator returned by spaceLocator #
>>
>>
>>
>>
>>
>> On Tue, Nov 1, 2011 at 10:35 AM, Paul Molodowitch <[email protected]>wrote:
>>
>>> Ah... ok, in that case, I think you just need to rename your create
>>> method '_createVirtual'...
>>>
>>> - Paul
>>>
>>>
>>> On Tue, Nov 1, 2011 at 10:02 AM, Justin Rosen <[email protected]>wrote:
>>>
>>>> Hey Paul,
>>>>
>>>>
>>>> Hmm... first off, your virtual node class needs to inherit from a
>>>>> 'real', non-abstract, non-virtual class - in your example, it's inheriting
>>>>> from pm.nt.MyNode (which I'm surprised even works - essentially, it's
>>>>> inheriting from the node that is created from itself??)
>>>>>
>>>>
>>>> Sorry, I simplified the example a little bit, pm.nt.MyNode was just a
>>>> place holder for a plugin node.  In my case the declaration is actually:
>>>>    class CrowdGroupNode(pm.nt.CROWD_GroupNode)
>>>>
>>>>
>>>> Also, the create method needs to return the string name of the created
>>>>> node (unless you also add a postCreate callback, in which case it can
>>>>> return whatever the postCreate can handle), which should be noted in the
>>>>> latest documentation for virtualClasses.register (and in the
>>>>> customClasses.py).
>>>>>
>>>>
>>>> Ah okay, wasn't sure if this was the case, I updated my working example
>>>> to follow your code.
>>>>
>>>>
>>>>>
>>>>> Lastly, in the create method itself, you should not use pymel code -
>>>>> stick to maya.cmds stuff.  Also, you cannot simply do 
>>>>> createNode('MyNode'),
>>>>> as these are 'virtual' classes that only pymel knows about. You would have
>>>>> to do createNode('myRealBaseClass').
>>>>>
>>>>
>>>> Bad example, I'm not actually referencing the virtual class, but the
>>>> plugin node, in the following example pm.createNode('CROWD_GroupNode')
>>>> creates the correct node type in Maya
>>>>
>>>> Here's the entire example:
>>>>
>>>> import maya.cmds as cmds
>>>> import pymel.core as pm
>>>> import pymel.internal.factories as factories
>>>>
>>>> pm.loadPlugin('CROWD_GroupNode')
>>>>
>>>> class CrowdGroupNode(pm.nt.CROWD_GroupNode):
>>>>
>>>>    @classmethod
>>>>    def createVirtual(cls, **kwargs):
>>>>        print 'CREATING MY NODE!'
>>>>        return cmds.createNode('CROWD_GroupNode', **kwargs)
>>>>
>>>>
>>>>    @classmethod
>>>>    def _isVirtual( cls, obj, name ):
>>>>        return True
>>>>
>>>>    def test(self):
>>>>        print 'MY NODE!'
>>>>
>>>> # It doesn't look like factories.virtualClasses is available in pymel
>>>> 1.0.0
>>>> # And the current register command doesn't have a create kwarg
>>>> factories.registerVirtualClass(CrowdGroupNode, nameRequired=False)
>>>>
>>>> Thanks!
>>>> Justin
>>>>
>>>>
>>>> On Tue, Nov 1, 2011 at 9:42 AM, Paul Molodowitch <[email protected]>
>>>> wrote:
>>>> > Hmm... first off, your virtual node class needs to inherit from a
>>>> 'real',
>>>> > non-abstract, non-virtual class - in your example, it's inheriting
>>>> from
>>>> > pm.nt.MyNode (which I'm surprised even works - essentially, it's
>>>> inheriting
>>>> > from the node that is created from itself??)
>>>> > Also, the create method needs to return the string name of the
>>>> created node
>>>> > (unless you also add a postCreate callback, in which case it can
>>>> return
>>>> > whatever the postCreate can handle), which should be noted in the
>>>> latest
>>>> > documentation for virtualClasses.register (and in the
>>>> customClasses.py).
>>>> > Lastly, in the create method itself, you should not use pymel code -
>>>> stick
>>>> > to maya.cmds stuff.  Also, you cannot simply do createNode('MyNode'),
>>>> as
>>>> > these are 'virtual' classes that only pymel knows about. You would
>>>> have to
>>>> > do createNode('myRealBaseClass').
>>>> > Here's an example which should work:
>>>> >
>>>> > import maya.cmds as cmds
>>>> >
>>>> > import pymel.core as pm
>>>> >
>>>> > import pymel.internal.factories as factories
>>>> >
>>>> > class MyNode(pm.nt.Locator):
>>>> >
>>>> > @classmethod
>>>> >
>>>> > def createVirtual(cls, **kwargs):
>>>> >
>>>> > print 'CREATING MY NODE!'
>>>> >
>>>> > return cmds.createNode('locator', **kwargs)
>>>> >
>>>> > @classmethod
>>>> >
>>>> > def _isVirtual( cls, obj, name ):
>>>> >
>>>> > return True
>>>> >
>>>> > def test(self):
>>>> >
>>>> > print 'MY NODE!'
>>>> >
>>>> > factories.virtualClasses.register(MyNode, create='createVirtual')
>>>> >
>>>> > myNode = MyNode()
>>>> >
>>>> > - Paul
>>>> >
>>>> > On Tue, Nov 1, 2011 at 9:12 AM, Justin Rosen <[email protected]>
>>>> wrote:
>>>> >>
>>>> >> Thanks Seth!  Again, I'm using pymel that comes with 2011
>>>> >> pymel.__version__ == 1.0.0'
>>>> >>
>>>> >> I was able to get a small working example that works with
>>>> pm.createNode:
>>>> >>
>>>> >> class MyNode(pm.nt.MyNode):
>>>> >>    @classmethod
>>>> >>    def _isVirtual( cls, obj, name ):
>>>> >>        return True
>>>> >>
>>>> >>    def test(self):
>>>> >>        print 'MY NODE!'
>>>> >>
>>>> >> pymel.internal.factories.registerVirtualClass(MyNode)
>>>> >>
>>>> >> myNode = pm.createNode('MyNode')
>>>> >> myNode.test()
>>>> >>
>>>> >>
>>>> >> Although, I'd like to be able to create my nodes via a call to
>>>> >> MyNode().  To do this I added the classmethod createVirtual:
>>>> >>
>>>> >> class MyNode(pm.nt.MyNode):
>>>> >>    @classmethod
>>>> >>    def createVirtual(cls, **kwargs):
>>>> >>        print 'CREATING MY NODE!'
>>>> >>        return pm.createNode('MyNode', **kwargs)
>>>> >>
>>>> >>    @classmethod
>>>> >>    def _isVirtual( cls, obj, name ):
>>>> >>        return True
>>>> >>
>>>> >>    def test(self):
>>>> >>        print 'MY NODE!'
>>>> >>
>>>> >> myNode = MyNode()
>>>> >> # Error: ValueError: unexpect result locator1 returned by
>>>> spaceLocator #
>>>> >>
>>>> >> Am I missing something here?
>>>> >>
>>>> >> Thanks,
>>>> >> Justin
>>>> >>
>>>> >> On Tue, Nov 1, 2011 at 12:24 AM, Justin <[email protected]>
>>>> wrote:
>>>> >> > Thanks!  The first example seemed a bit overkill which is why I
>>>> asked
>>>> >> > the question, but the second example is exactly what I need
>>>> (Except I'm not
>>>> >> > on the trunk):
>>>> >> >
>>>> >> > # make sure Mayatomr plugin is loaded ore the Mib_amb_occlusion
>>>> might
>>>> >> > not exist
>>>> >> > loadPlugin('Mayatomr')
>>>> >> > class Mib_amb_occlusion(Mib_amb_occlusion):
>>>> >> >    """This is an example of how to replace a node.  Use this
>>>> technique
>>>> >> > with care"""
>>>> >> >    def occlude(self):
>>>> >> >        print "occluding!"
>>>> >> >
>>>> >> > # the callback always returns True, so we always replace the
>>>> default
>>>> >> > with our own.
>>>> >> > Mib_amb_occlusion.registerVirtualSubClass( lambda *args: True,
>>>> >> > nameRequired=False )
>>>> >> >
>>>> >> > def testMib():
>>>> >> >    n = createNode('mib_amb_occlusion')
>>>> >> >    n.occlude()
>>>> >> >
>>>> >> > But, I get the following error:
>>>> >> > # Error: AttributeError: file
>>>> >> >
>>>> /Applications/Autodesk/maya2011/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.6/site-packages/pymel/core/general.py
>>>> >> > line 53: type object 'Mib_amb_occlusion' has no attribute
>>>> '_isVirtual' #
>>>> >> >
>>>> >> > I'm running the version of pcl that comes with 2011.  I assume
>>>> there
>>>> >> > have been a bunch of changes since then that has made this process
>>>> easier,
>>>> >> > not requiring _isVirtual to be defined or in the trunks case a
>>>> callback to
>>>> >> > be specified?  Can I accomplish the same task of replacing the
>>>> mental ray
>>>> >> > node with the version of pcl that comes with Maya2011?
>>>> >> >
>>>> >> > Thanks,
>>>> >> > Justin
>>>> >> >
>>>> >> >
>>>> >> > On Oct 31, 2011, at 11:53 PM, Justin Israel wrote:
>>>> >> >
>>>> >> >> This seems to be a really straight forward example located here:
>>>> >> >> http://pymel.googlecode.com/svn/trunk/examples/customClasses.py
>>>> >> >>
>>>> >> >> It outlines how to subclass, and what class methods must be
>>>> provided. I
>>>> >> >> believe the use of the id attribute is for the validation test
>>>> function, in
>>>> >> >> order to determine if the incoming object type is the right kind.
>>>> In this
>>>> >> >> case they use the joint id attribute from the original Joint
>>>> class to check.
>>>> >> >> If its a joint then allow this subclass to be returned.
>>>> Technically you
>>>> >> >> could perform any test you see fit as long as you stick to the
>>>> api to do it
>>>> >> >> and not pymel calls.
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> On Oct 31, 2011, at 7:51 PM, Justin <[email protected]>
>>>> wrote:
>>>> >> >>
>>>> >> >>> Hey all, It's been a super long time since I've been on this
>>>> list!
>>>> >> >>>
>>>> >> >>> I was wondering if I could get a quick example on how to
>>>> accomplish a
>>>> >> >>> simple wrapping of a pymel node as described here:
>>>> >> >>> http://code.google.com/p/pymel/issues/detail?id=62
>>>> >> >>>
>>>> >> >>> allow users to add their own methods to any node. users can now
>>>> easily
>>>> >> >>> import pymel and then subclass nodes to do what they like, but
>>>> perhaps
>>>> >> >>> there's a way to register these user subclass modules to be
>>>> loaded by pymel,
>>>> >> >>> such that they are found within the pymel namespace.
>>>> >> >>>
>>>> >> >>>
>>>> >> >>>
>>>> >> >>> import pymel.core as pm
>>>> >> >>>
>>>> >> >>> # Load plugin
>>>> >> >>> pm.loadPlugin('pointless')
>>>> >> >>>
>>>> >> >>> # Print Node Type
>>>> >> >>> print pm.nt.PointlessViewer
>>>> >> >>>
>>>> >> >>> How would I subclass this and add my own methods?
>>>> >> >>>
>>>> >> >>> class PointlessViewerNode(pm.nt.PointlessViewer):
>>>> >> >>>   def myMethod(self):
>>>> >> >>>       # Do something with my node
>>>> >> >>>       pass
>>>> >> >>>
>>>> >> >>> Do I have to follow the example under
>>>> pymel.examples.customClasses.py?
>>>> >> >>>  Where an extra attribute is added, ie cls._PointlessClassID?
>>>>  I'm not sure
>>>> >> >>> I need this extra attribute, I just want to add additional
>>>> methods to the
>>>> >> >>> existing pymel node returned when creating nodes.
>>>> >> >>>
>>>> >> >>> viewer = pm.createNode('pointlessViewer')
>>>> >> >>> viewer.myMethod()
>>>> >> >>>
>>>> >> >>>
>>>> >> >>> Thanks,
>>>> >> >>> Justin
>>>> >> >>>
>>>> >> >>>
>>>> >> >>>
>>>> >> >>>
>>>> >> >>> --
>>>> >> >>> view archives: http://groups.google.com/group/python_inside_maya
>>>> >> >>> change your subscription settings:
>>>> >> >>> http://groups.google.com/group/python_inside_maya/subscribe
>>>> >> >>
>>>> >> >> --
>>>> >> >> view archives: http://groups.google.com/group/python_inside_maya
>>>> >> >> change your subscription settings:
>>>> >> >> http://groups.google.com/group/python_inside_maya/subscribe
>>>> >> >
>>>> >> >
>>>> >>
>>>> >> --
>>>> >> view archives: http://groups.google.com/group/python_inside_maya
>>>> >> change your subscription settings:
>>>> >> http://groups.google.com/group/python_inside_maya/subscribe
>>>> >
>>>> > --
>>>> > view archives: http://groups.google.com/group/python_inside_maya
>>>> > change your subscription settings:
>>>> > http://groups.google.com/group/python_inside_maya/subscribe
>>>> >
>>>>
>>>>  --
>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>> change your subscription settings:
>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>>
>>>
>>>  --
>>> view archives: http://groups.google.com/group/python_inside_maya
>>> change your subscription settings:
>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>
>>
>>  --
>> view archives: http://groups.google.com/group/python_inside_maya
>> change your subscription settings:
>> http://groups.google.com/group/python_inside_maya/subscribe
>>
>
>  --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>

-- 
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe

Reply via email to