Inequitable chain tools (maxscript)

macroScript InequitableChainTools
    category:"MaryryCoScript"
    toolTip:"A line and bones, that all you need"
    icon:#("NURBSCurve", 2)


(
    
    -- -- warming error message 1
    rollout missLine "Missing Line" width:154 height:83
    (
        label 'lbl_errorline' "There is no line selected" pos:[16,16] width:146 height:14 align:#left
        button 'btn_okline' "OK" pos:[62,49] width:32 height:16 align:#left
        
        on btn_okline pressed do
        (
        try (destroydialog missLine) catch()
        )
    )
        
    -- -- warming error message 2
    rollout missBone "Missing Line" width:282 height:89
    (
        label 'lbl_errorbone' "Problem with the bones: please select them or rename them without space" pos:[16,16] width:255 height:30 align:#left
        button 'btn_okbone' "OK" pos:[128,60] width:32 height:16 align:#left
        
        on btn_okbone pressed do
        (
        try (destroydialog missBone) catch()
        )
    )

    -- -- presentation
    rollout IKTen "IK" width:370 height:530
    (
        --filter all objects of class Box:
        fn line_filt objL = classof objL == line
        fn bone_filt objB =  classof objB == bones
        
        
        button 'ButtonBone' "Select Bones" pos:[70,27] width:224 height:30 filter:bone_filt align:#left 
     
        button 'ButtonDelBone' "Delete Bones" pos:[51,172] width:101 height:24 align:#left
        button 'ButtonResetBone' "Reset Bones" pos:[219,173] width:102 height:22 align:#left
        pickbutton 'PickLine' "Select Line" pos:[73,212] width:224 height:30 filter:line_filt align:#left
        listbox 'Bon' "Bones" pos:[36,59] width:302 height:6 align:#left 
     
        edittext 'basename' "tape base name object here" pos:[24,262] width:321 height:19 align:#left 
     
        button 'ButtonDo' "Do IK" pos:[73,467] width:224 height:30 align:#left
        checkbutton 'CheckFK' "Controle FK" pos:[65,330] checked:true width:90 height:30 align:#left
        checkbutton 'Checktwi' "Twist Start/End" pos:[222,330] checked:true width:90 height:30 align:#left
        checkbutton 'Checkrot' "Rot. by Bones" pos:[222,380] checked:true width:90 height:30 align:#left
        checkbutton 'CheckrotIK' "Rot. with IK"  pos:[65,380] checked:true width:90 height:30 align:#left
        
        groupBox 'GroupOptions' "Options" pos:[12,309] width:346 height:119 align:#left
        
        global bSel
        
        on ButtonBone pressed do
        (
            bSel = selection
            for i in bSel do
            (
                Bon.items = append Bon.items (i as string)
            )
            print Bon.items
        )
        on ButtonDelBone pressed do
        (
            (
              --Check whether there are any items left and there is a valid selection. --Then delete the current item. DeleteItem returns the resulting array, --so you can assign the result directly to the .items property
              if Bon.items.count > 0 and Bon.selection > 0 do
                Bon.items = deleteItem Bon.items Bon.selection
            )
        )
        on ButtonResetBone pressed do
        (
            (
               -- reset the selection
                Bon.items = #()
            )
        )
        on PickLine picked objL do
        (
            --see if the user did not cancel the picking...
            if objL != undefined do
            (
            --if he did not, make the line's wireframe red:
            objL.wirecolor = red
            --and display the name of the object on the button:
            PickLine.text = objL.name
            )
        )
        on ButtonDo pressed do
        (
            if Bon.items.count>0 do
            (
                Bon_ = #()
                for i in Bon.items do
                (
                    -- search for the name of the bones selected
                    name_ = i
                    Tokens = ":"
                    name_ = filterString name_ tokens splitEmptyTokens:false
                    Tokens = " "
                    name_ = filterString name_[2] tokens splitEmptyTokens:false
                    append Bon_ (getnodebyname name_[1])
                )
            )
        
            base = basename.text
            Line_ = (getnodebyname PickLine.text)
            Bones_name = (base + "_B_")
            
             -- -- rename onject selectionned and creat Rig
            if Line_ != undefined then 
            (
                Line_.name = (base + "_H_IkSpline") 
                
                if Bon.items != undefined then
                (
                    for i = 1 to Bon_.count do 
                    (
                        if Bon_[i] != undefined then
                        (                
                            if i>=10 then 
                            (
                                print (Bones_name + (i as string)) 
                                Bon_[i].name = (Bones_name + (i as string)) 
                            )
                                
                            else 
                            (
                                print (Bones_name + "0" +(i as string))
                                Bon_[i].name = (Bones_name + "0" +(i as string))    
                            )
                        )
                    )
                    
                    
                -- -- creation de toutes les listes utilisé dans le script
                        Pts = #()                            -- Les bones de ligne
                        CtrIK = #()                        -- Les controlleur IK
                        ConsIK = #()                        -- constant sur les controlleur IK
                        ZeroIK = #()                            -- zero des controller IK
                        Ctrln = (numknots Line_ 1)    -- nombre de point sur la ligne
                        Helpers_ = #()                    -- les point comprenant les contraintes des bones
                        HelConst = #()                    --ce qui recoivent les paramWire.co
                        HelpDis = #()                        -- la distance entre le 1er point d'attache et touts les autres
                        ptsDis = #()                        -- la distance des différent controleur de la ligne
                        
                        -- -- recuperation des longueur
                        Long = #()
                        Line_Size = distance Bon_[1] Bon_[Bon_.count]
                        print Line_Size
        
        --                 -- -- parent Point
                        ParentHelp = point()
                        parentHelp.wirecolor = gray
                        ParentHelp.box = true
                        ParentHelp.size = 10
                        ParentHelp.cross = false
                        ParentHelp.name = (base + "_H_IKParent")
                        
                        ParentZero = point()
                        ParentZero.wirecolor = brown
                        ParentZero.box = true
                        ParentZero.size = 0.001
                        ParentZero.cross = false
                        ParentZero.name = (base + "_H_IKParent_Zero")
                        
                        ParentCtrl = circle()
                        ParentCtrl.wirecolor = red
                        ParentCtrl.name = ( base + "_C_IKParent")
                        ParentCtrl.radius = 20
                        ParentCtrl.steps = 2
                                    rotate ParentCtrl (angleaxis 90 [0,1,0])
                                    resetXform ParentCtrl
                                    convertTo ParentCtrl SplineShape    
                                    
                        
                        ParentCtrl.parent =ParentZero
                        ParentHelp.parent = ParentCtrl
                        ParentZero.transform = Bon_[1].transform
                        print Bon_[1]
                        
                        if Checkrot.state == true then
                        (
                            for i=0 to (Bon_.count-1) do 
                            (
        
            --                 -- -- Calcule des longueurs pour le pathcontrainte
                                append Long ( distance Bon_[1] Bon_[i+1])
                                print Long
        
                            -- -- creation des point et de la contrainte position
                                Help = point ()
                                Help.wirecolor = white
                                Help.box = true
                                Help.size = 2.5
                                Help.cross = false
                                if i<10 then Help.name = (base + "_H_Line_0"+((i) as string)) else Help.name = (base + "_H_Line_"+((i) as string))    
                                Help.transform = Bon_[i+1].transform
                                Bon_[i+1].pos.controller = Position_Constraint ()
                                Bon_[i+1].position.controller.appendTarget Help 100
                                append Helpers_ (Help)
                                
            --                 -- --creation des controleurs + Const
                                HelC = circle()
                                HelC.wirecolor = yellow
                                HelC.steps = 2
                                HelC.radius = 5
                                if i<10 then HelC.name = (base + "_C_Bone_0"+ ( i as string )) else HelC.name = (base + "_C_Bone_"+ ( i as string ))
                                        rotate HelC (angleaxis 90 [0,1,0])
                                        resetXform HelC
                                        convertTo HelC SplineShape    
                                HelC.transform = Help.transform
                                     
                                HelCon = point()
                                HelCon.wirecolor = gray
                                HelCon.box = true
                                HelCon.size = 7.5
                                HelCon.cross = false
                                if i<10 then HelCon.name = (base + "_H_Bone_0"+ ( i as string )+"_CONST")

                                else HelCon.name = (base + "_H_Bone_"+ ( i as string )+"_CONST")


                                HelCon.transform = Help.transform
                                
                                HelZ = point()
                                HelZ.wirecolor = brown
                                HelZ.box = true
                                HelZ.size = 0.001
                                HelZ.cross = false
                                if i<10 then HelZ.name = (base + "_H_Bone_0"+ ( i as string ) + "_ZERO")

                                else HelZ.name = (base + "_H_Bone_"+ ( i as string )+ "_ZERO")


                                HelZ.transform = Help.transform
                                
                                Help.parent = HelC
                                HelC.parent = HelCon
                                HelCon.parent =HelZ
                                HelZ.parent = ParentHelp
                                
                                
                                append HelConst (HelCon)
                            )
                        )    
                        else
                        (
                            for i=0 to (Bon_.count-1) do 
                            (
                                
            --                 -- -- Calcule des longueurs pour le pathcontrainte
                                
                                append Long ( distance Bon_[1] Bon_[i+1])
                                print Long
                                
                            -- -- creation des point et de la contrainte position
                                Help = point ()
                                Help.box = true
                                Help.size = 2.5
                                Help.cross = false
                                if i<10 then Help.name = (base + "_H_Line_0"+((i) as string)) else Help.name = (base + "_H_Line_"+((i) as string))    
                                Help.transform = Bon_[i+1].transform
                                Bon_[i+1].pos.controller = Position_Constraint ()
                                Bon_[i+1].position.controller.appendTarget Help 100
                                append Helpers_ (Help)
                                
            --                 -- --creation des controleurs + Const    
                                HelCon = point()
                                HelCon.box = true
                                HelCon.size = 7.5
                                HelCon.cross = false
                                if i<10 then HelCon.name = (base + "_H_Bone_0"+ ( i as string )+"_CONST")

                                else HelCon.name = (base + "_H_Bone_"+ ( i as string )+"_CONST")


                                HelCon.transform = Help.transform
            --                         
                                HelZ = point()
                                HelZ.box = true
                                HelZ.size = 0.001
                                HelZ.cross = false
                                if i<10 then HelZ.name = (base + "_H_Bone_0"+ ( i as string ) + "_ZERO")

                                else HelZ.name = (base + "_H_Bone_"+ ( i as string )+ "_ZERO")


                                HelZ.transform = Help.transform
            --                     
                                Help.parent = HelCon
                                HelCon.parent =HelZ
                                HelZ.parent = ParentHelp
                                
                                append HelConst (HelCon)
                            )    
                            
                        )
        
        --                 -- -- Contrainte look at
                        for i=1 to (Bon_.count-1) do 
                        (
                            Bon_[i].rotation.controller = LookAt_Constraint ()
                            Bon_[i].rotation.controller.appendTarget Helpers_[i+1] 100
                            Bon_[i].rotation.controller.lookat_vector_length=0
                            Bon_[i].rotation.controller.pickupnode=Helpers_[i]
                            Bon_[i].rotation.controller.upnode_world=false
                        )
        
        --                 -- -- Parent Helpers et pathContraint
                        for i=1 to (HelConst.count) do
                        (    
                            HelConst[i].pos.controller=position_list()
                            HelConst[i].pos.controller.Available.controller = path_constraint()
                            HelConst[i].pos.controller[#path_constraint].appendTarget Line_ 100
                            deletekeys HelConst[i].pos.controller[#path_constraint].percent.controller
                            HelConst[i].pos.controller[#path_constraint].percent = ( ((Long[i]/Line_Size)*100) as float )
                            HelConst[i].pos.controller.Available.controller = position_XYZ()
                            HelConst[i].pos.controller.setActive 3

                        )
        --                 -- -- Creation de l'IK control. Il prend en compte le nombre de points et la distance sur la ligne
                        addmodifier Line_ (Spline_IK_Control ()) 
                        Line_.modifiers[1].noLinking()
        
        --                 --creation des differents controlleur de la ligne en suivant les positions des point de la ligne
                        for i=1 to Ctrln do
                        (
                            CtrB = point()
                            CtrB.wirecolor = white
                            CtrB.box = true
                            CtrB.size = 5
                            CtrB.cross = false
                            if i<10 then CtrB.name = (base + "_B_IK_0"+ ( i as string )) else CtrB.name = (base + "_B_IK_"+ ( i as string ))
                            test=(i+(2*(i-1))+1)
                            
                            pos = getPointPos Line_ test
                            
                            Ctr = Rectangle()
                            Ctr.wirecolor = blue
                            Ctr.length = 20
                            Ctr.width = 20
                            if i<10 then Ctr.name = (base + "_C_IK_0"+ ( i as string )) else Ctr.name = (base + "_C_IK_"+ ( i as string ))
                                    rotate Ctr (angleaxis 90 [0,1,0])
                                    resetXform Ctr
                                    convertTo Ctr SplineShape    
                                
                            CtrCon = point()
                            CtrCon.wirecolor = gray
                            CtrCon.box = true
                            CtrCon.size = 7.5
                            CtrCon.cross = false
                            if i<10 then CtrCon.name = (base + "_H_IK_0"+ ( i as string )+"_CONST")

                            else CtrCon.name = (base + "_H_IK_"+ ( i as string )+"_CONST")
        
                            CtrZ = point()
                            CtrZ.wirecolor = brown
                            CtrZ.box = true
                            CtrZ.size = 0.001
                            CtrZ.cross = false
                            if i<10 then CtrZ.name = (base + "_H_IK_0"+ ( i as string ) + "_ZERO")

                            else CtrZ.name = (base + "_H_IK_"+ ( i as string )+ "_ZERO")
        
                            CtrB.position = pos
                            Ctr.transform = CtrB.transform
                            CtrCon.transform = CtrB.transform
                            CtrZ.transform = CtrB.transform
                            Ctr.parent = CtrCon
                            CtrCon.parent = CtrZ
                            CtrB.parent = Ctr
                            append Pts (CtrB)
                            append CtrIK (Ctr)
                            append ConsIK (CtrCon)
                            append ZeroIK (CtrZ)
                            CtrZ.parent = ParentHelp
                        )
                        
        --                 -- -- ajout des point de ctrl a l'IK control
                        Line_.modifiers[1].helper_list = Pts
                        
                        
                        if Checktwi.state == true then 
                        (
            --                 -- -- ajout des controller pour les rotation general    
                                ctrlf  = circle()
                                ctrlf.wirecolor = orange
                                ctrlf.radius = 10
                                ctrlf.steps = 2
                                ctrlf.name = (base + "_C_Rot_Base")
                                        rotate ctrlf (angleaxis 90 [0,1,0])
                                        resetXform ctrlf
                                        convertTo ctrlf SplineShape    
                                
                                CtrfZ = point()
                                CtrfZ.wirecolor = brown
                                CtrfZ.box = true
                                CtrfZ.size = 0.001m
                                CtrfZ.cross = false
                                CtrfZ.name = (base + "_H_Rot_Base_ZERO")
                                
                                Ctr = CtrIK[1]
                                ctrlf.transform = CtrIK[1].transform
                                CtrfZ.transform = CtrIK[1].transform
                                ctrlf.parent = CtrfZ
                                CtrfZ.parent = CtrIK[1]
                                print CtrIK[1]
                                
                                ctrll = circle()
                                ctrll.wirecolor = orange
                                ctrll.radius = 10
                                ctrll.steps = 2
                                ctrll.name = (base + "_C_Rot_Pointe")
                                        rotate ctrll (angleaxis 90 [0,1,0])
                                        resetXform ctrll
                                        convertTo ctrll SplineShape    
                                        
                                CtrlZ = point()
                                CtrlZ.wirecolor = brown
                                CtrlZ.box = true
                                CtrlZ.size = 0.001m
                                CtrlZ.cross = false
                                CtrlZ.name = (base + "_H_Rot_Pointe_ZERO")
                                
                                ctr = CtrIK[1]
                                ctrll.transform = CtrIK[CtrIK.count].transform
                                CtrlZ.transform = CtrIK[CtrIK.count].transform
                                ctrll.parent = CtrlZ
                                CtrlZ.parent = CtrIK[CtrIK.count]
                                
                                
            --                 -- --rotation avec le 1er et dernier controller
                            for i=1 to HelConst.count do
                            (
                                Hel = HelConst[i]
                                Dis = Long[i]
                                
                                Hel.rotation.controller.X_rotation.controller= float_list ()
                                
                                paramwire.connect ctrlf.rotation.controller[#X_Rotation] Hel.rotation.controller.X_rotation.controller[#Available] ("X_Rotation*(1-("+ (Dis as string) +"/" + (Line_Size as string) +"))")
                                Hel.rotation.controller.X_rotation.controller.setname 2 "RotBase"
                                paramwire.connect ctrll.rotation.controller[#X_Rotation] Hel.rotation.controller.X_rotation.controller[#Available] ("X_Rotation*(("+ (Dis as string) +"/" + (Line_Size as string) +"))")
                                Hel.rotation.controller.X_rotation.controller.setname 3 "RotPointe"
                            )
                            
                        )
                            
                        if CheckrotIK.state == true then
                        (
                            if Checktwi.state == true then
                            (
                --                 --  --calcule des distances entre le 1er points et les points
                                for i=1 to (Ctrln) do append ptsDis (distance (getKnotPoint Line_ 1 1) (getKnotPoint Line_ 1 i))
                                
                --                 -- --calcule des distances entre le 1er helpers et les autres
                                for i=1 to (HelConst.count) do append HelpDis (distance HelConst[1] HelConst[i])
                --                     --rotation par controlleur individuel 
                                for d=1 to (CtrIK.count-1) do
                                (
                                    CAv = CtrIK[d]
                                    CAp = CtrIK[d+1]
                                    for i=1 to (Helpers_.count) do
                                    (
                                        if HelpDis[i] >= PtsDis[d] then 
                                        (
                                            if HelpDis[i] <= PtsDis[d+1] then
                                            (
                                                if HelpDis[i] != undefined then
                                                (
                                                    paramwire.connect CAv.rotation.controller[#X_Rotation] HelConst[i].rotation.controller.X_rotation.controller[#Available] ("X_Rotation*(1-("+ (((HelpDis[i]) - (PtsDis[d])) as string) +"/" + (((PtsDis[d+1]) - (PtsDis[d] )) as string) +"))")
                                                    HelConst[i].rotation.controller.X_rotation.controller.setname 4 "Ctrav"
                                                    paramwire.connect CAp.rotation.controller[#X_Rotation] HelConst[i].rotation.controller.X_rotation.controller[#Available] ("X_Rotation*(("+ ((HelpDis[i]-PtsDis[d]) as string ) +"/" + ((PtsDis[d+1]-PtsDis[d] ) as string) +"))")
                                                    HelConst[i].rotation.controller.X_rotation.controller.setname 5 "Ctrap"
                                                )
                                            )
                                        )
                                        else print "0"
                                    )
        
                                )
                            )
                            else
                            (
                                            --                 --  --calcule des distances entre le 1er points et les points
                                for i=1 to (Ctrln) do append ptsDis (distance (getKnotPoint Line_ 1 1) (getKnotPoint Line_ 1 i))
                                
                --                 -- --calcule des distances entre le 1er helpers et les autres
                                for i=1 to (HelConst.count) do append HelpDis (distance HelConst[1] HelConst[i])
                --                     --rotation par controlleur individuel 
                                for d=1 to (CtrIK.count-1) do
                                (
                                    CAv = CtrIK[d]
                                    CAp = CtrIK[d+1]
                                    for i=1 to (Helpers_.count) do
                                    (
                                        if HelpDis[i] >= PtsDis[d] then 
                                        (
                                            if HelpDis[i] <= PtsDis[d+1] then
                                            (
                                                if HelpDis[i] != undefined then
                                                (
                                                    HelConst[i].rotation.controller.X_rotation.controller= float_list ()
                                                    
                                                    paramwire.connect CAv.rotation.controller[#X_Rotation] HelConst[i].rotation.controller.X_rotation.controller[#Available] ("X_Rotation*(1-("+ (((HelpDis[i]) - (PtsDis[d])) as string) +"/" + (((PtsDis[d+1]) - (PtsDis[d] )) as string) +"))")
                                                    HelConst[i].rotation.controller.X_rotation.controller.setname 2 "Ctrav"
                                                    paramwire.connect CAp.rotation.controller[#X_Rotation] HelConst[i].rotation.controller.X_rotation.controller[#Available] ("X_Rotation*(("+ ((HelpDis[i]-PtsDis[d]) as string ) +"/" + ((PtsDis[d+1]-PtsDis[d] ) as string) +"))")
                                                    HelConst[i].rotation.controller.X_rotation.controller.setname 3 "Ctrap"
                                                )
                                            )
                                        )
                                        else print "0"
                                    )
        
                                )
                            )
                        )
                            
                        if CheckFK.state == true then 
                        (
                            Aft = #()
                            Zer = #()
                            
                            for i=1 to CtrIK.count do
                            (
                                RotC = circle()
                                RotC.wirecolor = green
                                RotC.steps = 1
                                RotC.radius = 14
                                if i<10 then RotC.name = (base+ "_C_FK_0"+ ( i as string )) else RotC.name = (base+"_C_FK_"+ ( i as string ))
                                        rotate RotC (angleaxis 90 [0,1,0])
                                        resetXform RotC
                                        convertTo RotC SplineShape
                                
                                ZRotC = point()
                                ZRotC.wirecolor = brown
                                ZRotC.box = true
                                ZRotC.size = 0.001
                                ZRotC.cross = false
                                if i<10 then ZRotC.name = (base + "_H_FK_0"+ ( i as string ) + "_ZERO") else ZRotC.name = (base + "_H_FK_"+ ( i as string )+ "_ZERO")
                                
                                RotC.transform = CtrIK[i].transform
                                ZRotC.transform = RotC.transform
                                RotC.parent = ZRotC
                                
                                append Aft RotC
                                append Zer ZRotC
                                
            
                                
                                Zer[1].parent = ParentCtrl    
                            )
            
                            -- print Zer
            
                            for i=1 to (CtrIK.count-1) do
                            (
                                Zer[i+1].parent = Aft[i]
                                ZeroIK[i].parent = Aft[i]
                                ZeroIK[CtrIK.count].parent = Aft[CtrIK.count]
                            )
                        )
                    
                    destroydialog IKTen
                )
                
                else createdialog missBone
                
            )
            else createdialog missLine
            
        )
    )
    Createdialog IKTen
)