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
