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
