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

# referenceQueryCmd.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.
    // ==========================================================================
    //+

    #include <maya/MString.h>
    #include <maya/MStatus.h>
    #include <maya/MObject.h>
    #include <maya/MFileIO.h>
    #include <maya/MSelectionList.h>
    #include <maya/MGlobal.h>
    #include <maya/MPxCommand.h>
    #include <maya/MFnPlugin.h>

    #include <maya/MIOStream.h>

    class referenceQuery : public MPxCommand {
    public:
                            referenceQuery();
        virtual             ~referenceQuery();

        MStatus             doIt( const MArgList & );
        bool                isUndoable() const;

        static      void   *creator();
    };

    referenceQuery::referenceQuery()
    {
    }

    referenceQuery::~referenceQuery()
    {
    }

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

    bool referenceQuery::isUndoable() const {
        return false;
    };

    MStatus referenceQuery::doIt( const MArgList &  )
    {
        MStringArray referenceFiles;
        MFileIO::getReferences( referenceFiles );

        // Print some useful information about the files referenced
        // in the main scene.
        //
        // Output format is as follows:
        //
        // Referenced File: filename1
        //      Connections Made
        //          source -> destination
        //          ...
        //
        //      Connections Broken
        //          source ->destination
        //          ...
        //
        //      Attributes Changed Since File Referenced
        //          attribute1
        //          attribute2
        //          ...
        //
        for( unsigned i = 0; i < referenceFiles.length(); i++ ) {
            MStringArray    connectionsMade;
            MFileIO::getReferenceConnectionsMade( referenceFiles[i],
                                                  connectionsMade );

            cout << "Referenced File: " << referenceFiles[i].asChar() << ":\n";
            cout << "   Connections Made:\n";
            unsigned j;
            for( j = 0; j < connectionsMade.length(); j+=2 ) {
                cout << "   ";
                cout << connectionsMade[j].asChar() << " -> ";
                if( j + 1 < connectionsMade.length() ) {
                    cout << connectionsMade[j+1].asChar();
                }
                cout << "\n" ;
            }
            cout << "\n";

            MStringArray    connectionsBroken;
            MFileIO::getReferenceConnectionsBroken( referenceFiles[i],
                                                  connectionsBroken );
            cout << "   Connections Broken: \n";
            for( j = 0; j < connectionsBroken.length(); j+=2 ) {
                cout << "   ";
                cout << connectionsBroken[j].asChar() << " -> ";
                if( j + 1 < connectionsBroken.length() ) {
                    cout << connectionsBroken[j+1].asChar();
                }
                cout << "\n" ;
            }
            cout << "\n";

            MStringArray    referencedNodes;

            cout << "   Attrs Changed Since File Open:\n";
            MFileIO::getReferenceNodes( referenceFiles[i], referencedNodes );
            for( j = 0; j < referencedNodes.length(); j++ ) {
                // For each node, call a MEL command to get its
                // attributes.  Say we're only interested in scalars.
                //
                MString cmd( "listAttr -s -cfo " );
                cmd = cmd + referencedNodes[j];

                MSelectionList referencedPlugs;
                MStringArray   referencedAttributes;

                MGlobal::executeCommand( cmd, referencedAttributes );
                for( unsigned k = 0; k < referencedAttributes.length(); k++ ) {
                    MString plugName( referencedNodes[j] );
                    plugName = plugName + "." + referencedAttributes[k];
                    cout << "       " << plugName.asChar() << "\n";
                }
            }
            cout << "\n";
        }

        // End of output
        //
        cout << "=====================================\n";

        return MS::kSuccess;
    }

    MStatus initializePlugin( MObject obj )
    {
        MStatus   status;
        MFnPlugin plugin( obj, PLUGIN_COMPANY, "4.0", "Any");

        // NOTE: referenceQuery is already a Maya cmd
        status = plugin.registerCommand( "refQuery",
                                         referenceQuery::creator );
        if (!status) {
            status.perror("registerCommand");
            return status;
        }

        return status;
    }

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

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