#include <string.h>
#include <maya/MIOStream.h>
#include <math.h>
#include <maya/MPxNode.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnPlugin.h>
#include <maya/MFnNurbsCurve.h>
#include <maya/MFnNurbsCurveData.h>
#include <maya/MString.h>
#include <maya/MTypeId.h>
#include <maya/MPlug.h>
#include <maya/MPointArray.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MArrayDataHandle.h>
#include <maya/MArrayDataBuilder.h>
{
public:
                        multiCurve() {};
    virtual             ~multiCurve();
    static  void*       creator();
public:
};
#define PERRORfail(stat,msg) \
                                if (!(stat)) { \
                                    stat.perror((msg)); \
                                    return (stat); \
                                }
multiCurve::~multiCurve () {}
void* multiCurve::creator()
{
    return new multiCurve();
}
{
    
    numCurves = nAttr.
create (
"numCurves", 
"nc",
    PERRORfail(stat, "initialize create numCurves attribute");
    stat = addAttribute( numCurves );
    PERRORfail(stat, "addAttribute(numCurves)");
    
    curveOffset = nAttr.
create (
"curveOffset", 
"co",
    PERRORfail(stat, "initialize create curveOffset attribute");
    stat = addAttribute( curveOffset );
    PERRORfail(stat, "addAttribute(curveOffset)");
    inputCurve = typedAttr.
create( 
"inputCurve", 
"ic",
    PERRORfail(stat, "initialize create inputCurve attribute");
    stat = addAttribute( inputCurve );
    PERRORfail(stat, "addAttribute(inputCurve)");
    
    outputCurves = typedAttr.
create( 
"outputCurves", 
"oc",
    PERRORfail(stat, "initialize create outputCurves attribute");
    stat = addAttribute( outputCurves );
    PERRORfail(stat, "addAttribute(outputCurves)");
    stat = attributeAffects( numCurves, outputCurves );
    PERRORfail(stat, "attributeAffects(inputCurve, outputCurves)");
    stat = attributeAffects( curveOffset, outputCurves );
    PERRORfail(stat, "attributeAffects(inputCurve, outputCurves)");
    stat = attributeAffects( inputCurve, outputCurves );
    PERRORfail(stat, "attributeAffects(inputCurve, outputCurves)");
    return stat;
}
{
    if ( plug == outputCurves )
    {
        PERRORfail(stat, "multiCurve::compute getting numCurves");
        int num = numCurvesHandle.
asLong();
 
        PERRORfail(stat, "multiCurve::compute getting curveOffset");
        double baseOffset = curveOffsetHandle.
asDouble();
 
        PERRORfail(stat, "multiCurve::compute getting inputCurve");
                                                             &stat);
        PERRORfail(stat, "multiCurve::compute getting output data handle");
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        PERRORfail(stat, "multiCurve::compute creating builder");
        
        for (int curveNum = 0; curveNum < num; curveNum++) {
            MObject outputCurve  = inCurveFS.copy(inputCurveObject,
 
                                                  outCurveData, &stat);
            PERRORfail(stat, "multiCurve::compute copying curve");
            double offset = baseOffset * (curveNum+1);
            for (int i = 0; i < numCVs; i++) {
                cvs[i].x += offset;
            }
            outCurveFS.setCVs ( cvs );
            outHandle.
set(outCurveData);
        }
        
        
        
        
        stat = outputArray.
set(builder);
        PERRORfail(stat, "multiCurve::compute setting the builder");
        
        
        
        
        PERRORfail(stat, "multiCurve::compute cleaning outputCurves");
    } else {
    }
    
    return stat;
}
{
    MFnPlugin plugin( obj, PLUGIN_COMPANY, 
"3.0", 
"Any");
 
    CHECK_MSTATUS (plugin.registerNode( 
"multiCurve", multiCurve::id,
 
                                multiCurve::creator, multiCurve::initialize ) );
}
{
    
}