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

Reply via email to