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

//  File Name: narrowPolyViewerCmd.cpp
//
//  Description:
//      A command used for testing multiple camera drawing into a single view.
//      See narrowPolyViewerCmd.h for a description.
//


#include "narrowPolyViewerCmd.h"

#include <maya/MItDag.h>
#include <maya/MGlobal.h>
#include <maya/MSyntax.h>
#include <maya/MArgParser.h>
#include <maya/MArgList.h>
#include <maya/MSelectionList.h>
#include <maya/MFnCamera.h>

#include <maya/MIOStream.h>

narrowPolyViewerCmd::narrowPolyViewerCmd()
:   MPxModelEditorCommand()
//
//  Description:
//      Class constructor.
//
{
}

narrowPolyViewerCmd::~narrowPolyViewerCmd()
//
//  Description:
//      Class destructor.
//
{
}

void* narrowPolyViewerCmd::creator()
//
//  Description:
//      Create the command.
//
{
    return new narrowPolyViewerCmd();
}

MStatus narrowPolyViewerCmd::appendSyntax()
//
//  Description:
//      Add syntax to the command. All of the parent syntax is added
//      before this call is made.
//
{
    MStatus ReturnStatus;

    MSyntax theSyntax = syntax(&ReturnStatus);
    if (MS::kSuccess != ReturnStatus) {
        MGlobal::displayError("Could not get the parent's syntax");
        return ReturnStatus;
    }

    theSyntax.addFlag(kInitFlag,
                      kInitFlagLong);

    theSyntax.addFlag(kResultsFlag,
                      kResultsFlagLong);

    theSyntax.addFlag(kClearFlag,
                      kClearFlagLong);

    theSyntax.addFlag(kToleranceFlag,
                      kToleranceFlagLong,
                      MSyntax::kDouble);

    return ReturnStatus;
}

MStatus narrowPolyViewerCmd::doEditFlags()
//
//  Description:
//      Handle edits for flags added by this class.
//      If the flag is unknown, return MS::kSuccess and the parent class
//      will attempt to process the flag. Returning MS::kUnknownParameter
//      will cause the parent class to process the flag.
//
{
    MStatus ReturnStatus = MS::kSuccess;

    MPx3dModelView *user3dModelView = modelView();
    if (NULL == user3dModelView) {
        MGlobal::displayError("NULL == user3dModelView!");
        return MS::kFailure;
    }

    if (user3dModelView->viewType() != "narrowPolyViewer") {
        MGlobal::displayError("This view is not a narrowPolyViewer");
        return MS::kFailure;
    }

    //  This is now safe to do, since the above test passed.
    //
    narrowPolyViewer *mpView = (narrowPolyViewer *)user3dModelView;

    MArgParser argData = parser();
    if (argData.isFlagSet(kInitFlag)) {
        return initTests(*mpView);
    } else if (argData.isFlagSet(kResultsFlag)) {
        return testResults(*mpView);
    } else if (argData.isFlagSet(kClearFlag)) {
        return clearResults(*mpView);
    } else if (argData.isFlagSet(kToleranceFlag)) {
        double tol;
        argData.getFlagArgument(kToleranceFlag, 0, tol);
        mpView->tol = tol;
        mpView->refresh(true, true);
    } else {
        return MS::kUnknownParameter;
    }

    return ReturnStatus;
}

MStatus narrowPolyViewerCmd::doQueryFlags()
//
//  Description:
//      Don't do anything for the query.
//
{
    return ParentClass::doQueryFlags();
}

MStatus narrowPolyViewerCmd::clearResults(narrowPolyViewer &view)
//
//  Description:
//
{   
    view.removeAllCameras();
    fCameraList.clear();
    return MS::kSuccess;
}

MStatus narrowPolyViewerCmd::initTests(narrowPolyViewer &view)
//
//  Description:
//
{
    MGlobal::displayInfo("narrowPolyViewerCmd::initTests");

    clearResults(view);

    //  Add every camera into the scene. Don't change the main camera,
    //  it is OK that it gets reused.
    //
    MDagPath cameraPath;
    MStatus status = MS::kSuccess;
    MItDag dagIterator(MItDag::kDepthFirst, MFn::kCamera);
    for (; !dagIterator.isDone(); dagIterator.next()) {
        if (!dagIterator.getPath(cameraPath)) {
            continue;
        }

        MFnCamera camera(cameraPath, &status);
        if (MS::kSuccess != status) {
            continue;
        }

        MGlobal::displayInfo(camera.fullPathName());
        fCameraList.append(cameraPath);
    }

    if (MS::kSuccess !=
        view.setCameraList(fCameraList)) {
        MGlobal::displayError("Could not set the list of cameras");
        return MS::kFailure;
    } else {
        view.refresh();
    }

    return MS::kSuccess;
}

MStatus narrowPolyViewerCmd::testResults(narrowPolyViewer &view)
{
    cout << "fCameraList.length() = " << fCameraList.length() << endl;
    cout << "fCameraList = " << fCameraList << endl;

    cout << "view.fTestCameraList.length() = " << view.fTestCameraList.length() << endl;
    cout << "view.fTestCameraList = " << view.fTestCameraList << endl;

    return MS::kSuccess;
}