Maya 对象打组 保护数据

可以选多个,创建一个空节点。把所选对象都连到它的自定属性selObjects上。 这样就不怕父级打组后原本子物体路径失效了。
最后更新时间 2013-11-23 03:14:54

//==============================================================================================
//==============================================================================================
//20130302
//============================== 数据层 =============================
//----------------------检查对象类型----------------------
proc string checkObjectType(string $objName)
{
	string $relatives[] = `listRelatives -shapes $objName`;
	if (`size $relatives` == 0 )
	{
		return `objectType $objName`;
	}
	return `objectType $relatives[0]`;
}
//===============================功能分块================================
//----------------------控制器 快速取名----------------------
//选一个控制曲线,再选一个被控对象,执行
proc int renameCtrlsFn()
{
	string $p,$c,$ctrlName,$selected[] = `ls -sl`;

	$c = `textField -q -tx ctrlName`;
	for ($p in $selected)
	{
		$ctrlName = rename(`duplicate -rr $c`,(`match ".*_" $p` + "ctrl"));
		group -n ($ctrlName+"_grp") $ctrlName;
		string $temp[] = `parentConstraint -w 1 $p ($ctrlName+"_grp") `;
		delete $temp[0];
	}
	select -r $selected[size($selected)-1];
	return 1;
}
proc int renameCtrls()
{
	if (`window -ex renameCtrls_win` == true)
	{
		deleteUI -window renameCtrls_win;
	}

	window -t "Rename Ctrl by Jerry" -wh 300 200 renameCtrls_win;
		columnLayout -adj 1 -co "both" 5;
		string $rcLayout = `rowColumnLayout -nc 2 -cw 1 195 -cw 2 80`;
			string $ctrlName= `textField -h 40 -tx " " ctrlName`;
			string $getCtrlName= `button -h 40 -l "getCtrlName" -c "string $selected[] = `ls -sl`;textField -e -tx $selected[0] ctrlName;" $getCtrlName`;
		setParent ..;
		button -l "Move and Rename Ctrls" -h 120 -c "renameCtrlsFn()";
	showWindow renameCtrls_win;
	window -e -wh 300 200 renameCtrls_win;

	return 1;
}
//----------------------- 对象打组 保护数据 --------------------------
//可以选多个,创建一个空节点。把所选对象都连到它的自定属性selObjects上。
//这样就不怕父级打组后原本子物体路径失效了。
proc string[] grp_selectedObjs(string $selection[],string $suffix)
{
	string $grpName,$grpNames[];
	int $con;
	//创建一个 空节点
    $node = `createNode unknown`;
	//添加属性 selObjects
    addAttr -ln "selObjects" -at message -multi -im 0;
	//遍历所选 与节点创建连接
    for ($obj in $selection)
    {
        connectAttr -na ($obj + ".message") ($node + ".selObjects");
    }
	//获取连接上的对象个数,然后遍历 打组
    $con = size(`listConnections ($node + ".selObjects")`);
    for ($i = 0; $i < $con; $i++)
    {
		//取出第一个对象
		string $tmp[0] = `listConnections ($node + ".selObjects["+$i+"]")`;
		//用它的名字加 _grp 后缀创建组,如果当前对象已经是本后缀了,那就给它加序号
		if (match(($suffix+"[0-9]*$"),$tmp[0]) != "")
		{
			$suffix += (int)match("[0-9]*$",$tmp[0]) + 1;
		}		
		$grpName = `group -em -n( substitute("_[^_]*$",match("[^|]*$",$tmp[0]), "" ) + $suffix)`;
		//把组P组 物体
		parent  $grpName $tmp[0] ;
		//清除 位移、旋转、缩放 值
		setAttr ($grpName +".t") 0 0 0;
		setAttr ($grpName +".r") 0 0 0;
		setAttr ($grpName +".s") 1 1 1;
		//再把 组 解出来,到世界空间
		parent -w $grpName ;
		//如果当前物体,不在世界空间,那先把它的组P给它的父级。
		if (size(`listRelatives -p $tmp[0]`) != 0)
		{
			parent $grpName `listRelatives -p -f $tmp[0]`;
		}
		//把物体P给,它的组。
		parent $tmp[0] $grpName;
		//将本次创建的组存入 数组 备用。
		$grpNames[$i] = $grpName;
	}
	//清除 空节点
	delete $node;
	//选中所有创建出来的组
	select -r $grpNames;

	return $grpNames;
}
//============================ 主 UI ===================================
//=================jerryRigAssistant=================
global proc int jerryRigAssistant()
{
	if (`window -ex jerryRigAssistant_win` == true)
	{
		deleteUI -window jerryRigAssistant_win;
	}

	window -t "Jerry Rig Assistant"  jerryRigAssistant_win;
		columnLayout -adj 1 -co "both" 5;
		 text -label "Rig Assistant" -align "center" -h 30 -fn "boldLabelFont";
		button -l "Move and Rename Ctrls" -h 35 -c "renameCtrls()";
		button -l "Grp Selected Objects" -h 35 -c "grp_selectedObjs(`ls -sl`,"_grp")";
		 
	showWindow jerryRigAssistant_win;
	return 1;
}
jerryRigAssistant();



