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