I should add that all the work Jason and I did was based on work I did with Ian, so definitely shoot him some code and see what you can't work out there...
On Fri, Oct 19, 2012 at 3:58 AM, Morgan <[email protected]> wrote: > Hey guys thanks. Jason your site has been my primary source of information > on this, thanks for that. > > Unless I am just misunderstanding something, I see the problem being that > because _postCreateVirtual and all these methods are classmethods, you > don't really have access to the actual python object that's being created > (There's no self argument). So whereas normally I would store temporary > data in a member variable, I can't actually set the value of member > variables within the _postCreateVirtual method. I also can't call any other > methods that aren't classmethods. > > And again, maybe I'm not using this the way it was meant to be used, but > here's an example: > > I've got a Transform subclass, which is inherited from nt.Transform. Based > on what that transform is being used for (a control, group, identity node, > etc) it has attributes set, and then methods which query that information > to do things. For example setting it to draw a certain color, or set it to > a specific rotation order. This is all stuff that could be done in > _postCreateVirtual I suppose, but the benefit of having them as separate > methods is having access to them after the node is created, and also being > able to have access to them in any inherited classes. Any other custom > classes that are transforms, like joints or ik handles, should inherit from > the custom transform subclass in addition to their respective pymel > nodetype so they can leverage those same methods, and it would be nice to > have access to those methods during node creation. > > But I think I've come to the conclusion that I need to look at virtual > classes a bit differently to how I've currently structured my code. I can > always keep the node creation simple, and call the virtualClass's custom > methods in whatever parent function is creating the node. > > The other thing I've been doing is using classes to represent more than > just a single node, but small hierarchies and networks of nodes, which I > think might kind of break the paradigm of virtual classes. For example I've > got a JointChain class, which inherits from a custom Joint class, but is an > iterator and represents a hierarchy of joints, and has methods for dealing > with the chain as a whole. > > Hopefully that wasn't too much gibberish, I supposed I'm just still trying > to understand how virtual classes are meant to be used and whether or not > it will be worth updating a lot of code to incorporate that. > > Thanks again! > > On Thursday, October 18, 2012 6:04:09 AM UTC+13, Count Zer0 wrote: >> >> Did you check the work Seth and I did?: >> >> http://www.jason-parks.com/**artoftech/?p=225<http://www.jason-parks.com/artoftech/?p=225> >> >> What "things" could you not do in your __init__ method. Doesn't >> _postCreateVirtual essentially replace the __init__ method? >> >> We've used this technique successfully on a couple of classes so far. >> Though we haven't put it through its paces too seriously. I'm about to >> extend the factory created nt.hikCharacterNode class to wrap all the >> non-documented MEL methods to the new HIK character node. After that, I >> should have an even more familiar knowledge of the subclassing process. >> >> -jason >> >> On Saturday, October 13, 2012 1:23:09 AM UTC-7, Morgan wrote: >>> >>> Hey all, I've been using sort of a hacky method for extending pymel, and >>> I've just now been trying to get my head around subclassing with virtual >>> classes to upgrade my code. >>> >>> The way I've been doing it up to now is not inheriting directly from >>> pymel node classes, but rather creating a custom class and storing the >>> pyNode object in a member variable, and then overriding the __getattr__ >>> method to have access to the pyNode methods as well as my own custom >>> methods. It looks something like this: >>> >>> >>> class MyTransform(object): >>> >>> def __init__(self): >>> >>> self.__pyNode = pm.createNode('transform') >>> >>> #any sort of custom stuff, adding attributes and assigning member >>> variables. >>> >>> def someCustomMethod(self): >>> >>> #do custom stuff >>> >>> def __getattr__(self, attr): >>> >>> if attr in self.__dict__: >>> >>> return self.__dict__[attr] >>> >>> else: >>> >>> return getattr(self.__pyNode, attr) >>> >>> >>> It's then easy to inherit from this, for example MyJoint could be >>> inherited from MyTransform and have access to someCustomMethod, as well as >>> the methods that are unique to the pymel Joint class. Of course the >>> downside is that it's not a real subclass, just kind of a wrapper, and it >>> has some limitations. >>> >>> Anyway, I got the virtual class stuff working from the examples, but as >>> I started converting my first couple classes I've run into some snags that >>> I wasn't sure about the best way to get around. The way >>> I'm approaching this conversion is I'm replacing __init__ with >>> _preCreateVirtual, createVirtual, and _postCreateVirtual, more or less. But >>> some of the things I was doing in my __init__ methods, such as setting >>> member variables and calling methods from this class and parent classes, >>> doesn't seem to be possible. And neither is adding an __init__ method, >>> because special methods aren't allowed in virtual classes. I'm kind of >>> pushing the limit of my current python knowledge with this stuff, so I'm >>> not really sure where to go next. My only thought was to create a wrapper >>> function for each class to actually call it and then assign or edit any >>> member variables or do anything else I can't figure out how to do during >>> creation. But is there some better way of dealing with this that I'm not >>> understanding? >>> >> -- > 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
