void ParameterisedHolderManipContext::processNode( MObject &node ) { MStatus stat; MFnDependencyNode nodeFn( node, &stat ); if( !stat ) { return; } ParameterisedHolderInterface *pHolder = dynamic_cast<ParameterisedHolderInterface *>( nodeFn.userNode() ); if( !pHolder ) { return; } if( m_mode == Targeted ) { MStatus stat; MPlug targetPlug = nodeFn.findPlug( m_targetPlugPath, &stat ); if( stat ) { createAndConnectManip( pHolder->plugParameter( targetPlug ), nodeFn ); } } else { ParameterisedInterface *parameterisedInterface = pHolder->getParameterisedInterface(); if( parameterisedInterface ) { createManipulatorWalk( parameterisedInterface->parameters(), nodeFn ); } } }
void V3Manipulator::readParameterOptions( MFnDagNode &nodeFn ) { ParameterisedHolderInterface *pHolder = dynamic_cast<ParameterisedHolderInterface *>( nodeFn.userNode() ); if( !pHolder ) { return; } ParameterPtr parameter = pHolder->plugParameter( m_plug ); CompoundObjectPtr userData = parameter->userData(); if( CompoundObjectPtr uiData = userData->member<CompoundObject>( "UI" ) ) { // World space parameter values if( StringDataPtr wsData = uiData->member<StringData>( "manipSpace" ) ) { if( wsData->readable() == "world" ) { m_worldSpace = true; } else if( wsData->readable() == "object" ) { m_worldSpace = false; } else { MGlobal::displayWarning( "V3Manipulator: Ignoring invalid v3ManipSpace '" + MString( wsData->readable().c_str() ) + "' for parameter '" + MString( parameter->name().c_str() ) + "', using 'object'." ); } } } }
MPxManipContainer *ParameterisedHolderManipContext::createAndConnectManip( ParameterPtr parameter, MFnDependencyNode &nodeFn ) { if( !parameter ) { return 0; } // The 'name' of the manipulator to create is: ie<manipulatorTypeHint><parameterTypeName>Manipulator MString manipLabel( "" ); MString manipName( "ie" ); CompoundObjectPtr userData = parameter->userData(); if( CompoundObjectPtr manipData = userData->member<CompoundObject>( "UI" ) ) { // Allow the parameter to opt-out of having a manipulator if( BoolDataPtr enableData = manipData->member<BoolData>( "disableManip" ) ) { if( enableData->readable() == true ) { return 0; } } if( StringDataPtr labelData = manipData->member<StringData>( "manipLabel" ) ) { manipLabel += MString( labelData->readable().c_str() ); } if( StringDataPtr hintData = manipData->member<StringData>( "manipTypeHint" ) ) { manipName += MString( hintData->readable().c_str() ); } } manipName += parameter->typeName(); manipName += "Manipulator"; MObject manipObj; MPxManipContainer *manip = MPxManipContainer::newManipulator( manipName, manipObj ); if( !manip ) { return 0; } // If we are derived from our custom manipulator base, then we can set the // desired plug name into the manipulator, incase it wishes to use it. ParameterManipContainer *paramManip = dynamic_cast<ParameterManipContainer *>( manip ); if( paramManip ) { ParameterisedHolderInterface *pHolder = dynamic_cast<ParameterisedHolderInterface *>( nodeFn.userNode() ); MPlug targetPlug = pHolder->parameterPlug( parameter ); paramManip->setPlug( targetPlug ); if( manipLabel != "" ) { paramManip->setLabel( manipLabel ); } } addManipulator( manipObj ); MStatus stat = manip->connectToDependNode( nodeFn.object() ); if( !stat ) { MGlobal::displayError( "ParameterisedHolderManipContext::createAndConnectManip() Unable to connect manipulator." ); return 0; } return manip; }