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
)