- Main Page
- Related Pages
- Modules
- Classes
- Examples

# 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;
    }