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

Reply via email to