blindShortDataCmd.cpp

//-
// ==========================================================================
// Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk
// license agreement provided at the time of installation or download,
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================
//+

//
// Adds a dynamic attribute to selected dependency nodes.
// Dynamic attributes can be used as blind data.
//
// Usage: Load this plugin.
//        Select an object in Maya, and execute the MEL command
//        blindShortData.  To see the new attribute, bring up the
//        Attribute Editor window and look under "Extras" tab.
//

#include <maya/MIOStream.h>

#include <maya/MFnPlugin.h>
#include <maya/MString.h>
#include <maya/MArgList.h>

#include <maya/MPxCommand.h>

#include <maya/MGlobal.h>
#include <maya/MItSelectionList.h>
#include <maya/MSelectionList.h>

#include <maya/MFnDependencyNode.h>
#include <maya/MFnNumericAttribute.h>

class blindShortData : public MPxCommand
{
public:
                    blindShortData() {};
    virtual         ~blindShortData(); 

    MStatus         doIt( const MArgList& args );
    virtual MStatus redoIt();
    static void*    creator();
};

blindShortData::~blindShortData() {}

void* blindShortData::creator()
{
    return new blindShortData();
}

MStatus blindShortData::doIt( const MArgList& )
{
    MStatus stat = redoIt();
    return stat;
}

MStatus blindShortData::redoIt()
//     This method performs the action of the command.
//     
//     Iterate over all selected items and for each attach a new
//      dynamic attribute. 
{
    MStatus stat;           // Status code
    MObject dependNode;     // Selected dependency node

    // Create a selection list iterator
    //
    MSelectionList slist;
    MGlobal::getActiveSelectionList( slist );
    MItSelectionList iter( slist, MFn::kInvalid, &stat );

    // Iterate over all selected dependency nodes
    //
    for ( ; !iter.isDone(); iter.next() ) 
    {
        // Get the selected dependency node and create
        // a function set for it
        //
        if ( MS::kSuccess != iter.getDependNode( dependNode ) ) {
            cerr << "Error getting the dependency node" << endl;
            continue;
        }
        MFnDependencyNode fnDN( dependNode, &stat );
        if ( MS::kSuccess != stat ) {
            cerr << "Error creating MFnDependencyNode" << endl;
            continue;
        }

        // Create a new attribute to use as out blind data
        //
        MFnNumericAttribute fnAttr;
        const MString fullName( "blindData" );
        const MString briefName( "bd" );
        double attrDefault = 99;
        MObject newAttr = fnAttr.create(    fullName, briefName, 
                                            MFnNumericData::kShort, 
                                            attrDefault, &stat );
        if ( MS::kSuccess != stat ) {
            cerr << "Error creating new attribute" << endl;
            continue;
        }

        // Now add the new attribute to this dependency node
        //
        stat = fnDN.addAttribute(newAttr,MFnDependencyNode::kLocalDynamicAttr);
        if ( MS::kSuccess != stat ) {
            cerr << "Error adding dynamic attribute" << endl;
        }

    }

    return MS::kSuccess;
}


//
// The following routines are used to register/unregister
// the command we are creating within Maya
//
MStatus initializePlugin( MObject obj )
{
    MStatus   status;
    MFnPlugin plugin( obj, PLUGIN_COMPANY, "3.0", "Any");

    status = plugin.registerCommand( "blindShortData",
                                     blindShortData::creator );
    if (!status) {
        status.perror("registerCommand");
        return status;
    }

    return status;
}

MStatus uninitializePlugin( MObject obj)
{
    MStatus   status;
    MFnPlugin plugin( obj );

    status = plugin.deregisterCommand( "blindShortData" );
    if (!status) {
        status.perror("deregisterCommand");
        return status;
    }

    return status;
}