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

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