Maya API How-To #29 | ||
| ||
How do I determine the type of a MPlug in order to use the appropriate getValue() overload?The MPlug itself doesn't have a type, but its attribute does. Use the MPlug::attribute() method to get the MObject for the attribute. You can then use MObject::hasFn() to determine its type (e.g. kNumericAttribute, kTypedAttribute, kUnitAttribute, kMessageAttribute, etc.). If it's a numeric attribute then you can use MFnNumericAttribute::unitType() to query its numeric type. MObject attribute = plug.attribute(); if ( attribute.hasFn( MFn::kNumericAttribute ) ) { MFnNumericAttribute fnAttrib(attribute); switch(fnAttrib.unitType()) { case MFnNumericData::kBoolean: { bool value; plug.getValue(value); break; } case MFnNumericData::kShort: { short value; plug.getValue(value); break; } case MFnNumericData::kLong: { int value; plug.getValue(value); break; } case MFnNumericData::kFloat: { float value; plug.getValue(value); break; } case MFnNumericData::kDouble: { double value; plug.getValue(value); break; } case MFnNumericData::k3Float: { MVector float3; plug.child(0).getValue(float3.x); plug.child(1).getValue(float3.y); plug.child(2).getValue(float3.z); } } } Similarly, there's MFnUnitAttribute::unitType() for unit attributes and MFnTypedAttribute::attrType() for typed attributes. Remember to consider for the case where the MPlug derives its value from an incoming connection. If a plug is connected, it may be animated (and thus its value may change from frame to frame), or - in the case of a (kFloat) or (k3Float) attribute - it may be connected to a texture. A texture connection has no valid value outside of Maya's rendering context, so any queries via getValue() are going to be non-representative of the plug's actual behavior. 19 Feb 2005 | ||
Copyright ©2005 by Bryan Ewert, maya@ewertb.com Maya is a Registered Trademark of Alias |