//==============================================================================================
//==============================================================================================
//20130306
//============================== 数据层 =============================
//----------------------检查对象类型----------------------
proc string checkObjectType(string $objName)
{
	string $relatives[] = `listRelatives -shapes $objName`;
	if (`size $relatives` == 0 )
	{
		return `objectType $objName`;
	}
	return `objectType $relatives[0]`;
}
//===============================功能分块================================
//----------------------控制器 快速取名----------------------
//选一个控制曲线,再选一个被控对象,执行
proc int renameCtrls(string $selected[])
{
	string $p,$c,$ctrlName;

	$c = `textField -q -tx ctrlName`;
	for ($p in $selected)
	{
		$ctrlName = rename(`duplicate -rr $c`,(`match ".*_" $p` + "ctrl"));
		group -n ($ctrlName+"_grp") $ctrlName;
		string $temp[] = `parentConstraint -w 1 $p ($ctrlName+"_grp") `;
		delete $temp[0];
	}
	select -r $selected[size($selected)-1];
	return 1;
}
proc int renameCtrlsUI()
{
	if (`window -ex renameCtrls_win` == true)
	{
		deleteUI -window renameCtrls_win;
	}

	window -t "Rename Ctrl by Jerry" -wh 300 200 renameCtrls_win;
		columnLayout -adj 1 -co "both" 5;
		string $rcLayout = `rowColumnLayout -nc 2 -cw 1 195 -cw 2 80`;
			string $ctrlName= `textField -h 40 -tx " " ctrlName`;
			string $getCtrlName= `button -h 40 -l "getCtrlName" -c "string $selected[] = `ls -sl`;textField -e -tx $selected[0] ctrlName;" $getCtrlName`;
		setParent ..;
		button -l "Move and Rename Ctrls" -h 120 -c "renameCtrlsFn(`ls -sl`)";
	showWindow renameCtrls_win;
	window -e -wh 300 200 renameCtrls_win;

	return 1;
}
//----------------------- 对象打组 保护数据 --------------------------
//可以选多个,创建一个空节点。把所选对象都连到它的自定属性selObjects上。
//这样就不怕父级打组后原本子物体路径失效了。
proc string[] grp_selectedObjs(string $selection[],string $suffix)
{
    string $grpName,$grpNames[],$tempGrpNames[];//,$suffix = "_grp";
    int $con;
    //创建一个 空节点
    $node = `createNode unknown`;
    //添加属性 selObjects
    addAttr -ln "selObjects" -at message -multi -im 0;
    //遍历所选 与节点创建连接
    for ($obj in $selection)
    {
        connectAttr -na ($obj + ".message") ($node + ".selObjects");
    }
    //获取连接上的对象个数,然后遍历 打组
    $con = size(`listConnections ($node + ".selObjects")`);
    for ($i = 0; $i < $con; $i++)
    {
        //取出第一个对象
        string $tmp[0] = `listConnections ($node + ".selObjects["+$i+"]")`;
        //用它的名字加 _grp 后缀创建组,如果当前对象已经是本后缀了,那就给它加序号
        if (match(($suffix+"[0-9]*$"),$tmp[0]) != "")
        {
            $suffix += (int)match("[0-9]*$",$tmp[0]) + 1;
        }

		$grpName = (substitute("_[^_]*$",match("[^|]*$",$tmp[0]), "" ) + $suffix);
		$tempGrpNames = `listRelatives -p -f $tmp[0]`;
		int $j,$n = 0;
		if (match("[^|]*$",$tempGrpNames[0]) == $grpName) //print ($grpName+ $suffix)
		{

			$grpName = (substitute("_[^_]*$",match("[^|]*$",$tmp[0]), "" ) + $suffix+"_0");
			//$grpName += ($suffix+"_0");
		}
	   	$grpName = `group -em -n $grpName`;
        //把组P组 物体
        parent(("|"+$grpName),$tmp[0]) ;
        //清除 位移、旋转、缩放 值
        setAttr ".t" 0 0 0;
        setAttr ".r" 0 0 0;
        setAttr ".s" 1 1 1;
        //再把 组 解出来,到世界空间
        parent -w ($tmp[0]+"|"+ $grpName);
        //如果当前物体,不在世界空间,那先把它的组P给它的父级。
        if (size(`listRelatives -p $tmp[0]`) != 0)
        {
           $tempGrpNames =  parent(("|"+$grpName),`listRelatives -p -f $tmp[0]`);
		$grpName = $tempGrpNames[0];
        }
        //把物体P给,它的组。
        parent $tmp[0] $grpName;
        //将本次创建的组存入 数组 备用。
        $grpNames[$i] = $grpName;
    }
    //清除 空节点
    delete $node;
    //选中所有创建出来的组
    select -r $grpNames;

    return $grpNames;
}

//============================ 主 UI ===================================
//=================jerryRigAssistant=================
global proc int jerryRigAssistant()
{
	if (`window -ex jerryRigAssistant_win` == true)
	{
		deleteUI -window jerryRigAssistant_win;
	}

	window -t "Jerry Rig Assistant"  jerryRigAssistant_win;
		columnLayout -adj 1 -co "both" 5;
		 text -label "Rig Assistant" -align "center" -h 30 -fn "boldLabelFont";
		button -l "Move and Rename Ctrls" -h 35 -c "renameCtrls()";
		button -l "Grp Selected Objects" -h 35 -c "grp_selectedObjs(`ls -sl`,\"_grp\")";

	showWindow jerryRigAssistant_win;
	return 1;
}
jerryRigAssistant();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值