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

# arcLenNode.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 <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/MString.h>
    #include <maya/MTypeId.h>
    #include <maya/MPlug.h>
    #include <maya/MDataBlock.h>
    #include <maya/MDataHandle.h>

    class arcLen : public MPxNode
    {
    public:
                            arcLen();
        virtual             ~arcLen();

        virtual MStatus     compute( const MPlug& plug, MDataBlock& data );
        static  void*       creator();
        static  MStatus     initialize();

    public:
        static  MObject     inputCurve;  // The input curve.
        static  MObject     output;      // The output value.
        static  MTypeId     id;          // The IFF type id
    };

    MTypeId     arcLen::id( 0x80001  );
    MObject     arcLen::inputCurve;
    MObject     arcLen::output;

    arcLen::arcLen() {}
    arcLen::~arcLen() {}

    void* arcLen::creator()
    {
        return new arcLen();
    }

    MStatus arcLen::compute( const MPlug& plug, MDataBlock& data )
    {

        MStatus status;

        if( plug == output )
        {
            MDataHandle inputData = data.inputValue( inputCurve, &status );

            if( !status ) {
                status.perror("ERROR getting data");
            } else {
                MObject curve = inputData.asNurbsCurveTransformed();
                MFnNurbsCurve curveFn( curve, &status );
                if( !status ) {
                    status.perror("ERROR creating curve function set");
                } else {
                    double result = curveFn.length();
                    MDataHandle outputHandle = data.outputValue( arcLen::output );
                    outputHandle.set( result );
                    data.setClean(plug);
                }
            }
        } else {
            return MS::kUnknownParameter;
        }

        return MS::kSuccess;
    }

    MStatus arcLen::initialize()
    {
        MFnNumericAttribute numericAttr;
        MFnTypedAttribute   typedAttr;
        MStatus status;

        inputCurve = typedAttr.create( "inputCurve", "in",
                                        MFnData::kNurbsCurve,
                                        &status );

        if( !status ) {
            status.perror("ERROR creating arcLen curve attribute");
            return status;
        }

        output = numericAttr.create( "output", "out",
                                        MFnNumericData::kDouble, 0.0,
                                        &status );
        if( !status ) {
            status.perror("ERROR creating arcLen output attribute");
            return status;
        }
        numericAttr.setWritable(false);

        status = addAttribute( inputCurve );
        if( !status ) {
            status.perror("addAttribute(inputCurve)");
            return status;
        }

        status = addAttribute( output );
        if( !status ) {
            status.perror("addAttribute(output)");
            return status;
        }

        status = attributeAffects( inputCurve, output );
        if( !status ) {
            status.perror("attributeAffects(inputCurve, output)");
            return status;
        }

        return MS::kSuccess;
    }

    MStatus initializePlugin( MObject obj )
    {
        MStatus   status;
        MFnPlugin plugin( obj, PLUGIN_COMPANY, "3.0", "Any");

        status = plugin.registerNode( "arcLen", arcLen::id, arcLen::creator,
                                                   arcLen::initialize);
        if (!status) {
            status.perror("registerNode");
            return status;
        }

        return status;
    }

    MStatus uninitializePlugin( MObject obj)
    {
        MStatus   status;
        MFnPlugin plugin( obj );

        status = plugin.deregisterNode( arcLen::id );
        if (!status) {
            status.perror("deregisterNode");
            return status;
        }

        return status;
    }