deane, thank you once again for shining a light on the world of API -chad
On Feb 5, 2009, at 1:49 AM, Dean Edmonds wrote: > > On Thu, Feb 5, 2009 at 00:39, Chadrik <[email protected]> wrote: >> >> i'm having problems getting reliable component MObjects. i can >> get a >> good MObject if i use an MSelectionList and put in the string for a >> component like a face. in the example below, i'm going to get two >> MObjects representing the same face to make sure that they >> evaluate as >> the same: >> >> import maya.cmds as cmds >> import maya.OpenMaya as api >> s,h = cmds.polySphere() >> sel1 = api.MSelectionList() >> dag1 = api.MDagPath() >> obj1 = api.MObject() >> sel1.add( s + '.f[0]' ) >> sel1.getDagPath( 0, dag1, obj1) >> >> sel2 = api.MSelectionList() >> dag2 = api.MDagPath() >> obj2 = api.MObject() >> sel2.add( s + '.f[0]' ) >> sel1.getDagPath( 0, dag2, obj2) >> >> dag1 == dag2 >> # True >> obj1 == obj2 >> # True > > That only returned True because your second call to getDagPath() is > still using 'sel1'. If you had used 'sel2' the comparison of the two > MObjects would have returned false. > >> mit1 = api.MItMeshPolygon( dag1, obj1 ) >> mit2 = api.MItMeshPolygon( dag1, obj1 ) >> mit1.currentItem() == mit2.currentItem() >> # False >> >> what's going on here? > > An MObject is a container. When you compare two MObject's you are not > comparing the MObject's themselves but what they contain. So if you > have two different MObjects but they both contain the same node, the > comparison will be true. > > A face component is also a container object, one which holds one or > more integer indices representing faces of a mesh. The mesh itself > does not need these component objects to keep track of its faces > because they are inherent in its geometry. The component objects are > created on the fly, whenever they are needed. This means that two > different requests for the same face of a mesh may return two > completely different component objects which contain indices to the > same face of the mesh. > > In your calls above you have two different MObjects, each of which > contains a *different* component object. Those two component objects > contain the same face indices, but they are different objects. When > you compare the two MObjects it looks to see if the objects they > contain are the same. Since they are different, you get a result of > False. This is because MObject does not know anything about the > contents of the objects it contains so it cannot pry any deeper to > discover that these are two component objects which happen to refer to > the same component. > > If you want to make inquiries involving the contents of a component > object, then you need to use one of the component function sets. Since > all you care about is whether they refer to the same components, > MFnComponent will suffice: > > api.MFnComponent(obj1).isEqual(obj2) > # True > > -- > -deane > > > --~--~---------~--~----~------------~-------~--~----~ Yours, Maya-Python Club Team. -~----------~----~----~----~------~----~------~--~---
