求一个maya检查重命名的插件

复制帖子链接

发贴时间:2023-09-18 14:15 

来自版块:求助问答

·

[未解决]

人气459 评论4 点赞0
该贴正在悬赏1 微豆求答案,认真回答也可获得版主奖励微豆!
求一个maya检查重命名的插件

复制以下链接分享到 QQ群 QQ空间 贴吧 或其他CG网站上,每进来一个人你将获得: 2微豆
B Color Smilies

全部评论4

  •        加菲猫.
    加菲猫. 一阶新手 23-9-18 15:35:02
    微豆: 颗   ID:114393    在线:小时 沙发#2
  • CANKAO
    CANKAO 一阶新手 23-10-11 18:10:11
    微豆: 颗   ID:71959    在线:小时 板凳#3
    maya自带的有一个批量重命名的功能
  • IMAYA
    IMAYA 四阶总监 23-10-13 11:44:54
    微豆: 颗   ID:124964    在线:小时 地板#4
    哈哈工具箱,HAHA TOOLS
  • 小盒
    小盒 五阶副导 23-12-11 17:26:49
    微豆: 颗   ID:85814    在线:小时 5
    劲爆羊里整合的 自动改重名


    //去掉母代名称,例如"a|ab|abc"会得到"abc"//
    global proc string lastName_pro(string $name1)
    {
        if(`gmatch $name1 "*|*"`)
        {
            $name1 = `match "|.*" $name1`;
            $name1 = `substring $name1 2 (size($name1))`;
            $name1 = `lastName_pro $name1`;
        }
        return $name1;
    }

    //去掉名称后面的数字,例如"abc01"会得到"abc","01"//
    global proc string[] endCharName_pro(string $str1[])
    {
        string $lastChar = endString($str1[0], 1);
        if(`gmatch $lastChar "[0-9]"`)
        {
            $str1[0] = `substring $str1[0] 1 (size($str1[0])-1)`;
            $str1[1] = $lastChar + $str1[1];
            $str1 = `endCharName_pro $str1`;
        }
        return $str1;
    }


    //在数组内查找名称最高版本号,前提是数组内有元素匹配$str
    //例如有数组$array={"abc1,abc2,abc5,abcd1,abcde2,abcdef3"};
    //int $max = size($array)-1;
    //输入findMax_pro($array,"abc",0,$max),会得到"abc5"
    global proc string findMax_pro(string $array[],string $str,int $min,int $max)
    {
        int $middle = ($max-$min)/2+$min;
        $array[$middle] = lastName_pro($array[$middle]);
        string $tempStrs[] = endCharName_pro({$array[$middle]});
        if($middle!=$min)
        {
            if($str==$tempStrs[0])
                $min = $middle;
            else
                $max = $middle;
            $tempStrs[0] = findMax_pro($array,$str,$min,$max);
        }
        else
        {
            $array[$max] = lastName_pro($array[$max]);
            $tempStrs = endCharName_pro({$array[$max]});
            if($str==$tempStrs[0])
                $tempStrs[0] = $array[$max];
            else
                $tempStrs[0] = $array[$middle];
        }
        return $tempStrs[0];
    }


    //获取该物体名字在场景内最大版本号+1
    global proc string getObjMaxVersion_pro(string $objName)
    {
        $objName = lastName_pro($objName);
        string $tempStrs[] = endCharName_pro({$objName});
        string $array[] = `ls ($tempStrs[0] + "*")`;
        if(size($array))
        {
            $objName = findMax_pro($array,$tempStrs[0],0,(size($array)-1));
            $tempStrs = endCharName_pro({$objName});
        }
        $objName = $tempStrs[0] + (int($tempStrs[1])+1);
        return $objName;
    }


    //根据母代名称的多少来排序,例如"a|ab|abc"会相对排在前面,"a|ab"会相对排在后面//
    global proc string[] sortName_pro(string $allName[])
    {
        int $i,$j,$temp_num,$numTokens1,$numTokens2;
        string $temp_name,$buffer[];
        for($i=0;$i<size($allName);$i++)
        {
            $numTokens1 = `tokenize $allName[$i] "|" $buffer`;
            for($j=0;$j<size($allName);$j++)
            {
                $numTokens2 = `tokenize $allName[$j] "|" $buffer`;
                if($numTokens1>$numTokens2)
                {
                    $temp_num = $numTokens1; $numTokens1 = $numTokens2; $numTokens2 = $temp_num;
                    $temp_name = $allName[$i]; $allName[$i] = $allName[$j]; $allName[$j] = $temp_name;
                }
            }
        }
        return $allName;
    }


    global proc string rejiggerName_pro(string $allName[],string $nameType,int $amount)
    {
        string $againName[];
        int $j=0;
        for($i=0;$i<size($allName);$i++)
        {
            if(`gmatch $allName[$i] "*|*"`)
            {
                $againName[$j] = $allName[$i];
                $j++;
            }
            $amount += 3.0*$i/size($allName);
            progressWindow -edit
                -progress $amount
                -status ("====正在检测并且重新命名场景内所有的重名物体和节点: "+$amount+"%====");
        }
        if(!$j)
        {
            $amount += 30;
            progressWindow -edit
                    -progress $amount
                    -status ("====正在检测并且重新命名场景内所有的重名物体和节点: "+$amount+"%====");
            return "";
        }

        $againName = `sortName_pro $againName`;

        string $temp_name;
        string $failNames[],$loseName[],$str1[];
        int $k=0,$l=0;
        for($i=0;$i<size($againName);$i++)
        {
            if ( `progressWindow -query -isCancelled` )
            {
                break;
                return "";
            }
            if(`gmatch $againName[$i] "*|*"`)
            {
                $againName[$i] = longNameOf($againName[$i]);
                if($nameType=="Shape节点")
                {
                    $temp_name = firstParentOf($againName[$i]);
                    $temp_name = `lastName_pro $temp_name`;
                    $str1 = `endCharName_pro {$temp_name}`;
                    $temp_name = $str1[0] + "Shape\#";
                }
                else
                {
                    $temp_name = `lastName_pro $againName[$i]`;
                    $str1 = `endCharName_pro {$temp_name}`;
                    $temp_name = $str1[0] + "\#";
                }

                if(catchQuiet($temp_name=`rename $againName[$i] $temp_name`))
                {
                    $failNames[$k] = $againName[$i];
                    $k++;
                }
                else
                {
                    if(`gmatch $temp_name "*|*"`)
                    {
                        $loseName[$l] = longNameOf($temp_name);
                        $l++;
                    }
                }
                $amount += 10.0*$i/size($againName);
                progressWindow -edit
                    -progress $amount
                    -status ("====正在检测并且重新命名场景内所有的重名物体和节点: "+$amount+"%====");
            }
        }

        if($l)
        {
            $l = 0;
            for($i=0;$i<size($loseName);$i++)
            {
                $temp_name = getObjMaxVersion_pro($loseName[$i]);
                catchQuiet($loseName[$i]=`rename $loseName[$i] $temp_name`);
                if(`gmatch $loseName[$i] "*|*"`)
                {
                    $str1[$l] = $loseName[$i];
                    $l++;
                }
                $amount += 20.0*$i/size($loseName);
                progressWindow -edit
                    -progress $amount
                    -status ("====正在检测并且重新命名场景内所有的重名物体和节点: "+$amount+"%====");
            }
        }

        $temp_name = "场景内共找到" + $j + "个重名的" + $nameType + "!\n";
        $j = $j - $k;
        if($j)
        {
            $temp_name = $temp_name + "场景内" + $j + "个重名的" + $nameType + "已经全部重新更改名称!\n";
        }
        if($k)
        {
            $temp_name = $temp_name + "场景内" + $k + "个重名的" + $nameType + "重新更改名称失败,请检查是否有reference物体或者被lockNode锁定的物体!\n";
            print ("场景内" + $k + "个重名的" + $nameType + ",重新更改名称失败的物体为:\n");
            print $failNames;
        }
        if($l)
        {
            $temp_name = $temp_name + "场景内" + $l + "个重名的" + $nameType + ",二次重新命名失败,请检查是否有关联物体或者共用相同shape节点的物体!\n";
            print ("场景内" + $l + "个重名的" + $nameType + ",二次重新命名失败,请检查是否有关联或者共用相同shape节点的物体:\n");
            print $str1;
        }
        return $temp_name;
    }

    global proc detectionOfTheSameNameMain()
    {
        timer -s;
        string $scripName = "检测全部重名节点\@zj_v14";
        int $amount = 0;
        progressWindow
            -title $scripName
            -progress $amount
            -status "====正在检测并且重新命名场景内所有的重名物体和节点: 0%===="
            -isInterruptable true;

        string $allName[] = `ls -tr`;
        string $nameType = "模型或者组";
        string $temp_name = `rejiggerName_pro $allName $nameType $amount`;

        if ( !`progressWindow -query -isCancelled` )
        {
            $amount = 33;
            $allName = `ls -s`;
            $nameType = "Shape节点";
            $temp_name = $temp_name + "\n" + `rejiggerName_pro $allName $nameType $amount`;
        }

        if ( !`progressWindow -query -isCancelled` )
        {
            $amount = 67;
            $allName = `ls`;
            //string $items[] = `ls -tr`;
            //$allName = stringArrayRemove($items, $allName);
            //$items = `ls -s`;
            //$allName = stringArrayRemove($items, $allName);
            $nameType = "其它节点";
            $temp_name = $temp_name + "\n" + `rejiggerName_pro $allName $nameType $amount`;
        }
        else
            $temp_name = "程序已经被终止运行.";

        if($temp_name=="\n\n")
            $temp_name = "GOOD!,场景内没有找到任何重名的物体和节点.";

        progressWindow -endProgress;
        print("此次运行时间为:"+`timer -e`+"秒.\n");

        confirmDialog -title $scripName -message $temp_name
            -button "谢谢使用" -defaultButton "谢谢使用"
            -cancelButton "谢谢使用" -dismissString "谢谢使用";
    }
    global proc deleteUknownNodes()
    {
            string $unknownNodes[]=`ls -et "unknown"`;
            for($nodes in $unknownNodes)
                    delete $nodes;
            print ("delete "+size($unknownNodes)+" unknown nodes");
    }
    deleteUknownNodes();

    detectionOfTheSameNameMain();

客服
快速回复 返回顶部 返回列表