nodeInfoCmd/nodeInfoCmd.cpp
 
 
 
nodeInfoCmd/nodeInfoCmd.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.
// ==========================================================================
//+

//
// node_info.cc
//
// This plugin prints out type and connected plug information for
// the selected dependency nodes.
//

#include <maya/MIOStream.h>
#include <maya/MFnPlugin.h>
#include <maya/MString.h>
#include <maya/MStringResource.h>
#include <maya/MStringResourceId.h>
#include <maya/MArgList.h>

#include <maya/MPxCommand.h>
#include <maya/MSyntax.h>
#include <maya/MArgDatabase.h>

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

#include <maya/MFnDependencyNode.h>
#include <maya/MPlugArray.h>
#include <maya/MPlug.h>

#define kQuietFlag              "-q"
#define kQuietFlagLong  "-quiet"

// String resource constants and registration

#define rPluginId  "nodeInfoCmd"
#define rConnFound MStringResourceId(rPluginId, "rConnFound", \
                                                                        "Number of connections found: ^1s")
#define rPlugInfo  MStringResourceId(rPluginId, "rPlugInfo", \
                                                                        "  Plug Info: ")
#define rPlugDestOf MStringResourceId(rPluginId, "rPlugDestOf",\
                                                                        "    This plug is a dest of: ")

static MStatus registerMStringResources(void)
{
        MStringResource::registerString(rConnFound);
        MStringResource::registerString(rPlugInfo);
        MStringResource::registerString(rPlugDestOf);
        return MS::kSuccess;
}

//
// Command class declaration
//
class nodeInfo : public MPxCommand
{
public:
                                        nodeInfo();
        virtual                 ~nodeInfo(); 

        MStatus                 doIt( const MArgList& args );

        static MSyntax  newSyntax();
        static void*    creator();

private:
        void                    printType( const MObject& node, const MString& prefix );
        MStatus                 parseArgs( const MArgList& args );
        bool                    quiet;
};



//
// Command class implementation
//

nodeInfo::nodeInfo()
        : quiet (false)
{}

nodeInfo::~nodeInfo() {}

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

MSyntax nodeInfo::newSyntax()
{
         MSyntax syntax;
         syntax.addFlag(kQuietFlag, kQuietFlagLong);
         return syntax;
}

MStatus nodeInfo::parseArgs( const MArgList& args )
{
        MStatus                 stat;
        MArgDatabase    argData(syntax(), args);

        if (argData.isFlagSet(kQuietFlag))
                quiet = true;

        return stat;
}



MStatus nodeInfo::doIt( const MArgList& args )
//
// Description
//     This method performs the action of the command.
//
//     This method iterates over all selected items and
//     prints out connected plug and dependency node type
//     information.
//
{
        MStatus stat;                   // Status code
        MObject dependNode;             // Selected dependency node

        stat = parseArgs ( args );
        if ( !stat )
                return stat;

        // 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
                //
                stat = iter.getDependNode( dependNode );
                if ( !stat ) {
                        stat.perror("getDependNode");
                        continue;
                }

                // Create a function set for the dependency node
                //
                MFnDependencyNode fnDependNode( dependNode );

                // Check the type of the dependency node
                //
                MString nodeName = fnDependNode.name();
                nodeName += ": ";
                printType( dependNode, nodeName );

                // Get all connected plugs to this node
                //
                MPlugArray connectedPlugs;
                stat = fnDependNode.getConnections( connectedPlugs );

                int numberOfPlugs = connectedPlugs.length();
                if ( !quiet )
                {
                        MString msgFmt = MStringResource::getString(rConnFound, stat);
                        MString msg;
                        MString arg;
                        arg.set(numberOfPlugs);
                        msg.format(msgFmt, arg);
                        cerr << msg << endl;
                }

                // Print out the dependency node name and attributes
                // for each plug
                //
                MString pInfoMsg = MStringResource::getString(rPlugInfo, stat);
                for ( int i=0; i<numberOfPlugs; i++ ) 
                {
                        MPlug plug = connectedPlugs[i];
                        MString pinfo = plug.info();
                        if ( !quiet )
                        {
                                cerr << pInfoMsg << pinfo << endl;
                        }

                        // Now get the plugs that this plug is the
                        // destination of and print the node type.
                        //
                        MPlugArray array;
                        plug.connectedTo( array, true, false );

                        MString dInfoMsg = MStringResource::getString(rPlugDestOf, stat);
                        for ( unsigned int j=0; j<array.length(); j++ )
                        {
                                MObject mnode = array[j].node();
                                printType( mnode, dInfoMsg );
                        }
                }
        }
        return MS::kSuccess;
}

void nodeInfo::printType( const MObject& node, const MString& prefix )
//
// Description
//     This method prints the type of the given node.
//     prefix is a string that gets printed before the type name.
//
{
        if ( !quiet)
                cerr << prefix << node.apiTypeStr() << endl;

}



//
// 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.registerUIStrings(registerMStringResources, "nodeInfoCmdInitStrings");
        if (!status) {
                status.perror("registerUIStrings");
                return status;
        }
        status = plugin.registerCommand( "nodeInfo",
                                                                          nodeInfo::creator,
                                                                          nodeInfo::newSyntax);
        if (!status) {
                status.perror("registerCommand");
                return status;
        }

        return status;
}

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

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

        return status;
}