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

Autodesk® Maya® 2009 © 1997-2008 Autodesk, Inc. All rights reserved. Generated with doxygen 1.5.6