Chad and Adam, Thanks for the detailed explanation. I am familiar with hex and masking, just didn't realize that was required here.
thanks, -Judah On Tue, Jan 19, 2010 at 9:11 PM, Chad Dombrova <[email protected]> wrote: > each of the enum values is a bit-mask that can be combined into a single > integer that represents a collection of settings. these three options were > active in the bit-mask that was returned in adam's example: > > > - kOtherPlugSet (0x4000) > - kIncomingDirection(0x800) > - kConnectionMade(0x01) > > here's a little more python code to show what's going on: > > we'll continue from adam's example, where the integer contained in > messageID is 18433. > > get the string representation of the hexidecimal bitmask > >>> hex(18433) > '0x4801' > > python, in it's all-knowingness, provides an easy shorthand for working > with hexidecimal values. enter in the hex representation, and it gives you > an int > >>> 0x4801 > 18433 > > use the "bitwise or" to combine values: > >>> 0x4000 | 0x0800 | 0x0001 > 18433 > > so, it follows that: > >>> (0x4000 | 0x0800 | 0x0001) == 0x4801 > True > > to determine if a given option is in play, use "bitwise and". in our case, > we'll test if kIncomingDirection is enabled: > >>> bool(0x4801 & 0x800) > True > > now test if kConnectionMade is set: > >>> bool(0x4801 & 0x01) > True > > finally, test for a bitmask that has not been set (kAttributeAdded = 0x40): > >>> bool(0x4801 & 0x40) > False > > bitmasks are often used in C/C++. more "descriptive" data types are usually > favored in python, but since the maya python API is derived from C++, you'll > have to leg up on the concepts. i'm no expert myself (i've basically just > told you all i know about bitmasks) so if i'm missing something, hopefully > someone else will jump in with a more thorough explanation. > > -chad > > > > > On Jan 19, 2010, at 3:01 PM, Adam Mechtley wrote: > > If you look at the C++ devkit examples (or for that matter the explanation > up in the Public Types section for > MNodeMessage<http://download.autodesk.com/us/maya/2010help/API/class_m_node_message.html>) > you can see the problem. Namely, the enum values correspond to hexadecimal > numbers. If you run hex() on the number, you will see what's going on: > > hex(18433) is 0x4801, which means: > > - kOtherPlugSet (0x4000) > - kIncomingDirection(0x800) > - kConnectionMade(0x01) > > I'm guessing the reason for this paradigm is so you are not sending a > separate message for each of these events—otherwise you would have two or > three messages sent for each attribute. As you can see in the C++ examples > (e.g. nodeMessageCmd.cpp), a simple if-statement does not suffice—you must > instead use the bitwise operator: > > if ( msg & MNodeMessage::kConnectionMade ) { > cout << "Connection made "; > } else if ( msg & MNodeMessage::kConnectionBroken ) { > cout << "Connection broken "; > } else { > return; > } > > Thus, the same goes for Python: > > if messageId & OM.MNodeMessage.kConnectionMade: > # Do cool stuff > > If a particular message code is not included, the if-statement will return > 0 (false). If it is included, it will return decimal representation of the > hex number for that enum, and thus pass the test. > > On Tue, Jan 19, 2010 at 2:59 PM, Judah Baron <[email protected]>wrote: > >> We're using some of the MMessage classes to register callbacks. For >> MNodeMessage callbacks, the first argument passed in by Maya is the >> messageID. If we check to see if the messageID == >> OpenMaya.MNodeMessage.kConnectionMade it's always false because the value of >> OpenMaya.MNodeMessage.kConnectionMade is 1. The actual messageID coming in >> to the callback is 18433. The other MMessage related IDs are also not what I >> expected. >> >> Prior to 2008 I didn't have this problem. But prior to 2008 there were >> other issues. As I recall, the MMessage family of classes were not fully >> implemented back then. They seem to be fully implemented now, in that they >> can actually be used, but associating the IDs is a little strange, >> especially when working with multiple versions of Maya. >> >> >> >> On Tue, Jan 19, 2010 at 10:42 AM, Adam Mechtley >> <[email protected]>wrote: >> >>> Could you elaborate a little or provide a specific example? In general, I >>> have not had problems using enumerated types—certainly not where the values >>> are incorrect. An enum in the C++ class simply corresponds to an integer >>> value as far as Python is concerned, so corresponding zero-based integers >>> can be used interchangeably where an enum is required. There are, as always, >>> some exceptions, including a couple of bugs I am aware of: >>> >>> - MTransformationMatrix.getRotation Error (when using a rotation >>> order enum) >>> - api enums passed as reference >>> - Python cannot accept pointer to integer as reference to enum type >>> (need to use short instead) >>> >>> >>> On Tue, Jan 19, 2010 at 12:21 PM, Judah Baron <[email protected]>wrote: >>> >>>> Has anyone experienced problems using Maya's enum values? >>>> >>>> We have had to use integer values directly because the enum values we >>>> get through the class is not correct. It appears to me that the enums >>>> coming >>>> through the python class are all zero based and 'localized' to the >>>> assocaited class, whereas maya's enums are generally a lot larger and seem >>>> to be coming from a larger 'global' list of unique values. >>>> >>>> thanks, >>>> -Judah >>>> >>>> >>>> >>>> -- >>>> http://groups.google.com/group/python_inside_maya >>>> >>> >>> >>> -- >>> http://groups.google.com/group/python_inside_maya >>> >> >> >> -- >> http://groups.google.com/group/python_inside_maya >> > > -- > http://groups.google.com/group/python_inside_maya > > > > -- > http://groups.google.com/group/python_inside_maya >
-- http://groups.google.com/group/python_inside_maya
