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

Reply via email to