MStatus tm_polySplit::doIt( const MArgList& args) { #ifdef _DEBUG cout << endl << "####################################################" << endl; cout << "tm_polySplit::doIt - DEBUG version info:" << endl; #endif MStatus status; MGlobal::getActiveSelectionList( oldSelList ); MArgDatabase argData( syntax(), args); //parse flags // if(argData.isFlagSet( loop_Flag)) { cmd_flag_loop = true; argData.getFlagArgument( loop_Flag, 0, cmd_flag_loop_mode); argData.getFlagArgument( loop_Flag, 1, cmd_flag_loop_angle); // argData.getFlagArgument( loop_Flag, 2, cmd_flag_loop_maxcount); // - max count; } else if(argData.isFlagSet( sel_Flag)) { cmd_flag_loop = false; cmd_flag_sel = true; } MSelectionList selectionList; argData.getObjects( selectionList); MItSelectionList selListIter( selectionList ); selListIter.setFilter( MFn::kMesh ); // The tm_polySplit node only accepts a component list input, so we build // a component list using MFnComponentListData. // // MIntArrays could also be passed into the node to represent the edgesIds, // but are less storage efficient than component lists, since consecutive // components are bundled into a single entry in component lists. // MFnComponentListData compListFn; compListFn.create(); bool found = false; bool foundMultiple = false; MObject meshObj; for( ; !selListIter.isDone(); selListIter.next() ) { MDagPath dagPath; MObject component; selListIter.getDagPath( dagPath, component ); meshObj = dagPath.node(); // Check for selected Edges components // if( component.apiType() == MFn::kMeshEdgeComponent ) { if( !found ) { // The variable 'component' holds all selected components on the selected // object, thus only a single call to MFnComponentListData::add() is needed // to store the selected components for a given object. // compListFn.add( component ); // Copy the component list created by MFnComponentListData into our local // component list MObject member. // fComponentList = compListFn.object(); // Locally store the actual edgesIds of the selected Edges so that this command // can directly modify the mesh in the case when there is no history and // history is turned off. // MFnSingleIndexedComponent compFn( component ); compFn.getElements( fSelEdges ); // Ensure that this DAG path will point to the shape of our object. // Set the DAG path for the polyModifierCmd. // dagPath.extendToShape(); setMeshNode( dagPath ); found = true; } else { // Break once we have found a multiple object holding selected UVs, since // we are not interested in how many multiple objects there are, only // the fact that there are multiple objects. // foundMultiple = true; break; } } } #ifdef _DEBUG cout << endl << "########################## checking arguments:" << endl; cout << endl << "fSelEdges = ";for(unsigned i=0;i<fSelEdges.length();i++) cout << fSelEdges[i] << " ";cout << endl; #endif if( foundMultiple ) { displayWarning("Found more than one object with selected Edges - Only operating on first found object."); } if( !found ) { displayError( "tm_polySplit command failed: Unable to find selected edges" ); return MStatus::kFailure; } // Initialize the polyModifierCmd node type - mesh node already set // setModifierNodeType( tm_polySplitNode::id ); //################################################################## alwaysWithConstructionHistory = true; status = doModifyPoly(); if( !status){displayError( "tm_polySplit command failed!" );return status;} //################################################################## get polymodifier node name and select it getModifierNodeName(); newSelList.add( modifierNodeName); MGlobal::setActiveSelectionList( newSelList);//, MGlobal::kAddToList); //################################################################## setResult( modifierNodeName); return MStatus::kSuccess; /* cout<<endl<<"**********"<<endl;return MStatus::kSuccess; */ }
MStatus tm_polySlot::doIt( const MArgList& ) // // Description: // implements the MEL tm_polySlot command. // // Arguments: // args - the argument list that was passes to the command from MEL // // Return Value: // MS::kSuccess - command succeeded // MS::kFailure - command failed (returning this value will cause the // MEL script that is being run to terminate unless the // error is caught using a "catch" statement. // { #ifdef _DEBUG cout << endl << "####################################################" << endl; cout << "tm_polySlot::doIt - DEBUG version info:" << endl; #endif MStatus status; // Parse the selection list for objects with selected UV components. // To simplify things, we only take the first object that we find with // selected UVs and operate on that object alone. // // All other objects are ignored and return warning messages indicating // this limitation. // MGlobal::getActiveSelectionList( oldSelList ); MItSelectionList selListIter( oldSelList ); selListIter.setFilter( MFn::kMesh ); // The tm_polySlot node only accepts a component list input, so we build // a component list using MFnComponentListData. // // MIntArrays could also be passed into the node to represent the edgesIds, // but are less storage efficient than component lists, since consecutive // components are bundled into a single entry in component lists. // MFnComponentListData compListFn; compListFn.create(); bool found = false; bool foundMultiple = false; for( ; !selListIter.isDone(); selListIter.next() ) { MDagPath dagPath; MObject component; selListIter.getDagPath( dagPath, component ); // Check for selected UV components // if( component.apiType() == MFn::kMeshEdgeComponent ) { if( !found ) { // The variable 'component' holds all selected components on the selected // object, thus only a single call to MFnComponentListData::add() is needed // to store the selected components for a given object. // compListFn.add( component ); // Copy the component list created by MFnComponentListData into our local // component list MObject member. // fComponentList = compListFn.object(); // Locally store the actual edgesIds of the selected Edges so that this command // can directly modify the mesh in the case when there is no history and // history is turned off. // MFnSingleIndexedComponent compFn( component ); compFn.getElements( fSelEdges ); // Ensure that this DAG path will point to the shape of our object. // Set the DAG path for the polyModifierCmd. // dagPath.extendToShape(); setMeshNode( dagPath ); found = true; } else { // Break once we have found a multiple object holding selected UVs, since // we are not interested in how many multiple objects there are, only // the fact that there are multiple objects. // foundMultiple = true; break; } } } if( foundMultiple ) { displayWarning("Found more than one object with selected Edges - Only operating on first found object."); } if( !found ) { displayError( "tm_polySlot command failed: Unable to find selected edges" ); return MStatus::kFailure; } // Initialize the polyModifierCmd node type - mesh node already set // setModifierNodeType( tm_polySlotNode::id ); //################################################################## alwaysWithConstructionHistory = true; status = doModifyPoly(); if( !status){displayError( "tm_polySlot command failed!" );return status;} //################################################################## get polymodifier node name and select it getModifierNodeName(); newSelList.add( modifierNodeName); MGlobal::setActiveSelectionList( newSelList);//, MGlobal::kAddToList); //################################################################## successResult(); return MStatus::kSuccess; }
MStatus meshOp::doIt( const MArgList& argList ) // // Description: // implements the MEL meshOp command. // // Arguments: // argList - the argument list that was passes to the command from MEL // // Return Value: // MS::kSuccess - command succeeded // MS::kFailure - command failed (returning this value will cause the // MEL script that is being run to terminate unless the // error is caught using a "catch" statement. // { MStatus status; bool badArgument = false; // Only one parameter is expected to be passed to this command: the mesh // operation type. Get it, validate it or stop prematurely // if (argList.length() == 1) { int operationTypeArgument = argList.asInt(0); if (operationTypeArgument < 0 || operationTypeArgument > kMeshOperationCount - 1) { badArgument = true; } else { fOperation = (MeshOperation)operationTypeArgument; } } else badArgument = true; if (badArgument) { cerr << "Expecting one parameter: the operation type." << endl; cerr << "Valid types are: " << endl; cerr << " 0 - Subdivide edge(s)." << endl; cerr << " 1 - Subdivide face(s)." << endl; cerr << " 2 - Extrude edge(s)." << endl; cerr << " 3 - Extrude face(s)." << endl; cerr << " 4 - Collapse edge(s)." << endl; cerr << " 5 - Collapse face(s)." << endl; cerr << " 6 - Duplicate face(s)." << endl; cerr << " 7 - Extract face(s)." << endl; cerr << " 8 - Split face(s)." << endl; cerr << " 8 - Chamfer vertex(s)." << endl; displayError(" Expecting one parameter: the operation type."); return MS::kFailure; } // Each mesh operation only supports one type of components // MFn::Type componentType = meshOpFty::getExpectedComponentType(fOperation); // Parse the selection list for selected components of the right type. // To simplify things, we only take the first object that we find with // selected components and operate on that object alone. // // All other objects are ignored and return warning messages indicating // this limitation. // MSelectionList selList; MGlobal::getActiveSelectionList( selList ); MItSelectionList selListIter( selList ); selListIter.setFilter( MFn::kMesh ); // The meshOperation node only accepts a component list input, so we build // a component list using MFnComponentListData. // // MIntArrays could also be passed into the node to represent the ids, // but are less storage efficient than component lists, since consecutive // components are bundled into a single entry in component lists. // MFnComponentListData compListFn; compListFn.create(); bool found = false; bool foundMultiple = false; for( ; !selListIter.isDone(); selListIter.next() ) { MDagPath dagPath; MObject component; selListIter.getDagPath( dagPath, component ); // Check for selected components of the right type // if( component.apiType() == componentType ) { if( !found ) { // The variable 'component' holds all selected components // on the selected object, thus only a single call to // MFnComponentListData::add() is needed to store the selected // components for a given object. // compListFn.add( component ); // Copy the component list created by MFnComponentListData // into our local component list MObject member. // fComponentList = compListFn.object(); // Locally store the actual ids of the selected components so // that this command can directly modify the mesh in the case // when there is no history and history is turned off. // MFnSingleIndexedComponent compFn( component ); // Ensure that this DAG path will point to the shape // of our object. Set the DAG path for the polyModifierCmd. // dagPath.extendToShape(); setMeshNode( dagPath ); found = true; } else { // Break once we have found a multiple object holding // selected components, since we are not interested in how // many multiple objects there are, only the fact that there // are multiple objects. // foundMultiple = true; break; } } } if( foundMultiple ) { displayWarning("Found more than one object with selected components."); displayWarning("Only operating on first found object."); } // Initialize the polyModifierCmd node type - mesh node already set // setModifierNodeType( meshOpNode::id ); if( found ) { // Now, pass control over to the polyModifierCmd::doModifyPoly() method // to handle the operation. // status = doModifyPoly(); if( status == MS::kSuccess ) { setResult( "meshOp command succeeded!" ); } else { displayError( "meshOp command failed!" ); } } else { displayError( "meshOp command failed: Unable to find selected components" ); status = MS::kFailure; } return status; }