//- // ========================================================================== // Copyright (C) 1995 - 2006 Autodesk, Inc. and/or its licensors. All // rights reserved. // // The coded instructions, statements, computer programs, and/or related // material (collectively the "Data") in these files contain unpublished // information proprietary to Autodesk, Inc. ("Autodesk") and/or its // licensors, which is protected by U.S. and Canadian federal copyright // law and by international treaties. // // The Data is provided for use exclusively by You. You have the right // to use, modify, and incorporate this Data into other products for // purposes authorized by the Autodesk software license agreement, // without fee. // // The copyright notices in the Software and this entire statement, // including the above license grant, this restriction and the // following disclaimer, must be included in all copies of the // Software, in whole or in part, and all derivative works of // the Software, unless such copies or derivative works are solely // in the form of machine-executable object code generated by a // source language processor. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. // AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED // WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF // NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR // PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE, OR // TRADE PRACTICE. IN NO EVENT WILL AUTODESK AND/OR ITS LICENSORS // BE LIABLE FOR ANY LOST REVENUES, DATA, OR PROFITS, OR SPECIAL, // DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK // AND/OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY // OR PROBABILITY OF SUCH DAMAGES. // // ========================================================================== //+ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class scanDag: public MPxCommand { public: scanDag() {}; virtual ~scanDag(); static void* creator(); virtual MStatus doIt( const MArgList& ); private: MStatus parseArgs( const MArgList& args, MItDag::TraversalType& traversalType, MFn::Type& filter, bool & quiet); MStatus doScan( const MItDag::TraversalType traversalType, MFn::Type filter, bool quiet); void printTransformData(const MDagPath& dagPath, bool quiet); }; scanDag::~scanDag() {} void* scanDag::creator() { return new scanDag; } MStatus scanDag::doIt( const MArgList& args ) { MItDag::TraversalType traversalType = MItDag::kDepthFirst; MFn::Type filter = MFn::kInvalid; MStatus status; bool quiet = false; status = parseArgs ( args, traversalType, filter, quiet ); if (!status) return status; return doScan( traversalType, filter, quiet); }; MStatus scanDag::parseArgs( const MArgList& args, MItDag::TraversalType& traversalType, MFn::Type& filter, bool & quiet) { MStatus stat; MString arg; const MString breadthFlag ("-b"); const MString breadthFlagLong ("-breadthFirst"); const MString depthFlag ("-d"); const MString depthFlagLong ("-depthFirst"); const MString cameraFlag ("-c"); const MString cameraFlagLong ("-cameras"); const MString lightFlag ("-l"); const MString lightFlagLong ("-lights"); const MString nurbsSurfaceFlag ("-n"); const MString nurbsSurfaceFlagLong ("-nurbsSurfaces"); const MString quietFlag ("-q"); const MString quietFlagLong ("-quiet"); // Parse the arguments. for ( unsigned int i = 0; i < args.length(); i++ ) { arg = args.asString( i, &stat ); if (!stat) continue; if ( arg == breadthFlag || arg == breadthFlagLong ) traversalType = MItDag::kBreadthFirst; else if ( arg == depthFlag || arg == depthFlagLong ) traversalType = MItDag::kDepthFirst; else if ( arg == cameraFlag || arg == cameraFlagLong ) filter = MFn::kCamera; else if ( arg == lightFlag || arg == lightFlagLong ) filter = MFn::kLight; else if ( arg == nurbsSurfaceFlag || arg == nurbsSurfaceFlagLong ) filter = MFn::kNurbsSurface; else if ( arg == quietFlag || arg == quietFlagLong ) quiet = true; else { arg += ": unknown argument"; displayError(arg); return MS::kFailure; } } return stat; } MStatus scanDag::doScan( const MItDag::TraversalType traversalType, MFn::Type filter, bool quiet) { MStatus status; MItDag dagIterator( traversalType, filter, &status); if ( !status) { status.perror("MItDag constructor"); return status; } // Scan the entire DAG and output the name and depth of each node if (traversalType == MItDag::kBreadthFirst) if (!quiet) cout << endl << "Starting Breadth First scan of the Dag"; else if (!quiet) cout << endl << "Starting Depth First scan of the Dag"; switch (filter) { case MFn::kCamera: if (!quiet) cout << ": Filtering for Cameras\n"; break; case MFn::kLight: if (!quiet) cout << ": Filtering for Lights\n"; break; case MFn::kNurbsSurface: if (!quiet) cout << ": Filtering for Nurbs Surfaces\n"; break; default: cout << endl; } int objectCount = 0; for ( ; !dagIterator.isDone(); dagIterator.next() ) { MDagPath dagPath; status = dagIterator.getPath(dagPath); if ( !status ) { status.perror("MItDag::getPath"); continue; } MFnDagNode dagNode(dagPath, &status); if ( !status ) { status.perror("MFnDagNode constructor"); continue; } if (!quiet) cout << dagNode.name() << ": " << dagNode.typeName() << endl; if (!quiet) cout << " dagPath: " << dagPath.fullPathName() << endl; objectCount += 1; if (dagPath.hasFn(MFn::kCamera)) { MFnCamera camera (dagPath, &status); if ( !status ) { status.perror("MFnCamera constructor"); continue; } // Get the translation/rotation/scale data printTransformData(dagPath, quiet); // Extract some interesting Camera data if (!quiet) { cout << " eyePoint: " << camera.eyePoint(MSpace::kWorld) << endl; cout << " upDirection: " << camera.upDirection(MSpace::kWorld) << endl; cout << " viewDirection: " << camera.viewDirection(MSpace::kWorld) << endl; cout << " aspectRatio: " << camera.aspectRatio() << endl; cout << " horizontalFilmAperture: " << camera.horizontalFilmAperture() << endl; cout << " verticalFilmAperture: " << camera.verticalFilmAperture() << endl; } } else if (dagPath.hasFn(MFn::kLight)) { MFnLight light (dagPath, &status); if ( !status ) { status.perror("MFnLight constructor"); continue; } // Get the translation/rotation/scale data printTransformData(dagPath, quiet); // Extract some interesting Light data MColor color; color = light.color(); if (!quiet) { cout << " color: [" << color.r << ", " << color.g << ", " << color.b << "]\n"; } color = light.shadowColor(); if (!quiet) { cout << " shadowColor: [" << color.r << ", " << color.g << ", " << color.b << "]\n"; cout << " intensity: " << light.intensity() << endl; } } else if (dagPath.hasFn(MFn::kNurbsSurface)) { MFnNurbsSurface surface (dagPath, &status); if ( !status ) { status.perror("MFnNurbsSurface constructor"); continue; } // Get the translation/rotation/scale data printTransformData(dagPath, quiet); // Extract some interesting Surface data if (!quiet) { cout << " numCVs: " << surface.numCVsInU() << " * " << surface.numCVsInV() << endl; cout << " numKnots: " << surface.numKnotsInU() << " * " << surface.numKnotsInV() << endl; cout << " numSpans: " << surface.numSpansInU() << " * " << surface.numSpansInV() << endl; } } else { // Get the translation/rotation/scale data printTransformData(dagPath, quiet); } } if (!quiet) { cout.flush(); } setResult(objectCount); return MS::kSuccess; } void scanDag::printTransformData(const MDagPath& dagPath, bool quiet) { MStatus status; MObject transformNode = dagPath.transform(&status); // This node has no transform - i.e., it's the world node if (!status && status.statusCode () == MStatus::kInvalidParameter) return; MFnDagNode transform (transformNode, &status); if (!status) { status.perror("MFnDagNode constructor"); return; } MTransformationMatrix matrix (transform.transformationMatrix()); if (!quiet) { cout << " translation: " << matrix.translation(MSpace::kWorld) << endl; } double threeDoubles[3]; MTransformationMatrix::RotationOrder rOrder; matrix.getRotation (threeDoubles, rOrder, MSpace::kWorld); if (!quiet) { cout << " rotation: [" << threeDoubles[0] << ", " << threeDoubles[1] << ", " << threeDoubles[2] << "]\n"; } matrix.getScale (threeDoubles, MSpace::kWorld); if (!quiet) { cout << " scale: [" << threeDoubles[0] << ", " << threeDoubles[1] << ", " << threeDoubles[2] << "]\n"; } } MStatus initializePlugin( MObject obj ) { MStatus status; MFnPlugin plugin ( obj, PLUGIN_COMPANY, "3.0", "Any" ); status = plugin.registerCommand( "scanDag", scanDag::creator ); if ( !status ) status.perror("registerCommand"); return status; } MStatus uninitializePlugin( MObject obj ) { MStatus status; MFnPlugin plugin( obj ); status = plugin.deregisterCommand( "scanDag" ); if ( ! status ) status.perror("deregisterCommand"); return status; }