可以选多个,创建一个空节点。把所选对象都连到它的自定属性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();