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;"); }
MObject GlobalComponent::loadComponent(MDGModifier & dgMod) { MStatus status = MS::kFailure; this->m_metaDataNode = dgMod.createNode( "MDGlobalNode", &status ); MyCheckStatus(status, "createNode failed"); MString metaNodeName = "MGN_"; metaNodeName += this->m_rigName + "_"; metaNodeName += this->m_pCompGuide->getName(); dgMod.renameNode(this->m_metaDataNode, metaNodeName); MFnDependencyNode depMetaDataNodeFn(this->m_metaDataNode); status = dgMod.newPlugValueFloat( depMetaDataNodeFn.findPlug("version"), this->m_pCompGuide->getVersion() ); MyCheckStatus(status, "newPlugValueFloat() failed"); status = dgMod.newPlugValueString( depMetaDataNodeFn.findPlug("rigId"), this->m_pCompGuide->getRigId() ); MyCheckStatus(status, "newPlugValueInt() failed"); GlobalComponentGuidePtr globalGuide = boost::dynamic_pointer_cast<GlobalComponentGuide>(this->m_pCompGuide); MString ctlColor = globalGuide->getColor(); MString ctlIcon = globalGuide->getIcon(); status = MGlobal::executeCommand( "python(\"control = rig101().rig101WCGetByName('" + ctlIcon + "')\");" ); status = MGlobal::executeCommand( "python(\"Utils.setControllerColor(control, '" + ctlColor + "')\");" ); MCommandResult res; status = MGlobal::executeCommand( MString("python(\"control.fullPath()\");"), res ); int resType = res.resultType(); if( resType == MCommandResult::kString ) { MString sResult; res.getResult(sResult); MObject ctlObj; status = lrutils::getObjFromName(sResult, ctlObj); MyCheckStatus(status, "lrutils::getObjFromName() failed"); MVectorArray ctlLocation = this->m_pCompGuide->getLocation(0); MFnTransform transformFn( ctlObj ); lrutils::setLocation(ctlObj, ctlLocation, MFnTransform::MFnTransform(), false, false, true); MString ctlName = this->m_rigName + "_" + this->m_pCompGuide->getName() + "_CTL"; dgMod.renameNode(ctlObj, ctlName); dgMod.doIt(); //add the metaParent attribute to the controller MFnMessageAttribute mAttr; MObject transformAttr = mAttr.create("metaParent", "metaParent"); transformFn.addAttribute(transformAttr); //connect the controller's metaParent to the MDGlobal node status = dgMod.connect( depMetaDataNodeFn.findPlug("controller"), transformFn.findPlug("metaParent") ); MObject ctlGroupObj; lrutils::makeHomeNull(ctlObj, MFnTransform(), ctlGroupObj); lrutils::setLocation(ctlGroupObj, ctlLocation, MFnTransform::MFnTransform(), true, true, false); MFnTransform ctlGroupFn( ctlGroupObj ); //add the metaParent attribute to the controller group ctlGroupFn.addAttribute(mAttr.create("metaParent", "metaParent")); //connect the controller group's metaParent to the MDGlobal node status = dgMod.connect( depMetaDataNodeFn.findPlug("controllerGroup"), ctlGroupFn.findPlug("metaParent") ); MyCheckStatus(status, "connect failed"); MObject metaRootObj; status = lrutils::getMetaRootByName(metaRootObj, this->m_rigName); MyCheckStatus(status, "lrutils::getMetaRootByName() failed"); MObject rigCtlGroupObj; status = lrutils::getMetaNodeConnection(metaRootObj, rigCtlGroupObj, "ctlGroup"); MyCheckStatus(status, "lrutils::getMetaNodeConnection() failed"); MFnTransform rigCtlGroupFn( rigCtlGroupObj ); rigCtlGroupFn.addChild( ctlGroupObj ); //add controller to controller display layer MObject controlLayerObj; status = lrutils::getMetaNodeConnection(metaRootObj, controlLayerObj, "ctlLayer"); MyCheckStatus(status, "lrutils::getMetaNodeConnection() failed"); MFnDependencyNode controlLayerFn(controlLayerObj); MString controlLayerName = controlLayerFn.name(); MGlobal::executeCommand("editDisplayLayerMembers -noRecurse "+controlLayerName+" "+rigCtlGroupFn.name()+";"); //create parent constraints from the global controller to the rig group MObject rigRigGroupObj; status = lrutils::getMetaNodeConnection(metaRootObj, rigRigGroupObj, "rigGroup"); MFnTransform rigRigGroupFn( rigRigGroupObj ); MGlobal::executeCommand("parentConstraint -mo "+transformFn.name()+" "+rigRigGroupFn.name()+";", res); //connect the parent constraint object to the component's metadata node MStringArray sResults; res.getResult(sResults); status = lrutils::getObjFromName(sResults[0], this->m_rigParentConstraint); MyCheckStatus(status, "lrutils::getObjFromName() failed"); MFnTransform rigParentConstraintFn( this->m_rigParentConstraint); rigParentConstraintFn.addAttribute(mAttr.create("metaParent", "metaParent")); status = dgMod.connect( depMetaDataNodeFn.findPlug("rigParentConstraint"), rigParentConstraintFn.findPlug("metaParent")); //create the scale constraint from the global controller to the rig group MGlobal::executeCommand("scaleConstraint -mo "+transformFn.name()+" "+rigRigGroupFn.name()+";", res); //connect the scale constraint object to the component's metadata node res.getResult(sResults); status = lrutils::getObjFromName(sResults[0], this->m_rigScaleConstraint); MyCheckStatus(status, "lrutils::getObjFromName() failed"); MFnTransform rigScaleConstraintFn( this->m_rigScaleConstraint ); rigScaleConstraintFn.addAttribute(mAttr.create("metaParent", "metaParent")); status = dgMod.connect( depMetaDataNodeFn.findPlug("rigScaleConstraint"), rigScaleConstraintFn.findPlug("metaParent")); //create scale constraint from the global controller to the noTransform group MObject rigNoTransformGroupObj; status = lrutils::getMetaNodeConnection(metaRootObj, rigNoTransformGroupObj, "noTransformGroup"); MFnTransform rigNoTransformGroupFn( rigNoTransformGroupObj ); MGlobal::executeCommand("scaleConstraint -mo "+transformFn.name()+" "+rigNoTransformGroupFn.name()+";", res); //connect the scale constraint object to the component's metadata node res.getResult(sResults); status = lrutils::getObjFromName(sResults[0], this->m_noTransformScaleConstraint); MyCheckStatus(status, "lrutils::getObjFromName() failed"); MFnTransform noTransformScaleConstraintFn( this->m_noTransformScaleConstraint); noTransformScaleConstraintFn.addAttribute(mAttr.create("metaParent", "metaParent")); status = dgMod.connect( depMetaDataNodeFn.findPlug("noTransformScaleConstraint"), noTransformScaleConstraintFn.findPlug("metaParent")); } return this->m_metaDataNode; }