helixCmd.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 <math.h>

#include <maya/MIOStream.h>
#include <maya/MSimple.h>
#include <maya/MFnNurbsCurve.h>
#include <maya/MPointArray.h>
#include <maya/MDoubleArray.h>
#include <maya/MPoint.h>

DeclareSimpleCommand( helix, PLUGIN_COMPANY, "3.0");

MStatus helix::doIt( const MArgList& args )
{
    MStatus stat;

    const unsigned  deg     = 3;            // Curve Degree
    const unsigned  ncvs    = 20;           // Number of CVs
    const unsigned  spans   = ncvs - deg;   // Number of spans
    const unsigned  nknots  = spans+2*deg-1;// Number of knots
    double  radius          = 4.0;          // Helix radius
    double  pitch           = 0.5;          // Helix pitch
    unsigned    i;

    // Parse the arguments.
    for ( i = 0; i < args.length(); i++ )
        if ( MString( "-p" ) == args.asString( i, &stat )
                && MS::kSuccess == stat)
        {
            double tmp = args.asDouble( ++i, &stat );
            if ( MS::kSuccess == stat )
                pitch = tmp;
        }
        else if ( MString( "-r" ) == args.asString( i, &stat )
                && MS::kSuccess == stat)
        {
            double tmp = args.asDouble( ++i, &stat );
            if ( MS::kSuccess == stat )
                radius = tmp;
        }

    MPointArray  controlVertices;
    MDoubleArray knotSequences;

    // Set up cvs and knots for the helix
    //
    for (i = 0; i < ncvs; i++)
        controlVertices.append( MPoint( radius * cos( (double)i ),
            pitch * (double)i, radius * sin( (double)i ) ) );

    for (i = 0; i < nknots; i++)
        knotSequences.append( (double)i );

    // Now create the curve
    //
    MFnNurbsCurve curveFn;

    curveFn.create( controlVertices,
                    knotSequences, deg, 
                    MFnNurbsCurve::kOpen, 
                    false, false, 
                    MObject::kNullObj, 
                    &stat );

    if ( MS::kSuccess != stat )
        cout<<"Error creating curve."<<endl;

    return stat;
}