MAYAPlugin_Mel_顶点法线批处理

学习目标:

创建与个Maya插件,可以通过修改顶点法线的角度来视觉上硬化导角边


学习内容:

1、 通过面积筛选
2、 对选中的面进行法线批量修改
3、 复制法线
4、 粘贴法线


学习时间:

15天


学习产出:

过于臃肿 之后会做简化

VertexNormalSort_EN.mel

    //VertexNormalBatch
    global proc VertexNormalSort(){
        if(`window -query -exists adia_myVertexNormalSort_Window`)
        deleteUI adia_myVertexNormalSort_Window;
        string $s = "Adia_vertexNormalBatch";
        string $chkbxState = "not checked";
        window -title $s -menuBar true -maximizeButton true -minimizeButton true adia_myVertexNormalSort_Window;
        columnLayout -adjustableColumn true;
            text -label "Refer the manual to use" -en off;
            radioButtonGrp -label "Mode:" -numberOfRadioButtons 4
            -labelArray4 "1 Hardening" "2 soften" "Copy vertex normal" "Paste vertex normal" -sl 1
            adia_Select;
            floatFieldGrp -precision 3 -numberOfFields 1 -extraLabel "°" -label 
            "Filter less than:" -value1 100.0  -columnWidth 1 65  adia_NormalValue;
            floatFieldGrp -precision 3 -numberOfFields 1 -extraLabel "°" -label "Face area" -value1 0.0  -columnWidth 1 65 -en off adia_NormalValue2;
            button -height 23 -width 23 -backgroundColor 255 241 155 -label "Get area"
            -command "Do4()";
            text -label " " -en off;
            button -height 23 -width 23 -backgroundColor 255 241 155 -label "Filter area"
            -command "Do3_2()";
            text -label " " -en off;
            button -height 23 -width 23 -backgroundColor 255 241 155 -label "Run"
            -command "Do3_1()";
            text -label " " -en off;
        window -edit -widthHeight 600 210 adia_myVertexNormalSort_Window;
        showWindow adia_myVertexNormalSort_Window;
    }
    global string $vertexName_G[]={};
    global string $element_G[]={};
    global string $objectName_G[]={};
    global float $vertexNormal_G[]={};
    global proc Do3()
    {
        disableIncorrectNameWarning;
        global string  $vertexName_G[];
        global string $element_G[];
        global string $objectName_G[]={};
        global float $vertexNormal_G[]={};
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        string $element[];
        $element = `filterExpand -expand on -selectionMask 34 $selectList`;
        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;
        for($ele in $element)
        {
            $element_G[size($element_G)] = $ele;
        }
        if(size($element)>0)
        {
            print("Executing...");
            for($i = 0 ; $i < size($element); $i++)
            {
                float $sizeUI = `floatFieldGrp -q -v1 adia_NormalValue`;
                string $objectName[] = stringToStringArray($element[$i], ".");
                $objectName_G[0] = $objectName[0];
                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; 
                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], " ");
                string $face[] = stringToStringArray($vertex[1],":");
                string $vName0 =  $objectName[0]+".vtxFace["+ $vertex[2] +"]["+$face[0]  +"]";
                string $vName1 =  $objectName[0]+".vtxFace["+ $vertex[3] +"]["+$face[0]  +"]";
                string $vName2 =  $objectName[0]+".vtxFace["+ $vertex[4] +"]["+$face[0]  +"]";
                string $vName3 =  $objectName[0]+".vtxFace["+ $vertex[5] +"]["+$face[0]  +"]";
                string $pointPosName1 = $objectName[0]+".vtx["+ $vertex[2] +"]";
                string $pointPosName2 = $objectName[0]+".vtx["+ $vertex[3] +"]";
                string $pointPosName3 = $objectName[0]+".vtx["+ $vertex[4] +"]";
                string $pointPosName4 = $objectName[0]+".vtx["+ $vertex[5] +"]";
                $vertexName_G[size($vertexName_G)] = $pointPosName1;
                $vertexName_G[size($vertexName_G)] = $pointPosName2;
                $vertexName_G[size($vertexName_G)] = $pointPosName3;
                $vertexName_G[size($vertexName_G)] = $pointPosName4;
                string $test1_o[] = stringToStringArray($pointPosName1, ".");
                string $test2_o[] = stringToStringArray($pointPosName2, ".");
                string $test3_o[] = stringToStringArray($pointPosName3, "."); 
                string $test4_o[] = stringToStringArray($pointPosName4, ".");
                string $test1[] = stringToStringArray($test1_o[1], "]");
                string $test2[] = stringToStringArray($test2_o[1], "]");
                string $test3[] = stringToStringArray($test3_o[1], "]"); 
                string $test4[] = stringToStringArray($test4_o[1], "]");
                if($test1[0]=="vtx["+"\n"||$test2[0]=="vtx["+"\n"||$test3[0]=="vtx["+"\n"||$test4[0]=="vtx["+"\n")
                {
                }else
                {
                    float  $pointPos1[] = `pointPosition -w $pointPosName1` ;
                    float  $pointPos2[] = `pointPosition -w $pointPosName2` ;
                    float  $pointPos3[] = `pointPosition -w $pointPosName3` ;
                    float  $pointPos4[] = `pointPosition -w $pointPosName4` ;
                    float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);
                    if($faceArea<=$sizeUI)
                    {
                    }else {
                        select -cl ;
                        select -tgl $vName0 ;
                        select -tgl $vName1 ;
                        select -tgl $vName2 ;
                        select -tgl $vName3 ;
                        polySetToFaceNormal ;
                        select -cl ;
                        string $vName0_0="";
                        string $vName1_1="";
                        string $vName2_2="";
                        string $vName3_3="";
                        if(`radioButtonGrp -q -sl adia_Select`==1)
                        {
                            $vName0_0 =  $objectName[0]+".vtxFace["+ $vertex[2] +"]["+(string)((int)($face[0])+1)  +"]";
                            $vName1_1 =  $objectName[0]+".vtxFace["+ $vertex[3] +"]["+(string)((int)($face[0])-1)  +"]";
                            $vName2_2 =  $objectName[0]+".vtxFace["+ $vertex[4] +"]["+(string)((int)($face[0])-1)  +"]";
                            $vName3_3 =  $objectName[0]+".vtxFace["+ $vertex[5] +"]["+(string)((int)($face[0])+1)  +"]";
                        }else if(`radioButtonGrp -q -sl adia_Select`==2)
                        {
                            string $mesh = $objectName[0];
                            string $localer[]= `spaceLocator -p 0 0 0`;
                            move -r $pointPos1[0] $pointPos1[1] $pointPos1[2];
                            string $cpom = `createNode closestPointOnMesh`;
                            connectAttr -f ($mesh+".outMesh")($cpom+".inMesh");
                            connectAttr -f ($localer[0]+".translate")($cpom+".inPosition");
                            int $closestVert = `getAttr ($cpom + ".closestVertexIndex")`;
                            string $vertName = $mesh+".vtx["+$closestVert+"]";
                            $vName0_0 = $vertName;
                            $vName1_1 = $vertName;
                            $vName2_2 = $vertName;
                            $vName3_3 = $vertName;
                            delete $cpom;
                            delete $localer[0];
                        } 
                        if(catch(`select -tgl $vName0_0`)||catch(`ls -sl $vName0_0`))
                        {
                        }else{
                            select -tgl $vName0;
                            if(catch(`select -tgl $vName0_0`))
                            {
                            }else{
                                select -tgl $vName0_0;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                            select -cl ;
                            select -tgl $vName1;
                            if(catch(`select -tgl $vName1_1`))
                            {
                            }else{
                                select -tgl $vName1_1;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                            select -cl ;
                            select -tgl $vName2;
                            if(catch(`select -tgl $vName2_2`))
                            {
                            }else{
                                select -tgl $vName2_2;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                            select -cl ;
                            select -tgl $vName3;
                            if(catch(`select -tgl $vName2_2`))
                            {
                            }else{
                                select -tgl $vName3_3;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                        }
                }
                }
            }
            string $shorterList[] = stringArrayRemoveDuplicates($vertexName_G);
            string $diff[] = stringArrayRemoveExact($shorterList,$vertexName_G);
            for($each in $diff)
            {
                if(catch (`select -tgl $each`))
                {
                }
                else
                {
                    select -cl;
                    select -tgl $each ;
                    polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                    select -cl;
                }
            }
            if(catch(`select -r $objectName_G[0]`))
            {
            }else{select -r $objectName_G[0];}
            for($ele in $element_G)
            {
                if(catch(`select -tgl $ele`))
                {
                    print("erro");
                }
                else{
                    select -add $ele;
                }
            }
            print("succeed!");
        }
        if(size($elementVertex)>0)
        {
            if(`radioButtonGrp -q -sl adia_Select`==3)
            {
                $vertexNormal_G = `polyNormalPerVertex -q -xyz $elementVertex[0]`;
                print("Copy Value:"+"x:"+ $vertexNormal_G[0]  +"__y:"+$vertexNormal_G[1]  +"__z:"+$vertexNormal_G[2]);
            }else if(`radioButtonGrp -q -sl adia_Select`==4)
            {
                for($i=0;$i<size($elementVertex);$i++)
                {
                    polyNormalPerVertex -xyz $vertexNormal_G[0] $vertexNormal_G[1] $vertexNormal_G[2] $elementVertex[$i];
                }
                print("Successfully pasted normal information!");
            }
        }
        pause -sec 1;
        clear $element_G;
        clear $vertexName_G;
        clear $objectName_G;
    }
    global proc Do3_1()
    {
        disableIncorrectNameWarning;
        global string  $vertexName_G[];
        global string $element_G[];
        global string $objectName_G[]={};
        global float $vertexNormal_G[]={};
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        string $element[];
        $element = `filterExpand -expand on -selectionMask 34 $selectList`;
        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;
        for($ele in $element)
        {
            $element_G[size($element_G)] = $ele;
        }
        if(size($element)>0)
        {
            print("Executing...");
            for($i = 0 ; $i < size($element); $i++)
            {
                float $sizeUI = `floatFieldGrp -q -v1 adia_NormalValue`;
                string $objectName[] = stringToStringArray($element[$i], ".");
                $objectName_G[0] = $objectName[0];
                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; 
                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], " ");
                string $face[] = stringToStringArray($vertex[1],":");
                string $vName0 =  $objectName[0]+".vtxFace["+ $vertex[2] +"]["+$face[0]  +"]";
                string $vName1 =  $objectName[0]+".vtxFace["+ $vertex[3] +"]["+$face[0]  +"]";
                string $vName2 =  $objectName[0]+".vtxFace["+ $vertex[4] +"]["+$face[0]  +"]";
                string $vName3 =  $objectName[0]+".vtxFace["+ $vertex[5] +"]["+$face[0]  +"]";
                string $pointPosName1 = $objectName[0]+".vtx["+ $vertex[2] +"]";
                string $pointPosName2 = $objectName[0]+".vtx["+ $vertex[3] +"]";
                string $pointPosName3 = $objectName[0]+".vtx["+ $vertex[4] +"]";
                string $pointPosName4 = $objectName[0]+".vtx["+ $vertex[5] +"]";
                $vertexName_G[size($vertexName_G)] = $pointPosName1;
                $vertexName_G[size($vertexName_G)] = $pointPosName2;
                $vertexName_G[size($vertexName_G)] = $pointPosName3;
                $vertexName_G[size($vertexName_G)] = $pointPosName4;
                string $test1_o[] = stringToStringArray($pointPosName1, ".");
                string $test2_o[] = stringToStringArray($pointPosName2, ".");
                string $test3_o[] = stringToStringArray($pointPosName3, "."); 
                string $test4_o[] = stringToStringArray($pointPosName4, ".");
                string $test1[] = stringToStringArray($test1_o[1], "]");
                string $test2[] = stringToStringArray($test2_o[1], "]");
                string $test3[] = stringToStringArray($test3_o[1], "]"); 
                string $test4[] = stringToStringArray($test4_o[1], "]");
                if($test1[0]=="vtx["+"\n"||$test2[0]=="vtx["+"\n"||$test3[0]=="vtx["+"\n"||$test4[0]=="vtx["+"\n")
                {
                }else
                {
                    float  $pointPos1[] = `pointPosition -w $pointPosName1` ;
                    float  $pointPos2[] = `pointPosition -w $pointPosName2` ;
                    float  $pointPos3[] = `pointPosition -w $pointPosName3` ;
                    float  $pointPos4[] = `pointPosition -w $pointPosName4` ;
                    float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);
                    if($faceArea>$sizeUI)
                    {
                        if(size($element_G)>1)
                        {
                            string $e[];
                            $e[0] = $element[$i];
                            $element_G = stringArrayRemove($e,$element_G);
                        }
                    }else {
                        select -cl ;
                        select -tgl $vName0 ;
                        select -tgl $vName1 ;
                        select -tgl $vName2 ;
                        select -tgl $vName3 ;
                        polySetToFaceNormal ;
                        select -cl ;
                        string $vName0_0="";
                        string $vName1_1="";
                        string $vName2_2="";
                        string $vName3_3="";
                        if(`radioButtonGrp -q -sl adia_Select`==1)
                        {
                            $vName0_0 =  $objectName[0]+".vtxFace["+ $vertex[2] +"]["+(string)((int)($face[0])+1)  +"]";
                            $vName1_1 =  $objectName[0]+".vtxFace["+ $vertex[3] +"]["+(string)((int)($face[0])-1)  +"]";
                            $vName2_2 =  $objectName[0]+".vtxFace["+ $vertex[4] +"]["+(string)((int)($face[0])-1)  +"]";
                            $vName3_3 =  $objectName[0]+".vtxFace["+ $vertex[5] +"]["+(string)((int)($face[0])+1)  +"]";
                        }else if(`radioButtonGrp -q -sl adia_Select`==2)
                        {
                            string $mesh = $objectName[0];
                            string $localer[]= `spaceLocator -p 0 0 0`;
                            move -r $pointPos1[0] $pointPos1[1] $pointPos1[2];
                            string $cpom = `createNode closestPointOnMesh`;
                            connectAttr -f ($mesh+".outMesh")($cpom+".inMesh");
                            connectAttr -f ($localer[0]+".translate")($cpom+".inPosition");
                            int $closestVert = `getAttr ($cpom + ".closestVertexIndex")`;
                            string $vertName = $mesh+".vtx["+$closestVert+"]";
                            $vName0_0 = $vertName;
                            $vName1_1 = $vertName;
                            $vName2_2 = $vertName;
                            $vName3_3 = $vertName;
                            delete $cpom;
                            delete $localer[0];
                        } 
                        if(catch(`select -tgl $vName0_0`)||catch(`ls -sl $vName0_0`))
                        {
                        }else{
                            select -tgl $vName0;
                            if(catch(`select -tgl $vName0_0`))
                            {
                            }else{
                                select -tgl $vName0_0;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                            select -cl ;
                            select -tgl $vName1;
                            if(catch(`select -tgl $vName1_1`))
                            {
                            }else{
                                select -tgl $vName1_1;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                            select -cl ;
                            select -tgl $vName2;
                            if(catch(`select -tgl $vName2_2`))
                            {
                            }else{
                                select -tgl $vName2_2;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                            select -cl ;
                            select -tgl $vName3;
                            if(catch(`select -tgl $vName3_3`))
                            {
                            }else{
                                select -tgl $vName3_3;
                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                                select -cl ;
                            }
                        }
                    }
                }
            }
            if(`radioButtonGrp -q -sl adia_Select`==1)
            {
                string $vtxlist[] = `polyListComponentConversion -ff -tv $element_G`;
                $vtxlist = `filterExpand -sm 31 -ex true $vtxlist`;
                for($vtx in $vtxlist)
                {
                    string $faceList[] = `polyListComponentConversion -fv -tf $vtx`;
                    $faceList =`filterExpand -sm 34 -ex true $faceList`;
                    string $faceList2[] = stringArrayRemove($element,$faceList);
                    float $avNormal[] = {0,0,0};
                    int $i = 0;
                    if(size($faceList2)==0)
                    {
                        $faceList2 = $faceList;
                    }
                    for($ff in $faceList2)
                    {
                        string $nrm[] = `polyInfo -faceNormals $ff`;
                        string $tkBuf[];
                        float $tNml[] = {0,0,0};
                        tokenize $nrm[0] " " $tkBuf;
                        $tNml[0]+=((float)($tkBuf[2]));
                        $tNml[1]+=((float)($tkBuf[3]));
                        $tNml[2]+=((float)($tkBuf[4]));
                        $avNormal[0] += $tNml[0];
                        $avNormal[1] += $tNml[1];
                        $avNormal[2] += $tNml[2];
                        $i++;
                    }
                    if($i)
                    {
                        $avNormal[0] = $avNormal[0]/$i;
                        $avNormal[1] = $avNormal[1]/$i;
                        $avNormal[2] = $avNormal[2]/$i;
                        normalize($avNormal);
                        polyNormalPerVertex -xyz $avNormal[0] $avNormal[1] $avNormal    [2] $vtx;
                    }
                }
            }
            string $shorterList[] = stringArrayRemoveDuplicates($vertexName_G);
            string $diff[] = stringArrayRemoveExact($shorterList,$vertexName_G);
            if(size($diff)>0)
            {
                for($each in $diff)
                {
                    string $check[]={};
                    tokenize $each "vtx[" $check;
                    if($check[1]!="\n"+"]")
                    {
                        if(catch (`select -tgl $each`))
                        {
                        }
                        else
                        {
                            select -cl;
                            select -tgl $each ;
                            polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;
                            select -cl;
                        }
                    }
                }
                if(catch(`select -r $objectName_G[0]`))
                {
                }else{select -r $objectName_G[0];}
                for($ele in $element_G)
                {
                    if(catch(`select -tgl $ele`))
                    {
                        print("erro");
                    }
                    else{
                        select -add $ele;
                    }
                }
            }
            print("succeed!");
        }
        if(size($elementVertex)>0)
        {
            if(`radioButtonGrp -q -sl adia_Select`==3)
            {
                $vertexNormal_G = `polyNormalPerVertex -q -xyz $elementVertex[0]`;
                print("Copy Value:"+"x:"+ $vertexNormal_G[0]  +"__y:"+$vertexNormal_G[1]  +"__z:"+$vertexNormal_G[2]);
            }else if(`radioButtonGrp -q -sl adia_Select`==4)
            {
                for($i=0;$i<size($elementVertex);$i++)
                {
                    polyNormalPerVertex -xyz $vertexNormal_G[0] $vertexNormal_G[1] $vertexNormal_G[2] $elementVertex[$i];
                }
                print("Successfully pasted normal information!");
            }
        }
        pause -sec 1;
        clear $element_G;
        clear $vertexName_G;
        clear $objectName_G;
    }
    global proc Do3_2()
    {
        disableIncorrectNameWarning;
        global string  $vertexName_G[];
        global string $element_G[];
        global string $objectName_G[]={};
        global float $vertexNormal_G[]={};
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        string $element[];
        $element = `filterExpand -expand on -selectionMask 34 $selectList`;
        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;
        for($ele in $element)
        {
            $element_G[size($element_G)] = $ele;
        }
        if(size($element)>0)
        {
            print("Executing...");
            for($i = 0 ; $i < size($element); $i++)
            {
                float $sizeUI = `floatFieldGrp -q -v1 adia_NormalValue`;
                string $objectName[] = stringToStringArray($element[$i], ".");
                $objectName_G[0] = $objectName[0];
                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; 
                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], " ");
                string $face[] = stringToStringArray($vertex[1],":");
                string $vName0 =  $objectName[0]+".vtxFace["+ $vertex[2] +"]["+$face[0]  +"]";
                string $vName1 =  $objectName[0]+".vtxFace["+ $vertex[3] +"]["+$face[0]  +"]";
                string $vName2 =  $objectName[0]+".vtxFace["+ $vertex[4] +"]["+$face[0]  +"]";
                string $vName3 =  $objectName[0]+".vtxFace["+ $vertex[5] +"]["+$face[0]  +"]";
                string $pointPosName1 = $objectName[0]+".vtx["+ $vertex[2] +"]";
                string $pointPosName2 = $objectName[0]+".vtx["+ $vertex[3] +"]";
                string $pointPosName3 = $objectName[0]+".vtx["+ $vertex[4] +"]";
                string $pointPosName4 = $objectName[0]+".vtx["+ $vertex[5] +"]";
                $vertexName_G[size($vertexName_G)] = $pointPosName1;
                $vertexName_G[size($vertexName_G)] = $pointPosName2;
                $vertexName_G[size($vertexName_G)] = $pointPosName3;
                $vertexName_G[size($vertexName_G)] = $pointPosName4;
                string $test1_o[] = stringToStringArray($pointPosName1, ".");
                string $test2_o[] = stringToStringArray($pointPosName2, ".");
                string $test3_o[] = stringToStringArray($pointPosName3, "."); 
                string $test4_o[] = stringToStringArray($pointPosName4, ".");
                string $test1[] = stringToStringArray($test1_o[1], "]");
                string $test2[] = stringToStringArray($test2_o[1], "]");
                string $test3[] = stringToStringArray($test3_o[1], "]"); 
                string $test4[] = stringToStringArray($test4_o[1], "]");
                if($test1[0]=="vtx["+"\n"||$test2[0]=="vtx["+"\n"||$test3[0]=="vtx["+"\n"||$test4[0]=="vtx["+"\n")
                {
                    string $e[];
                    $e[0] = $element[$i];
                    $element_G = stringArrayRemove($e,$element_G);
                }else
                {
                    float  $pointPos1[] = `pointPosition -w $pointPosName1` ;
                    float  $pointPos2[] = `pointPosition -w $pointPosName2` ;
                    float  $pointPos3[] = `pointPosition -w $pointPosName3` ;
                    float  $pointPos4[] = `pointPosition -w $pointPosName4` ;
                    float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);
                    if($faceArea>$sizeUI)
                    {
                        if(size($element_G)>0)
                        {
                            string $e[];
                            $e[0] = $element[$i];
                            $element_G = stringArrayRemove($e,$element_G);
                        }
                    }
                }
            }
            select -cl;
            for($ele in $element_G)
            {
                if(catch(`select -tgl $ele`))
                {
                    print("erro");
                }
                else{
                    select -add $ele;
                }
            }
            pause -sec 1;
            clear $element_G;
            clear $vertexName_G;
            clear $objectName_G;
            print("succeed!");
        }
    }
    global proc Do4()
    {
        string $selectList[];
        $selectList = `ls -selection -flatten`;
        string $element[];
        $element = `filterExpand -expand on -selectionMask 34 $selectList`;
        if(size($element)==1)
        {
                string $objectName[] = stringToStringArray($element[0], ".");
                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[0]`; 
                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], " ");
                string $face[] = stringToStringArray($vertex[1],":");
                string $vName0 =  $objectName[0]+".vtxFace["+ $vertex[2] +"]["+$face[0]  +"]";
                string $vName1 =  $objectName[0]+".vtxFace["+ $vertex[3] +"]["+$face[0]  +"]";
                string $vName2 =  $objectName[0]+".vtxFace["+ $vertex[4] +"]["+$face[0]  +"]";
                string $pointPosName1 = $objectName[0]+".vtx["+ $vertex[2] +"]";
                string $pointPosName2 = $objectName[0]+".vtx["+ $vertex[3] +"]";
                string $pointPosName3 = $objectName[0]+".vtx["+ $vertex[4] +"]";
                float  $pointPos1[] = `pointPosition -l $pointPosName1` ;
                float  $pointPos2[] = `pointPosition -l $pointPosName2` ;
                float  $pointPos3[] = `pointPosition -l $pointPosName3` ;
                float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);
                floatFieldGrp -e -v1 $faceArea adia_NormalValue2;
        }
    }
    global proc matrix myWG_CreateVecMatrix(float $x, float$y, float$z)
    {
        matrix $mRes_Mtx[1][4]=<<$x,$y,$z,0>>;
        return($mRes_Mtx);
    }
    global proc matrix adia_GetObjectMatrix(string $objectName)
    {
        float $objectMatrix[] = `getAttr ($objectName+".inverseMatrix")`;
        matrix $objectMatrixInfo4x4[4][4]=<<
        $objectMatrix[0],$objectMatrix[4],$objectMatrix[8],$objectMatrix[12];
        $objectMatrix[1],$objectMatrix[5],$objectMatrix[9],$objectMatrix[13];
        $objectMatrix[2],$objectMatrix[6],$objectMatrix[10],$objectMatrix[14];
        $objectMatrix[3],$objectMatrix[7],$objectMatrix[11],$objectMatrix[15]
        >>;
        return($objectMatrixInfo4x4);
    }
    global proc matrix adia_ObjectSpaceToWorldSpace(matrix $in_matrix,string $objectName)
    {
        matrix $objectMatrixInfo4x4[4][4] = adia_GetObjectMatrix($objectName);
        matrix $Out_Matrix[1][4]=$in_matrix * $objectMatrixInfo4x4;
        return($Out_Matrix);
    }
    global proc float adia_CountArea(float $a[], float $b[],float $c[])
    {
        float $area = -1;
        float $side[3];
        $side[0] = sqrt(pow($a[0]-$b[0],2)+pow($a[1]-$b[1],2)+pow($a[2]-$b[2],2));
        $side[1] = sqrt(pow($a[0]-$c[0],2)+pow($a[1]-$c[1],2)+pow($a[2]-$c[2],2));
        $side[2] = sqrt(pow($c[0]-$b[0],2)+pow($c[1]-$b[1],2)+pow($c[2]-$b[2],2));
        if($side[0]+$side[1]<=$side[2]||$side[0]+$side[2]<=$side[1]||$side[1]+$side[2]<=$side[0])
        {
            return $area; 
        }
        //s=sqr(p*(p-a)(p-b)(p-c));
        float $p = ($side[0]+$side[1]+$side[2])/2;
        $area = sqrt($p*($p-$side[0])*($p-$side[1])*($p-$side[2]));
        return $area*2;
    }
    VertexNormalSort();
    

VertexNormalBatch_Main.mel (直接添加到工具架)

global string $gShelfTopLevel;
string $shelves[] = `tabLayout -q -childArray $gShelfTopLevel`;
int $counter=0;
int $btmCounter=0;
string $imageSet = "selectSurfaceBorder.png";
string $buttonLab = "VertexNoramlBatch";
string $buttonAnnotation = "VertexNoramlBatch(PleaseReadUserGuide)";
string $script = "    //VertexNormalBatch\n    global proc VertexNormalSort(){\n        if(`window -query -exists adia_myVertexNormalSort_Window`)\n        deleteUI adia_myVertexNormalSort_Window;\n        string $s = \"Adia_vertexNormalBatchV1\";\n        string $chkbxState = \"not checked\";\n        window -title $s -menuBar true -maximizeButton true -minimizeButton true adia_myVertexNormalSort_Window;\n        columnLayout -adjustableColumn true;\n            text -label \"Refer the manual to use\" -en off;\n            radioButtonGrp -label \"Mode\" -numberOfRadioButtons 4\n            -labelArray4 \"1 Hardening\" \"2 soften\" \"Copy \" \"Paste \" -sl 1\n            adia_Select;\n            floatFieldGrp -precision 3 -numberOfFields 1 -extraLabel \"cm\" -label \n            \"Less than\" -value1 100.0  -columnWidth 1 65  adia_NormalValue;\n            floatFieldGrp -precision 3 -numberOfFields 1 -extraLabel \"cm\" -label \"Face area\" -value1 0.0  -columnWidth 1 65 -en off adia_NormalValue2;\n            button -height 23 -width 23 -backgroundColor 255 241 155 -label \"Get area\"\n            -command \"Do4()\";\n            text -label \" \" -en off;\n            button -height 23 -width 23 -backgroundColor 255 241 155 -label \"Filter area\"\n            -command \"Do3_2()\";\n            text -label \" \" -en off;\n            button -height 23 -width 23 -backgroundColor 255 241 155 -label \"Run\"\n            -command \"Do3_1()\";\n            text -label \" \" -en off;\n        window -edit -widthHeight 600 210 adia_myVertexNormalSort_Window;\n        showWindow adia_myVertexNormalSort_Window;\n    }\n    global string $vertexName_G[]={};\n    global string $element_G[]={};\n    global string $objectName_G[]={};\n    global float $vertexNormal_G[]={};\n    global proc Do3()\n    {\n        disableIncorrectNameWarning;\n        global string  $vertexName_G[];\n        global string $element_G[];\n        global string $objectName_G[]={};\n        global float $vertexNormal_G[]={};\n        string $selectList[];\n        $selectList = `ls -selection -flatten`;\n        string $element[];\n        $element = `filterExpand -expand on -selectionMask 34 $selectList`;\n        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;\n        for($ele in $element)\n        {\n            $element_G[size($element_G)] = $ele;\n        }\n        if(size($element)>0)\n        {\n            print(\"Executing...\");\n            for($i = 0 ; $i < size($element); $i++)\n            {\n                float $sizeUI = `floatFieldGrp -q -v1 adia_NormalValue`;\n                string $objectName[] = stringToStringArray($element[$i], \".\");\n                $objectName_G[0] = $objectName[0];\n                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; \n                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], \" \");\n                string $face[] = stringToStringArray($vertex[1],\":\");\n                string $vName0 =  $objectName[0]+\".vtxFace[\"+ $vertex[2] +\"][\"+$face[0]  +\"]\";\n                string $vName1 =  $objectName[0]+\".vtxFace[\"+ $vertex[3] +\"][\"+$face[0]  +\"]\";\n                string $vName2 =  $objectName[0]+\".vtxFace[\"+ $vertex[4] +\"][\"+$face[0]  +\"]\";\n                string $vName3 =  $objectName[0]+\".vtxFace[\"+ $vertex[5] +\"][\"+$face[0]  +\"]\";\n                string $pointPosName1 = $objectName[0]+\".vtx[\"+ $vertex[2] +\"]\";\n                string $pointPosName2 = $objectName[0]+\".vtx[\"+ $vertex[3] +\"]\";\n                string $pointPosName3 = $objectName[0]+\".vtx[\"+ $vertex[4] +\"]\";\n                string $pointPosName4 = $objectName[0]+\".vtx[\"+ $vertex[5] +\"]\";\n                $vertexName_G[size($vertexName_G)] = $pointPosName1;\n                $vertexName_G[size($vertexName_G)] = $pointPosName2;\n                $vertexName_G[size($vertexName_G)] = $pointPosName3;\n                $vertexName_G[size($vertexName_G)] = $pointPosName4;\n                string $test1_o[] = stringToStringArray($pointPosName1, \".\");\n                string $test2_o[] = stringToStringArray($pointPosName2, \".\");\n                string $test3_o[] = stringToStringArray($pointPosName3, \".\"); \n                string $test4_o[] = stringToStringArray($pointPosName4, \".\");\n                string $test1[] = stringToStringArray($test1_o[1], \"]\");\n                string $test2[] = stringToStringArray($test2_o[1], \"]\");\n                string $test3[] = stringToStringArray($test3_o[1], \"]\"); \n                string $test4[] = stringToStringArray($test4_o[1], \"]\");\n                if($test1[0]==\"vtx[\"+\"\\n\"||$test2[0]==\"vtx[\"+\"\\n\"||$test3[0]==\"vtx[\"+\"\\n\"||$test4[0]==\"vtx[\"+\"\\n\")\n                {\n                }else\n                {\n                    float  $pointPos1[] = `pointPosition -w $pointPosName1` ;\n                    float  $pointPos2[] = `pointPosition -w $pointPosName2` ;\n                    float  $pointPos3[] = `pointPosition -w $pointPosName3` ;\n                    float  $pointPos4[] = `pointPosition -w $pointPosName4` ;\n                    float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);\n                    if($faceArea<=$sizeUI)\n                    {\n                    }else {\n                        select -cl ;\n                        select -tgl $vName0 ;\n                        select -tgl $vName1 ;\n                        select -tgl $vName2 ;\n                        select -tgl $vName3 ;\n                        polySetToFaceNormal ;\n                        select -cl ;\n                        string $vName0_0=\"\";\n                        string $vName1_1=\"\";\n                        string $vName2_2=\"\";\n                        string $vName3_3=\"\";\n                        if(`radioButtonGrp -q -sl adia_Select`==1)\n                        {\n                            $vName0_0 =  $objectName[0]+\".vtxFace[\"+ $vertex[2] +\"][\"+(string)((int)($face[0])+1)  +\"]\";\n                            $vName1_1 =  $objectName[0]+\".vtxFace[\"+ $vertex[3] +\"][\"+(string)((int)($face[0])-1)  +\"]\";\n                            $vName2_2 =  $objectName[0]+\".vtxFace[\"+ $vertex[4] +\"][\"+(string)((int)($face[0])-1)  +\"]\";\n                            $vName3_3 =  $objectName[0]+\".vtxFace[\"+ $vertex[5] +\"][\"+(string)((int)($face[0])+1)  +\"]\";\n                        }else if(`radioButtonGrp -q -sl adia_Select`==2)\n                        {\n                            string $mesh = $objectName[0];\n                            string $localer[]= `spaceLocator -p 0 0 0`;\n                            move -r $pointPos1[0] $pointPos1[1] $pointPos1[2];\n                            string $cpom = `createNode closestPointOnMesh`;\n                            connectAttr -f ($mesh+\".outMesh\")($cpom+\".inMesh\");\n                            connectAttr -f ($localer[0]+\".translate\")($cpom+\".inPosition\");\n                            int $closestVert = `getAttr ($cpom + \".closestVertexIndex\")`;\n                            string $vertName = $mesh+\".vtx[\"+$closestVert+\"]\";\n                            $vName0_0 = $vertName;\n                            $vName1_1 = $vertName;\n                            $vName2_2 = $vertName;\n                            $vName3_3 = $vertName;\n                            delete $cpom;\n                            delete $localer[0];\n                        } \n                        if(catch(`select -tgl $vName0_0`)||catch(`ls -sl $vName0_0`))\n                        {\n                        }else{\n                            select -tgl $vName0;\n                            if(catch(`select -tgl $vName0_0`))\n                            {\n                            }else{\n                                select -tgl $vName0_0;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                            select -cl ;\n                            select -tgl $vName1;\n                            if(catch(`select -tgl $vName1_1`))\n                            {\n                            }else{\n                                select -tgl $vName1_1;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                            select -cl ;\n                            select -tgl $vName2;\n                            if(catch(`select -tgl $vName2_2`))\n                            {\n                            }else{\n                                select -tgl $vName2_2;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                            select -cl ;\n                            select -tgl $vName3;\n                            if(catch(`select -tgl $vName2_2`))\n                            {\n                            }else{\n                                select -tgl $vName3_3;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                        }\n                }\n                }\n            }\n            string $shorterList[] = stringArrayRemoveDuplicates($vertexName_G);\n            string $diff[] = stringArrayRemoveExact($shorterList,$vertexName_G);\n            for($each in $diff)\n            {\n                if(catch (`select -tgl $each`))\n                {\n                }\n                else\n                {\n                    select -cl;\n                    select -tgl $each ;\n                    polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                    select -cl;\n                }\n            }\n            if(catch(`select -r $objectName_G[0]`))\n            {\n            }else{select -r $objectName_G[0];}\n            for($ele in $element_G)\n            {\n                if(catch(`select -tgl $ele`))\n                {\n                    print(\"erro\");\n                }\n                else{\n                    select -add $ele;\n                }\n            }\n            print(\"succeed!\");\n        }\n        if(size($elementVertex)>0)\n        {\n            if(`radioButtonGrp -q -sl adia_Select`==3)\n            {\n                $vertexNormal_G = `polyNormalPerVertex -q -xyz $elementVertex[0]`;\n                print(\"Copy Value:\"+\"x:\"+ $vertexNormal_G[0]  +\"__y:\"+$vertexNormal_G[1]  +\"__z:\"+$vertexNormal_G[2]);\n            }else if(`radioButtonGrp -q -sl adia_Select`==4)\n            {\n                for($i=0;$i<size($elementVertex);$i++)\n                {\n                    polyNormalPerVertex -xyz $vertexNormal_G[0] $vertexNormal_G[1] $vertexNormal_G[2] $elementVertex[$i];\n                }\n                print(\"Successfully pasted normal information!\");\n            }\n        }\n        pause -sec 1;\n        clear $element_G;\n        clear $vertexName_G;\n        clear $objectName_G;\n    }\n    global proc Do3_1()\n    {\n        disableIncorrectNameWarning;\n        global string  $vertexName_G[];\n        global string $element_G[];\n        global string $objectName_G[]={};\n        global float $vertexNormal_G[]={};\n        string $selectList[];\n        $selectList = `ls -selection -flatten`;\n        string $element[];\n        $element = `filterExpand -expand on -selectionMask 34 $selectList`;\n        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;\n        for($ele in $element)\n        {\n            $element_G[size($element_G)] = $ele;\n        }\n        if(size($element)>0)\n        {\n            print(\"Executing...\");\n            for($i = 0 ; $i < size($element); $i++)\n            {\n                float $sizeUI = `floatFieldGrp -q -v1 adia_NormalValue`;\n                string $objectName[] = stringToStringArray($element[$i], \".\");\n                $objectName_G[0] = $objectName[0];\n                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; \n                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], \" \");\n                string $face[] = stringToStringArray($vertex[1],\":\");\n                string $vName0 =  $objectName[0]+\".vtxFace[\"+ $vertex[2] +\"][\"+$face[0]  +\"]\";\n                string $vName1 =  $objectName[0]+\".vtxFace[\"+ $vertex[3] +\"][\"+$face[0]  +\"]\";\n                string $vName2 =  $objectName[0]+\".vtxFace[\"+ $vertex[4] +\"][\"+$face[0]  +\"]\";\n                string $vName3 =  $objectName[0]+\".vtxFace[\"+ $vertex[5] +\"][\"+$face[0]  +\"]\";\n                string $pointPosName1 = $objectName[0]+\".vtx[\"+ $vertex[2] +\"]\";\n                string $pointPosName2 = $objectName[0]+\".vtx[\"+ $vertex[3] +\"]\";\n                string $pointPosName3 = $objectName[0]+\".vtx[\"+ $vertex[4] +\"]\";\n                string $pointPosName4 = $objectName[0]+\".vtx[\"+ $vertex[5] +\"]\";\n                $vertexName_G[size($vertexName_G)] = $pointPosName1;\n                $vertexName_G[size($vertexName_G)] = $pointPosName2;\n                $vertexName_G[size($vertexName_G)] = $pointPosName3;\n                $vertexName_G[size($vertexName_G)] = $pointPosName4;\n                string $test1_o[] = stringToStringArray($pointPosName1, \".\");\n                string $test2_o[] = stringToStringArray($pointPosName2, \".\");\n                string $test3_o[] = stringToStringArray($pointPosName3, \".\"); \n                string $test4_o[] = stringToStringArray($pointPosName4, \".\");\n                string $test1[] = stringToStringArray($test1_o[1], \"]\");\n                string $test2[] = stringToStringArray($test2_o[1], \"]\");\n                string $test3[] = stringToStringArray($test3_o[1], \"]\"); \n                string $test4[] = stringToStringArray($test4_o[1], \"]\");\n                if($test1[0]==\"vtx[\"+\"\\n\"||$test2[0]==\"vtx[\"+\"\\n\"||$test3[0]==\"vtx[\"+\"\\n\"||$test4[0]==\"vtx[\"+\"\\n\")\n                {\n                }else\n                {\n                    float  $pointPos1[] = `pointPosition -w $pointPosName1` ;\n                    float  $pointPos2[] = `pointPosition -w $pointPosName2` ;\n                    float  $pointPos3[] = `pointPosition -w $pointPosName3` ;\n                    float  $pointPos4[] = `pointPosition -w $pointPosName4` ;\n                    float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);\n                    if($faceArea>$sizeUI)\n                    {\n                        if(size($element_G)>1)\n                        {\n                            string $e[];\n                            $e[0] = $element[$i];\n                            $element_G = stringArrayRemove($e,$element_G);\n                        }\n                    }else {\n                        select -cl ;\n                        select -tgl $vName0 ;\n                        select -tgl $vName1 ;\n                        select -tgl $vName2 ;\n                        select -tgl $vName3 ;\n                        polySetToFaceNormal ;\n                        select -cl ;\n                        string $vName0_0=\"\";\n                        string $vName1_1=\"\";\n                        string $vName2_2=\"\";\n                        string $vName3_3=\"\";\n                        if(`radioButtonGrp -q -sl adia_Select`==1)\n                        {\n                            $vName0_0 =  $objectName[0]+\".vtxFace[\"+ $vertex[2] +\"][\"+(string)((int)($face[0])+1)  +\"]\";\n                            $vName1_1 =  $objectName[0]+\".vtxFace[\"+ $vertex[3] +\"][\"+(string)((int)($face[0])-1)  +\"]\";\n                            $vName2_2 =  $objectName[0]+\".vtxFace[\"+ $vertex[4] +\"][\"+(string)((int)($face[0])-1)  +\"]\";\n                            $vName3_3 =  $objectName[0]+\".vtxFace[\"+ $vertex[5] +\"][\"+(string)((int)($face[0])+1)  +\"]\";\n                        }else if(`radioButtonGrp -q -sl adia_Select`==2)\n                        {\n                            string $mesh = $objectName[0];\n                            string $localer[]= `spaceLocator -p 0 0 0`;\n                            move -r $pointPos1[0] $pointPos1[1] $pointPos1[2];\n                            string $cpom = `createNode closestPointOnMesh`;\n                            connectAttr -f ($mesh+\".outMesh\")($cpom+\".inMesh\");\n                            connectAttr -f ($localer[0]+\".translate\")($cpom+\".inPosition\");\n                            int $closestVert = `getAttr ($cpom + \".closestVertexIndex\")`;\n                            string $vertName = $mesh+\".vtx[\"+$closestVert+\"]\";\n                            $vName0_0 = $vertName;\n                            $vName1_1 = $vertName;\n                            $vName2_2 = $vertName;\n                            $vName3_3 = $vertName;\n                            delete $cpom;\n                            delete $localer[0];\n                        } \n                        if(catch(`select -tgl $vName0_0`)||catch(`ls -sl $vName0_0`))\n                        {\n                        }else{\n                            select -tgl $vName0;\n                            if(catch(`select -tgl $vName0_0`))\n                            {\n                            }else{\n                                select -tgl $vName0_0;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                            select -cl ;\n                            select -tgl $vName1;\n                            if(catch(`select -tgl $vName1_1`))\n                            {\n                            }else{\n                                select -tgl $vName1_1;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                            select -cl ;\n                            select -tgl $vName2;\n                            if(catch(`select -tgl $vName2_2`))\n                            {\n                            }else{\n                                select -tgl $vName2_2;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                            select -cl ;\n                            select -tgl $vName3;\n                            if(catch(`select -tgl $vName3_3`))\n                            {\n                            }else{\n                                select -tgl $vName3_3;\n                                polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                                select -cl ;\n                            }\n                        }\n                    }\n                }\n            }\n            if(`radioButtonGrp -q -sl adia_Select`==1)\n            {\n                string $vtxlist[] = `polyListComponentConversion -ff -tv $element_G`;\n                $vtxlist = `filterExpand -sm 31 -ex true $vtxlist`;\n                for($vtx in $vtxlist)\n                {\n                    string $faceList[] = `polyListComponentConversion -fv -tf $vtx`;\n                    $faceList =`filterExpand -sm 34 -ex true $faceList`;\n                    string $faceList2[] = stringArrayRemove($element,$faceList);\n                    float $avNormal[] = {0,0,0};\n                    int $i = 0;\n                    if(size($faceList2)==0)\n                    {\n                        $faceList2 = $faceList;\n                    }\n                    for($ff in $faceList2)\n                    {\n                        string $nrm[] = `polyInfo -faceNormals $ff`;\n                        string $tkBuf[];\n                        float $tNml[] = {0,0,0};\n                        tokenize $nrm[0] \" \" $tkBuf;\n                        $tNml[0]+=((float)($tkBuf[2]));\n                        $tNml[1]+=((float)($tkBuf[3]));\n                        $tNml[2]+=((float)($tkBuf[4]));\n                        $avNormal[0] += $tNml[0];\n                        $avNormal[1] += $tNml[1];\n                        $avNormal[2] += $tNml[2];\n                        $i++;\n                    }\n                    if($i)\n                    {\n                        $avNormal[0] = $avNormal[0]/$i;\n                        $avNormal[1] = $avNormal[1]/$i;\n                        $avNormal[2] = $avNormal[2]/$i;\n                        normalize($avNormal);\n                        polyNormalPerVertex -xyz $avNormal[0] $avNormal[1] $avNormal    [2] $vtx;\n                    }\n                }\n            }\n            string $shorterList[] = stringArrayRemoveDuplicates($vertexName_G);\n            string $diff[] = stringArrayRemoveExact($shorterList,$vertexName_G);\n            if(size($diff)>0)\n            {\n                for($each in $diff)\n                {\n                    string $check[]={};\n                    tokenize $each \"vtx[\" $check;\n                    if($check[1]!=\"\\n\"+\"]\")\n                    {\n                        if(catch (`select -tgl $each`))\n                        {\n                        }\n                        else\n                        {\n                            select -cl;\n                            select -tgl $each ;\n                            polyAverageNormal -prenormalize 1 -allowZeroNormal 0 -postnormalize 0 -distance 0.1 -replaceNormalXYZ 1 0 0 ;\n                            select -cl;\n                        }\n                    }\n                }\n                if(catch(`select -r $objectName_G[0]`))\n                {\n                }else{select -r $objectName_G[0];}\n                for($ele in $element_G)\n                {\n                    if(catch(`select -tgl $ele`))\n                    {\n                        print(\"erro\");\n                    }\n                    else{\n                        select -add $ele;\n                    }\n                }\n            }\n            print(\"succeed!\");\n        }\n        if(size($elementVertex)>0)\n        {\n            if(`radioButtonGrp -q -sl adia_Select`==3)\n            {\n                $vertexNormal_G = `polyNormalPerVertex -q -xyz $elementVertex[0]`;\n                print(\"Copy Value:\"+\"x:\"+ $vertexNormal_G[0]  +\"__y:\"+$vertexNormal_G[1]  +\"__z:\"+$vertexNormal_G[2]);\n            }else if(`radioButtonGrp -q -sl adia_Select`==4)\n            {\n                for($i=0;$i<size($elementVertex);$i++)\n                {\n                    polyNormalPerVertex -xyz $vertexNormal_G[0] $vertexNormal_G[1] $vertexNormal_G[2] $elementVertex[$i];\n                }\n                print(\"Successfully pasted normal information!\");\n            }\n        }\n        pause -sec 1;\n        clear $element_G;\n        clear $vertexName_G;\n        clear $objectName_G;\n    }\n    global proc Do3_2()\n    {\n        disableIncorrectNameWarning;\n        global string  $vertexName_G[];\n        global string $element_G[];\n        global string $objectName_G[]={};\n        global float $vertexNormal_G[]={};\n        string $selectList[];\n        $selectList = `ls -selection -flatten`;\n        string $element[];\n        $element = `filterExpand -expand on -selectionMask 34 $selectList`;\n        $elementVertex = `filterExpand -expand on -selectionMask 31 -selectionMask 70 $selectList`;\n        for($ele in $element)\n        {\n            $element_G[size($element_G)] = $ele;\n        }\n        if(size($element)>0)\n        {\n            print(\"Executing...\");\n            for($i = 0 ; $i < size($element); $i++)\n            {\n                float $sizeUI = `floatFieldGrp -q -v1 adia_NormalValue`;\n                string $objectName[] = stringToStringArray($element[$i], \".\");\n                $objectName_G[0] = $objectName[0];\n                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[$i]`; \n                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], \" \");\n                string $face[] = stringToStringArray($vertex[1],\":\");\n                string $vName0 =  $objectName[0]+\".vtxFace[\"+ $vertex[2] +\"][\"+$face[0]  +\"]\";\n                string $vName1 =  $objectName[0]+\".vtxFace[\"+ $vertex[3] +\"][\"+$face[0]  +\"]\";\n                string $vName2 =  $objectName[0]+\".vtxFace[\"+ $vertex[4] +\"][\"+$face[0]  +\"]\";\n                string $vName3 =  $objectName[0]+\".vtxFace[\"+ $vertex[5] +\"][\"+$face[0]  +\"]\";\n                string $pointPosName1 = $objectName[0]+\".vtx[\"+ $vertex[2] +\"]\";\n                string $pointPosName2 = $objectName[0]+\".vtx[\"+ $vertex[3] +\"]\";\n                string $pointPosName3 = $objectName[0]+\".vtx[\"+ $vertex[4] +\"]\";\n                string $pointPosName4 = $objectName[0]+\".vtx[\"+ $vertex[5] +\"]\";\n                $vertexName_G[size($vertexName_G)] = $pointPosName1;\n                $vertexName_G[size($vertexName_G)] = $pointPosName2;\n                $vertexName_G[size($vertexName_G)] = $pointPosName3;\n                $vertexName_G[size($vertexName_G)] = $pointPosName4;\n                string $test1_o[] = stringToStringArray($pointPosName1, \".\");\n                string $test2_o[] = stringToStringArray($pointPosName2, \".\");\n                string $test3_o[] = stringToStringArray($pointPosName3, \".\"); \n                string $test4_o[] = stringToStringArray($pointPosName4, \".\");\n                string $test1[] = stringToStringArray($test1_o[1], \"]\");\n                string $test2[] = stringToStringArray($test2_o[1], \"]\");\n                string $test3[] = stringToStringArray($test3_o[1], \"]\"); \n                string $test4[] = stringToStringArray($test4_o[1], \"]\");\n                if($test1[0]==\"vtx[\"+\"\\n\"||$test2[0]==\"vtx[\"+\"\\n\"||$test3[0]==\"vtx[\"+\"\\n\"||$test4[0]==\"vtx[\"+\"\\n\")\n                {\n                    string $e[];\n                    $e[0] = $element[$i];\n                    $element_G = stringArrayRemove($e,$element_G);\n                }else\n                {\n                    float  $pointPos1[] = `pointPosition -w $pointPosName1` ;\n                    float  $pointPos2[] = `pointPosition -w $pointPosName2` ;\n                    float  $pointPos3[] = `pointPosition -w $pointPosName3` ;\n                    float  $pointPos4[] = `pointPosition -w $pointPosName4` ;\n                    float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);\n                    if($faceArea>$sizeUI)\n                    {\n                        if(size($element_G)>0)\n                        {\n                            string $e[];\n                            $e[0] = $element[$i];\n                            $element_G = stringArrayRemove($e,$element_G);\n                        }\n                    }\n                }\n            }\n            select -cl;\n            for($ele in $element_G)\n            {\n                if(catch(`select -tgl $ele`))\n                {\n                    print(\"erro\");\n                }\n                else{\n                    select -add $ele;\n                }\n            }\n            pause -sec 1;\n            clear $element_G;\n            clear $vertexName_G;\n            clear $objectName_G;\n            print(\"succeed!\");\n        }\n    }\n    global proc Do4()\n    {\n        string $selectList[];\n        $selectList = `ls -selection -flatten`;\n        string $element[];\n        $element = `filterExpand -expand on -selectionMask 34 $selectList`;\n        if(size($element)==1)\n        {\n                string $objectName[] = stringToStringArray($element[0], \".\");\n                string $sFaceVertexNormal[]=`polyInfo -faceToVertex $element[0]`; \n                string $vertex[] = stringToStringArray($sFaceVertexNormal[0], \" \");\n                string $face[] = stringToStringArray($vertex[1],\":\");\n                string $vName0 =  $objectName[0]+\".vtxFace[\"+ $vertex[2] +\"][\"+$face[0]  +\"]\";\n                string $vName1 =  $objectName[0]+\".vtxFace[\"+ $vertex[3] +\"][\"+$face[0]  +\"]\";\n                string $vName2 =  $objectName[0]+\".vtxFace[\"+ $vertex[4] +\"][\"+$face[0]  +\"]\";\n                string $pointPosName1 = $objectName[0]+\".vtx[\"+ $vertex[2] +\"]\";\n                string $pointPosName2 = $objectName[0]+\".vtx[\"+ $vertex[3] +\"]\";\n                string $pointPosName3 = $objectName[0]+\".vtx[\"+ $vertex[4] +\"]\";\n                float  $pointPos1[] = `pointPosition -l $pointPosName1` ;\n                float  $pointPos2[] = `pointPosition -l $pointPosName2` ;\n                float  $pointPos3[] = `pointPosition -l $pointPosName3` ;\n                float $faceArea = adia_CountArea($pointPos1,$pointPos2,$pointPos3);\n                floatFieldGrp -e -v1 $faceArea adia_NormalValue2;\n        }\n    }\n    global proc matrix myWG_CreateVecMatrix(float $x, float$y, float$z)\n    {\n        matrix $mRes_Mtx[1][4]=<<$x,$y,$z,0>>;\n        return($mRes_Mtx);\n    }\n    global proc matrix adia_GetObjectMatrix(string $objectName)\n    {\n        float $objectMatrix[] = `getAttr ($objectName+\".inverseMatrix\")`;\n        matrix $objectMatrixInfo4x4[4][4]=<<\n        $objectMatrix[0],$objectMatrix[4],$objectMatrix[8],$objectMatrix[12];\n        $objectMatrix[1],$objectMatrix[5],$objectMatrix[9],$objectMatrix[13];\n        $objectMatrix[2],$objectMatrix[6],$objectMatrix[10],$objectMatrix[14];\n        $objectMatrix[3],$objectMatrix[7],$objectMatrix[11],$objectMatrix[15]\n        >>;\n        return($objectMatrixInfo4x4);\n    }\n    global proc matrix adia_ObjectSpaceToWorldSpace(matrix $in_matrix,string $objectName)\n    {\n        matrix $objectMatrixInfo4x4[4][4] = adia_GetObjectMatrix($objectName);\n        matrix $Out_Matrix[1][4]=$in_matrix * $objectMatrixInfo4x4;\n        return($Out_Matrix);\n    }\n    global proc float adia_CountArea(float $a[], float $b[],float $c[])\n    {\n        float $area = -1;\n        float $side[3];\n        $side[0] = sqrt(pow($a[0]-$b[0],2)+pow($a[1]-$b[1],2)+pow($a[2]-$b[2],2));\n        $side[1] = sqrt(pow($a[0]-$c[0],2)+pow($a[1]-$c[1],2)+pow($a[2]-$c[2],2));\n        $side[2] = sqrt(pow($c[0]-$b[0],2)+pow($c[1]-$b[1],2)+pow($c[2]-$b[2],2));\n        if($side[0]+$side[1]<=$side[2]||$side[0]+$side[2]<=$side[1]||$side[1]+$side[2]<=$side[0])\n        {\n            return $area; \n        }\n        //s=sqr(p*(p-a)(p-b)(p-c));\n        float $p = ($side[0]+$side[1]+$side[2])/2;\n        $area = sqrt($p*($p-$side[0])*($p-$side[1])*($p-$side[2]));\n        return $area*2;\n    }\n    VertexNormalSort();\n    ";
for($s in $shelves)
{
    if($s=="Adia_Tools")
    {
        string $shelfButtons[] = `shelfLayout -q -childArray "Adia_Tools"`;
        for($b in $shelfButtons)
        {
            string $label;
            if(`objectTypeUI -isType "shelfButton" $b`)
            {
                $label = `shelfButton -q -label $b`;
                if($label==$buttonLab)
                {
                    $btmCounter++;
                    if($btmCounter>1)
                    {
                        deleteUI $b;
                    }   
                }
                else{
                deleteUI $b;
                string $myButton = `shelfButton
                -parent "Adia_Tools"           
                -enable 1
                -width 34
                -height 34
                -manage 1
                -visible 1
                -annotation $buttonAnnotation
                -label $buttonLab
                -image1 $imageSet
                -style "iconOnly"
                -command $script`;
                }
            }
        }
        if(size($shelfButtons)==0)
        {
            string $myButton = `shelfButton
            -rpt true
            -parent "Adia_Tools"           
            -enable 1
            -width 34
            -height 34
            -manage 1
            -visible 1
            -annotation $buttonAnnotation
            -label $buttonLab
            -image1 $imageSet
            -style "iconOnly"
            -command  $script`;
        }
        //saveShelf $s ($tempDir + "Adia_Tools");
    }else{
        $counter++;
        if($counter==size($shelves))
        {
            addNewShelfTab "Adia_Tools";
            string $myButton = `shelfButton
            -rpt true
            -parent "Adia_Tools"           
            -enable 1
            -width 34
            -height 34
            -manage 1
            -visible 1
            -annotation $buttonAnnotation
            -label $buttonLab
            -image1 $imageSet
            -style "iconOnly"
            -command  $script`;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值