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 );
		}
	}
}
示例#2
0
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;
}