MObject lrutils::createJointFromLocation(MVectorArray location, MString prefix, unsigned int num, MObject parent) { MStatus status = MS::kFailure; MObject jointObj; //make joint object MDagModifier dagMod; jointObj = dagMod.createNode( "joint", MObject::kNullObj, &status ); MyCheckStatus(status, "MDagModifier.createNode() failed"); dagMod.doIt(); //set position lrutils::setLocation(jointObj, location, MFnTransform::MFnTransform(), true, false, false); //set name MString jointName = prefix + "_Skel" + boost::lexical_cast<string>(num).c_str() + "_JNT"; dagMod.renameNode(jointObj, jointName); dagMod.doIt(); MFnTransform jointFn(jointObj); //parent the joint to its parent, if not null if(parent != MObject::kNullObj) { MFnTransform parentFn(parent); MGlobal::executeCommand("parent " + jointFn.fullPathName() + " " + parentFn.fullPathName() + ";"); } return jointObj; }
void lrutils::createFKCtlFromLocation(MVectorArray location, MObject joint, MString prefix, unsigned int num, MString icon, MString color, MObject parent, MObject& fkCtlObj, MObject& fkCtlGroupObj, MString layerName, MObject metaDataNode) { MStatus status; MDGModifier dgMod; //used for holding results from executed commands MStringArray result; MFnDependencyNode depMetaDataNodeFn(metaDataNode); //used for creating metaParent attributes for objects MFnMessageAttribute mAttr; MFnTransform jointFn(joint); //create the control object and set its color status = MGlobal::executeCommand( "python(\"control = rig101().rig101WCGetByName('" + icon + "')\");" ); status = MGlobal::executeCommand( "python(\"Utils.setControllerColor(control, '" + color + "')\");" ); status = MGlobal::executeCommand( MString("python(\"control.fullPath()\");"), result ); //get the MObject for the controller status = lrutils::getObjFromName(result[0], fkCtlObj); MyCheckStatus(status, "lrutils::getObjFromName() failed"); MFnTransform fkCtlFn( fkCtlObj ); lrutils::setLocation(fkCtlObj, location, MFnTransform::MFnTransform(), false, false, true); //set controller name MString fkCtlName = prefix + "_FK_"+num+"_CTL"; dgMod.renameNode(fkCtlObj, fkCtlName); //add the metaParent attribute to the controller MObject controlAttr = mAttr.create("metaParent", "metaParent"); fkCtlFn.addAttribute(controlAttr); //connect the controller's metaParent to the MDSpine node status = dgMod.connect( depMetaDataNodeFn.findPlug("FKControllers"), fkCtlFn.findPlug("metaParent") ); dgMod.doIt(); //create the fk control null lrutils::makeHomeNull(fkCtlObj, MFnTransform(), fkCtlGroupObj); lrutils::setLocation(fkCtlGroupObj, location, MFnTransform::MFnTransform(), true, true, false); MFnTransform fkCtlGroupFn( fkCtlGroupObj ); if(!parent.isNull()) { MFnTransform parentFn(parent); MGlobal::executeCommand("parent " + fkCtlGroupFn.fullPathName() + " " + parentFn.fullPathName() + ";"); } //add the metaParent attribute to the controller group fkCtlGroupFn.addAttribute(mAttr.create("metaParent", "metaParent")); //connect the controller group's metaParent to the MDGlobal node status = dgMod.connect( depMetaDataNodeFn.findPlug("FKControllerGroups"), fkCtlGroupFn.findPlug("metaParent") ); MyCheckStatus(status, "connect failed"); dgMod.doIt(); MGlobal::executeCommand("parentConstraint -mo " + fkCtlFn.fullPathName() + " " + jointFn.fullPathName() + ";",result); MObject jointParentConstraintObj; status = lrutils::getObjFromName(result[0], jointParentConstraintObj); MyCheckStatus(status, "lrutils::getObjFromName() failed"); MFnTransform jointParentConstraintFn(jointParentConstraintObj); jointParentConstraintFn.addAttribute(mAttr.create("metaParent", "metaParent")); status = dgMod.connect( depMetaDataNodeFn.findPlug("FKJointParentConstraints"), jointParentConstraintFn.findPlug("metaParent")); dgMod.doIt(); //set the display layers for the controller and controller group MGlobal::executeCommand("editDisplayLayerMembers -noRecurse "+ layerName+" "+ fkCtlFn.fullPathName()+";"); MGlobal::executeCommand("editDisplayLayerMembers -noRecurse "+ layerName+" "+ fkCtlGroupFn.fullPathName()+";"); MGlobal::executeCommand("select -cl;"); }
// // If a DAG node is instanced (i.e. has multiple parents), this method // will put it under its remaining parents. It will already have been put // under its first parent when it was created. // void maTranslator::writeInstances(fstream& f) { unsigned int numInstancedNodes = fInstanceChildren.length(); unsigned int i; for (i = 0; i < numInstancedNodes; i++) { MFnDagNode nodeFn(fInstanceChildren[i]); unsigned int numParents = nodeFn.parentCount(); unsigned int p; for (p = 0; p < numParents; p++) { // // We don't want to issue a 'parent' command for the node's // existing parent. // if (nodeFn.parent(i) != fInstanceParents[i].node()) { MObject parent = nodeFn.parent(i); MFnDagNode parentFn(parent); if (!parentFn.isFromReferencedFile()) { // // Get the first path to the parent node. // MDagPath parentPath; MDagPath::getAPathTo(parentFn.object(), parentPath); writeParent(f, parentPath, fInstanceChildren[i], true); } } } } // // We don't need this any more, so free up the space. // fInstanceChildren.clear(); fInstanceParents.clear(); }
// // Deal with nodes whose parenting is between referenced and non-referenced // nodes. // void maTranslator::writeRefNodeParenting(fstream& f) { unsigned int numNodes = fParentingRequired.length(); unsigned int i; for (i = 0; i < numNodes; i++) { MFnDagNode nodeFn(fParentingRequired[i]); // // Find out if this node has any parents from referenced or // non-referenced files. // bool hasRefParents = false; bool hasNonRefParents = false; unsigned int numParents = nodeFn.parentCount(); unsigned int p; for (p = 0; p < numParents; p++) { MObject parent = nodeFn.parent(p); MFnDagNode parentFn(parent); if (parentFn.isFromReferencedFile()) hasRefParents = true; else hasNonRefParents = true; if (hasRefParents && hasNonRefParents) break; } // // If this node is from a referenced file and it has parents which // are also from a referenced file, then it already has its first // parent and all others are added instances. // // Similarly if the node is not from a referenced file and has // parents which are also not from referenced files. // bool alreadyHasFirstParent = (nodeFn.isFromReferencedFile() ? hasRefParents : hasNonRefParents); // // Now run through the parents again and output any parenting // which involves a non-referenced node, either as parent or child. // for (p = 0; p < numParents; p++) { MObject parent = nodeFn.parent(p); MFnDagNode parentFn(parent); if (parentFn.isFromReferencedFile() != nodeFn.isFromReferencedFile()) { // // Get the first path to the parent. // MDagPath parentPath; MDagPath::getAPathTo(parentFn.object(), parentPath); writeParent( f, parentPath, fParentingRequired[i], alreadyHasFirstParent ); // // If it didn't have its first parent before, it does now. // alreadyHasFirstParent = true; } } } }