Last active
July 13, 2018 22:35
-
-
Save miquelcampos/435104bc613b9c58ed2b0fda4760e908 to your computer and use it in GitHub Desktop.
mGear shifter vanilla Limb 01
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MGEAR is under the terms of the MIT License | |
# Copyright (c) 2016 Jeremie Passerin, Miquel Campos | |
# Permission is hereby granted, free of charge, to any person obtaining a copy | |
# of this software and associated documentation files (the "Software"), to deal | |
# in the Software without restriction, including without limitation the rights | |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
# copies of the Software, and to permit persons to whom the Software is | |
# furnished to do so, subject to the following conditions: | |
# The above copyright notice and this permission notice shall be included in all | |
# copies or substantial portions of the Software. | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
# SOFTWARE. | |
############################################# | |
# GLOBAL | |
############################################# | |
# Maya | |
import pymel.core as pm | |
import pymel.core.datatypes as dt | |
# mgear | |
from mgear.maya.shifter.component import MainComponent | |
import mgear.maya.primitive as pri | |
import mgear.maya.transform as tra | |
import mgear.maya.attribute as att | |
import mgear.maya.node as nod | |
import mgear.maya.vector as vec | |
import mgear.maya.applyop as aop | |
import mgear.maya.fcurve as fcu | |
############################################# | |
# COMPONENT | |
############################################# | |
class Component(MainComponent): | |
def addObjects(self): | |
self.realNegate = self.negate | |
# if self.settings["WorldAlign"]: | |
# self.negate = False | |
self.negate = False | |
self.setup = pri.addTransformFromPos(self.setupWS, self.getName("WS")) | |
att.lockAttribute(self.setup) | |
self.WIP = self.options["mode"] | |
self.normal = self.getNormalFromPos(self.guide.apos) | |
self.binormal = self.getBiNormalFromPos(self.guide.apos) | |
self.length0 = vec.getDistance(self.guide.apos[0], self.guide.apos[1]) | |
self.length1 = vec.getDistance(self.guide.apos[1], self.guide.apos[2]) | |
self.length2 = vec.getDistance(self.guide.apos[2], self.guide.apos[3]) | |
# limb chain | |
self.limbBones = pri.add2DChain(self.root, self.getName("limbBones%s_jnt"), self.guide.apos[0:3], self.normal, False, self.WIP) | |
# limb chain FK ref | |
self.limbBonesFK = pri.add2DChain(self.root, self.getName("limbFK%s_jnt"), self.guide.apos[0:3], self.normal, False, self.WIP) | |
# limb chain IK ref | |
self.limbBonesIK = pri.add2DChain(self.root, self.getName("limbIK%s_jnt"), self.guide.apos[0:3], self.normal, False, self.WIP) | |
# 1 bone chain for upv ref | |
self.limbChainUpvRef= pri.add2DChain(self.root, self.getName("limbUpvRef%s_jnt"), [self.guide.apos[0],self.guide.apos[2]], self.normal, False, self.WIP) | |
self.limbChainUpvRef[1].setAttr("jointOrientZ", self.limbChainUpvRef[1].getAttr("jointOrientZ")*-1) | |
# mid joints | |
self.mid1_jnt = pri.addJoint(self.limbBones[0], self.getName("mid1_jnt"),self.limbBones[1].getMatrix(worldSpace=True), self.WIP ) | |
self.mid1_jnt.attr("radius").set(3) | |
self.mid1_jnt.setAttr("jointOrient", 0, 0, 0) | |
# FK Controlers ----------------------------------- | |
t = tra.getTransformLookingAt(self.guide.apos[0], self.guide.apos[1], self.normal, "xz", self.realNegate) | |
self.fk0_npo = pri.addTransform(self.root, self.getName("fk0_npo"), t) | |
self.fk0_ctl = self.addCtl(self.fk0_npo, "fk0_ctl", t, self.color_fk, "cube", w=self.length0, h=self.size*.1, d=self.size*.1, po=dt.Vector(.5*self.length0*self.n_factor,0,0), tp=self.parentCtlTag) | |
att.setKeyableAttributes(self.fk0_ctl, ["tx", "ty", "tz", "ro", "rx", "ry", "rz", "sx"]) | |
t = tra.getTransformLookingAt(self.guide.apos[1], self.guide.apos[2], self.normal, "xz", self.realNegate) | |
self.fk1_npo = pri.addTransform(self.fk0_ctl, self.getName("fk1_npo"), t) | |
self.fk1_ctl = self.addCtl(self.fk1_npo, "fk1_ctl", t, self.color_fk, "cube", w=self.length1, h=self.size*.1, d=self.size*.1, po=dt.Vector(.5*self.length1*self.n_factor,0,0), tp=self.fk0_ctl) | |
att.setKeyableAttributes(self.fk1_ctl, ["tx", "ty", "tz", "ro", "rx", "ry", "rz", "sx"]) | |
t = tra.getTransformLookingAt(self.guide.apos[2], self.guide.apos[3], self.normal, "xz", self.realNegate) | |
self.fk2_npo = pri.addTransform(self.fk1_ctl, self.getName("fk2_npo"), t) | |
self.fk2_ctl = self.addCtl(self.fk2_npo, "fk2_ctl", t, self.color_fk, "cube", w=self.length2, h=self.size*.1, d=self.size*.1, po=dt.Vector(.5*self.length2*self.n_factor,0,0), tp=self.fk1_ctl) | |
att.setKeyableAttributes(self.fk2_ctl) | |
self.fk_ctl = [self.fk0_ctl, self.fk1_ctl, self.fk2_ctl] | |
for x in self.fk_ctl: | |
att.setInvertMirror(x, ["tx", "ty", "tz"]) | |
# IK Controlers ----------------------------------- | |
self.ik_cns = pri.addTransformFromPos(self.root, self.getName("ik_cns"), self.guide.pos["tip"]) | |
self.ikcns_ctl = self.addCtl(self.ik_cns, "ikcns_ctl", tra.getTransformFromPos(self.guide.pos["tip"]), self.color_ik, "null", w=self.size*.12, tp=self.parentCtlTag) | |
att.setInvertMirror(self.ikcns_ctl, ["tx", "ty", "tz"]) | |
# if self.settings["WorldAlign"]: | |
if True: | |
m = tra.getTransformFromPos(self.guide.pos["tip"]) | |
else: | |
if self.negate: | |
m = tra.getTransformLookingAt(self.guide.pos["tip"], self.guide.pos["eff"], self.normal, "x-y", True) | |
else: | |
m = tra.getTransformLookingAt(self.guide.pos["tip"], self.guide.pos["eff"], self.normal, "xy", False) | |
self.ik_ctl = self.addCtl(self.ikcns_ctl, "ik_ctl", m, self.color_ik, "cube", w=self.size*.12, h=self.size*.12, d=self.size*.12, tp=self.ikcns_ctl) | |
if self.negate: | |
m = tra.getTransformLookingAt(self.guide.pos["tip"], self.guide.pos["eff"], self.normal, "x-y", True) | |
else: | |
m = tra.getTransformLookingAt(self.guide.pos["tip"], self.guide.pos["eff"], self.normal, "xy", False) | |
if self.settings["mirrorIK"]: | |
if self.negate: | |
self.ik_cns.sx.set(-1) | |
self.ik_ctl.rz.set(self.ik_ctl.rz.get()*-1) | |
else: | |
att.setInvertMirror(self.ik_ctl, ["tx", "ry", "rz"]) | |
att.setKeyableAttributes(self.ik_ctl) | |
self.ik_ctl_ref = pri.addTransform(self.ik_ctl, self.getName("ikCtl_ref"), m) | |
self.ik2b_bone_ref = pri.addTransform(self.limbBonesIK[2], self.getName("ik2B_B_ref"), m) | |
self.ik2b_blend = pri.addTransform(self.ik_ctl, self.getName("ik2B_blend"), m) | |
self.ik2b_ik_npo = pri.addTransform(self.ik2b_blend, self.getName("ik2B_ik_npo"), tra.getTransform(self.limbBonesIK[-1])) | |
self.ik2b_ik_ref = pri.addTransform(self.ik2b_ik_npo, self.getName("ik2B_ik_ref"), tra.getTransform(self.fk_ctl[2])) | |
# upv | |
v = self.guide.apos[2] - self.guide.apos[0] | |
v = self.normal ^ v | |
v.normalize() | |
v *= self.size*.5 | |
v += self.guide.apos[1] | |
self.upv_cns = pri.addTransformFromPos(self.root, self.getName("upv_cns"), v) | |
self.upv_ctl = self.addCtl(self.upv_cns, "upv_ctl", tra.getTransform(self.upv_cns), self.color_ik, "diamond", w=self.size*.12, tp=self.parentCtlTag) | |
if self.settings["mirrorMid"]: | |
if self.negate: | |
self.upv_cns.rz.set(180) | |
self.upv_cns.sy.set(-1) | |
else: | |
att.setInvertMirror(self.upv_ctl, ["tx"]) | |
att.setKeyableAttributes(self.upv_ctl, self.t_params) | |
# References -------------------------------------- | |
# Calculate again the transfor for the IK ref. This way align with FK | |
trnIK_ref = tra.getTransformLookingAt(self.guide.pos["tip"], self.guide.pos["eff"], self.normal, "xz", self.negate) | |
self.ik_ref = pri.addTransform(self.ik_ctl_ref, self.getName("ik_ref"), trnIK_ref) | |
self.fk_ref = pri.addTransform(self.fk_ctl[2], self.getName("fk_ref"), trnIK_ref) | |
#mid control | |
tA = tra.getTransformLookingAt(self.guide.apos[0], self.guide.apos[1], self.normal, "xz", self.negate) | |
tA = tra.setMatrixPosition(tA, self.guide.apos[1]) | |
tB = tra.getTransformLookingAt(self.guide.apos[1], self.guide.apos[2], self.normal, "xz", self.negate) | |
t = tra.getInterpolateTransformMatrix(tA, tB) | |
self.ctrn_loc = pri.addTransform(self.root, self.getName("ctrn_loc"), t) | |
# #match IK FK references | |
self.match_fk0_off = pri.addTransform(self.root, self.getName("matchFk0_npo"), tra.getTransform(self.fk_ctl[1])) | |
self.match_fk0 = pri.addTransform(self.match_fk0_off, self.getName("fk0_mth"), tra.getTransform(self.fk_ctl[0])) | |
self.match_fk1_off = pri.addTransform(self.root, self.getName("matchFk1_npo"), tra.getTransform(self.fk_ctl[2])) | |
self.match_fk1 = pri.addTransform(self.match_fk1_off, self.getName("fk1_mth"), tra.getTransform(self.fk_ctl[1])) | |
self.match_fk2 = pri.addTransform(self.ik_ctl, self.getName("fk2_mth"), tra.getTransform(self.fk_ctl[2])) | |
self.match_ik = pri.addTransform(self.fk2_ctl, self.getName("ik_mth"), tra.getTransform(self.ik_ctl)) | |
self.match_ikUpv = pri.addTransform(self.fk0_ctl, self.getName("upv_mth"), tra.getTransform(self.upv_ctl)) | |
# Mid Controler ------------------------------------ | |
t = tra.getTransform(self.ctrn_loc) | |
self.mid_cns = pri.addTransform(self.ctrn_loc, self.getName("mid_cns"), t) | |
self.mid_ctl = self.addCtl(self.mid_cns, "mid_ctl", t, self.color_ik, "sphere", w=self.size*.2, tp=self.parentCtlTag) | |
if self.settings["mirrorMid"]: | |
if self.negate: | |
self.mid_cns.rz.set(180) | |
self.mid_cns.sz.set(-1) | |
else: | |
att.setInvertMirror(self.mid_ctl, ["tx", "ty", "tz"]) | |
att.setKeyableAttributes(self.mid_ctl, self.t_params) | |
# Soft IK objects 2 Bones chain -------------------------------------------------------------------------------------------- | |
t = tra.getTransformLookingAt(self.guide.pos["root"], self.guide.pos["tip"], self.x_axis, "zx", False) | |
self.aim_tra2 = pri.addTransform(self.root, self.getName("aimSoftIK2"), t) | |
t = tra.getTransformFromPos(self.guide.pos["tip"]) | |
self.tipSoftIK = pri.addTransform(self.aim_tra2, self.getName("tipSoftIK"), t) | |
self.softblendLoc2 = pri.addTransform(self.root, self.getName("softblendLoc2"), t) | |
#Roll join ref--------------------------------- | |
self.tws0_loc = pri.addTransform(self.root, self.getName("tws0_loc"), tra.getTransform(self.fk_ctl[0])) | |
self.tws1_npo = pri.addTransform(self.ctrn_loc, self.getName("tws1_npo"), tra.getTransform(self.ctrn_loc)) | |
self.tws1_loc = pri.addTransform(self.tws1_npo, self.getName("tws1_loc"), tra.getTransform(self.ctrn_loc)) | |
self.tws1A_npo = pri.addTransform(self.mid_ctl, self.getName("tws1A_npo"), tA) | |
self.tws1A_loc = pri.addTransform(self.tws1A_npo, self.getName("tws1A_loc"), tA) | |
self.tws1B_npo = pri.addTransform(self.mid_ctl, self.getName("tws1B_npo"), tB) | |
self.tws1B_loc = pri.addTransform(self.tws1B_npo, self.getName("tws1B_loc"), tB) | |
self.tws2_npo = pri.addTransform(self.root, self.getName("tws2_npo"), tra.getTransform(self.fk_ctl[2])) | |
self.tws2_loc = pri.addTransform(self.tws2_npo, self.getName("tws2_loc"), tra.getTransform(self.fk_ctl[2])) | |
# Roll twist chain --------------------------------- | |
#UpperLimb | |
self.upperLimbChainPos = [] | |
ii = 1.0/(self.settings["div0"]+1) | |
i = 0.0 | |
for p in range(self.settings["div0"]+2): | |
self.upperLimbChainPos.append(vec.linearlyInterpolate(self.guide.pos["root"], self.guide.pos["mid"], blend=i)) | |
i=i+ii | |
self.upperLimbTwistChain= pri.add2DChain(self.root, self.getName("upperLimbTwist%s_jnt"), self.upperLimbChainPos, self.normal, False, self.WIP) | |
#lowerLimb | |
self.lowerLimbChainPos = [] | |
ii = 1.0/(self.settings["div1"]+1) | |
i = 0.0 | |
for p in range(self.settings["div1"]+2): | |
self.lowerLimbChainPos.append(vec.linearlyInterpolate(self.guide.pos["mid"], self.guide.pos["tip"], blend=i)) | |
i=i+ii | |
self.lowerLimbTwistChain= pri.add2DChain(self.root, self.getName("lowerLimbTwist%s_jnt"), self.lowerLimbChainPos, self.normal, False, self.WIP) | |
pm.parent(self.lowerLimbTwistChain[0], self.mid_ctl) | |
#Hand Aux chain and nonroll | |
self.auxChainPos = [] | |
ii = .5 | |
i = 0.0 | |
for p in range(3): | |
self.auxChainPos.append(vec.linearlyInterpolate(self.guide.pos["tip"], self.guide.pos["eff"], blend=i)) | |
i=i+ii | |
t = self.root.getMatrix(worldSpace=True) | |
self.aux_npo = pri.addTransform(self.root, self.getName("aux_npo"), t) | |
self.auxTwistChain = pri.add2DChain(self.aux_npo, self.getName("auxTwist%s_jnt"), self.auxChainPos, self.normal, False, self.WIP) | |
#Non Roll join ref --------------------------------- | |
self.upperLimbRollRef = pri.add2DChain(self.root, self.getName("upperLimbRollRef%s_jnt"), self.upperLimbChainPos[:2], self.normal, False, self.WIP) | |
self.lowerLimbRollRef = pri.add2DChain(self.aux_npo, self.getName("lowerLimbRollRef%s_jnt"), self.auxChainPos[:2], self.normal, False, self.WIP) | |
# Divisions ---------------------------------------- | |
# We have at least one division at the start, the end and one for the mid. + 2 for mid angle control | |
self.divisions = self.settings["div0"] + self.settings["div1"] + 4 | |
self.div_cns = [] | |
for i in range(self.divisions): | |
div_cns = pri.addTransform(self.root, self.getName("div%s_loc" % i)) | |
self.div_cns.append(div_cns) | |
self.jnt_pos.append([div_cns, i, None, True, False]) | |
# End reference ------------------------------------ | |
# To help the deformation on the tip | |
# self.eff_loc = pri.addTransform(self.root, self.getName("eff_loc"), tra.getTransform(self.tws2_loc)) | |
self.eff_loc = pri.addTransform(self.limbBones[2], self.getName("eff_loc"), tra.getTransform(self.fk_ctl[2])) | |
self.end_ref = pri.addTransform(self.eff_loc, self.getName("end_ref"), tra.getTransform(self.fk_ctl[2])) | |
if self.negate: | |
self.end_ref.attr("rz").set(180.0) | |
self.jnt_pos.append([self.end_ref, "end", None, True, False]) | |
# Tangent controls | |
t = tra.getInterpolateTransformMatrix(self.fk_ctl[0], self.tws1A_npo, .1) | |
self.upperLimbTangentA_loc = pri.addTransform(self.root, self.getName("upperLimbTangentA_loc"), self.fk_ctl[0].getMatrix(worldSpace=True)) | |
self.upperLimbTangentA_npo = pri.addTransform(self.upperLimbTangentA_loc, self.getName("upperLimbTangentA_npo"), t) | |
self.upperLimbTangentA_ctl = self.addCtl(self.upperLimbTangentA_npo, "upperLimbTangentA_ctl", t, self.color_ik, "circle", w=self.size*.2, ro=dt.Vector(0,0,1.570796), tp=self.mid_ctl) | |
if self.negate: | |
self.upperLimbTangentA_npo.rz.set(180) | |
self.upperLimbTangentA_npo.sz.set(-1) | |
att.setKeyableAttributes(self.upperLimbTangentA_ctl, self.t_params) | |
t = tra.getInterpolateTransformMatrix(self.fk_ctl[0], self.tws1A_npo, .5) | |
self.upperLimbTangentB_npo = pri.addTransform(self.tws1A_loc, self.getName("upperLimbTangentB_npo"), t) | |
self.upperLimbTangentB_ctl = self.addCtl(self.upperLimbTangentB_npo, "upperLimbTangentB_ctl", t, self.color_ik, "circle", w=self.size*.1, ro=dt.Vector(0,0,1.570796), tp=self.mid_ctl) | |
if self.negate: | |
self.upperLimbTangentB_npo.rz.set(180) | |
self.upperLimbTangentB_npo.sz.set(-1) | |
att.setKeyableAttributes(self.upperLimbTangentB_ctl, self.t_params) | |
tC = self.tws1B_npo.getMatrix(worldSpace=True) | |
tC = tra.setMatrixPosition(tC, self.guide.apos[2]) | |
t = tra.getInterpolateTransformMatrix(self.tws1B_npo, tC, .5) | |
self.lowerLimbTangentA_npo = pri.addTransform(self.tws1B_loc, self.getName("lowerLimbTangentA_npo"), t) | |
self.lowerLimbTangentA_ctl = self.addCtl(self.lowerLimbTangentA_npo, "lowerLimbTangentA_ctl", t, self.color_ik, "circle", w=self.size*.1, ro=dt.Vector(0,0,1.570796), tp=self.mid_ctl) | |
if self.negate: | |
self.lowerLimbTangentA_npo.rz.set(180) | |
self.lowerLimbTangentA_npo.sz.set(-1) | |
att.setKeyableAttributes(self.lowerLimbTangentA_ctl, self.t_params) | |
t = tra.getInterpolateTransformMatrix(self.tws1B_npo, tC, .9) | |
self.lowerLimbTangentB_loc = pri.addTransform(self.root, self.getName("lowerLimbTangentB_loc"), tC) | |
self.lowerLimbTangentB_npo = pri.addTransform(self.lowerLimbTangentB_loc, self.getName("lowerLimbTangentB_npo"), t) | |
self.lowerLimbTangentB_ctl = self.addCtl(self.lowerLimbTangentB_npo, "lowerLimbTangentB_ctl", t, self.color_ik, "circle", w=self.size*.2, ro=dt.Vector(0,0,1.570796), tp=self.mid_ctl) | |
if self.negate: | |
self.lowerLimbTangentB_npo.rz.set(180) | |
self.lowerLimbTangentB_npo.sz.set(-1) | |
att.setKeyableAttributes(self.lowerLimbTangentB_ctl, self.t_params) | |
t = self.mid_ctl.getMatrix(worldSpace=True) | |
self.midTangent_npo = pri.addTransform(self.mid_ctl, self.getName("midTangent_npo"), t) | |
self.midTangent_ctl = self.addCtl(self.midTangent_npo, "midTangent_ctl", t, self.color_fk, "circle", w=self.size*.15, ro=dt.Vector(0,0,1.570796), tp=self.mid_ctl) | |
if self.negate: | |
self.midTangent_npo.rz.set(180) | |
self.midTangent_npo.sz.set(-1) | |
att.setKeyableAttributes(self.midTangent_ctl, self.t_params) | |
def addAttributes(self): | |
# Anim ------------------------------------------- | |
self.blend_att = self.addAnimParam("blend", "Fk/Ik Blend", "double", self.settings["blend"], 0, 1) | |
self.roll_att = self.addAnimParam("roll", "Roll", "double", 0, -180, 180) | |
# self.scale_att = self.addAnimParam("ikscale", "Scale", "double", 1, .001, 99) | |
self.soft_attr = self.addAnimParam("softIKRange", "Soft IK Range", "double", 0.0001, 0.0001,100) | |
self.softSpeed_attr = self.addAnimParam("softIKSpeed", "Soft IK Speed", "double", 2.5,1.001,10) | |
self.stretch_attr = self.addAnimParam("stretch", "Stretch", "double", 0,0,1) | |
# self.reverse_att = self.addAnimParam("reverse", "Reverse", "double", 0, 0, 1) | |
self.roundness_att = self.addAnimParam("roundness", "Roundness", "double", 0, 0, 1) | |
self.tangentVis_att = self.addAnimParam("Tangent_vis", "Tangent vis", "bool", False) | |
self.boneALenghtMult_attr = self.addAnimParam("boneALenMult", "Bone A Mult", "double", 1) | |
self.boneBLenghtMult_attr = self.addAnimParam("boneBLenMult", "Bone B Mult", "double", 1) | |
self.boneALenght_attr = self.addAnimParam("boneALen", "Bone A Length", "double", self.length0, keyable=False) | |
self.boneBLenght_attr = self.addAnimParam("boneBLen", "Bone B Length", "double", self.length1, keyable=False) | |
# Ref | |
if self.settings["ikrefarray"]: | |
ref_names = self.settings["ikrefarray"].split(",") | |
if len(ref_names) > 1: | |
self.ikref_att = self.addAnimEnumParam("ikref", "Ik Ref", 0, self.settings["ikrefarray"].split(",")) | |
if self.settings["ikTR"]: | |
ref_names = ["Auto", "ik_ctl"] | |
if self.settings["ikrefarray"]: | |
ref_names = ref_names + self.settings["ikrefarray"].split(",") | |
self.ikRotRef_att = self.addAnimEnumParam("ikRotRef", "Ik Rot Ref", 0, ref_names) | |
if self.settings["upvrefarray"]: | |
ref_names = self.settings["upvrefarray"].split(",") | |
ref_names = ["Auto"] + ref_names | |
if len(ref_names) > 1: | |
self.upvref_att = self.addAnimEnumParam("upvref", "UpV Ref", 0, ref_names) | |
if self.settings["pinrefarray"]: | |
ref_names = self.settings["pinrefarray" ].split(",") | |
ref_names = ["Auto"] + ref_names | |
if len(ref_names) > 1: | |
self.pin_att = self.addAnimEnumParam("midref", "mid Ref", 0, ref_names) | |
# Setup ------------------------------------------ | |
# Eval Fcurve | |
self.st_value = fcu.getFCurveValues(self.settings["st_profile"], self.divisions) | |
self.sq_value = fcu.getFCurveValues(self.settings["sq_profile"], self.divisions) | |
self.st_att = [ self.addSetupParam("stretch_%s"%i, "Stretch %s"%i, "double", self.st_value[i], -1, 0) for i in range(self.divisions) ] | |
self.sq_att = [ self.addSetupParam("squash_%s"%i, "Squash %s"%i, "double", self.sq_value[i], 0, 1) for i in range(self.divisions) ] | |
self.resample_att = self.addSetupParam("resample", "Resample", "bool", True) | |
self.absolute_att = self.addSetupParam("absolute", "Absolute", "bool", False) | |
def addOperators(self): | |
self.ikSolver = "ikRPsolver" | |
# 1 bone chain Upv ref ===================================================================================== | |
self.ikHandleUpvRef = pri.addIkHandle(self.root, self.getName("ikHandlelimbChainUpvRef"), self.limbChainUpvRef, "ikSCsolver") | |
pm.pointConstraint(self.ik_ctl, self.ikHandleUpvRef) | |
pm.parentConstraint( self.limbChainUpvRef[0], self.upv_cns, mo=True) | |
# mid joints ===================================================================================== | |
nod.createPairBlend(None, self.limbBones[1], .5, 1, self.mid1_jnt) | |
pm.connectAttr(self.limbBones[1]+".translate", self.mid1_jnt+".translate", f=True) | |
pm.parentConstraint(self.mid1_jnt, self.ctrn_loc) | |
# Visibilities ------------------------------------- | |
# fk | |
fkvis_node = nod.createReverseNode(self.blend_att) | |
for shp in self.fk0_ctl.getShapes(): | |
pm.connectAttr(fkvis_node+".outputX", shp.attr("visibility")) | |
for shp in self.fk1_ctl.getShapes(): | |
pm.connectAttr(fkvis_node+".outputX", shp.attr("visibility")) | |
for shp in self.fk2_ctl.getShapes(): | |
pm.connectAttr(fkvis_node+".outputX", shp.attr("visibility")) | |
# ik | |
for shp in self.upv_ctl.getShapes(): | |
pm.connectAttr(self.blend_att, shp.attr("visibility")) | |
for shp in self.ikcns_ctl.getShapes(): | |
pm.connectAttr(self.blend_att, shp.attr("visibility")) | |
for shp in self.ik_ctl.getShapes(): | |
pm.connectAttr(self.blend_att, shp.attr("visibility")) | |
# Controls ROT order ----------------------------------- | |
att.setRotOrder(self.fk0_ctl, "XZY") | |
att.setRotOrder(self.fk1_ctl, "XYZ") | |
att.setRotOrder(self.fk2_ctl, "YZX") | |
att.setRotOrder(self.ik_ctl, "XYZ") | |
#joint length multiply | |
multJnt1_node = nod.createMulNode(self.boneALenght_attr, self.boneALenghtMult_attr) | |
multJnt2_node = nod.createMulNode(self.boneBLenght_attr, self.boneBLenghtMult_attr) | |
# IK 2 bones ====================================================================================================== | |
self.ikHandle2 = pri.addIkHandle(self.softblendLoc2, self.getName("ik2BonesHandle"), self.limbBonesIK, self.ikSolver, self.upv_ctl) | |
if self.negate: | |
mulVal = 1 | |
else: | |
mulVal = -1 | |
nod.createMulNode(self.roll_att, mulVal,self.ikHandle2.attr("twist")) | |
# softIK 2 bones operators | |
aop.aimCns(self.aim_tra2, self.ik2b_ik_ref, axis="zx", wupType=4, wupVector=[1,0,0], wupObject=self.root, maintainOffset=False) | |
plusTotalLength_node = nod.createPlusMinusAverage1D([multJnt1_node.attr("outputX"), multJnt2_node.attr("outputX")]) | |
subtract1_node = nod.createPlusMinusAverage1D([plusTotalLength_node.attr("output1D"), self.soft_attr], 2) | |
distance1_node = nod.createDistNode(self.ik2b_ik_ref, self.aim_tra2) | |
div1_node = nod.createDivNode(1, self.rig.global_ctl+".sx") | |
mult1_node = nod.createMulNode(distance1_node+".distance", div1_node+".outputX") | |
subtract2_node = nod.createPlusMinusAverage1D([mult1_node.attr("outputX"), subtract1_node.attr("output1D")], 2) | |
div2_node = nod.createDivNode(subtract2_node+".output1D", self.soft_attr) | |
mult2_node = nod.createMulNode(-1, div2_node+".outputX") | |
power_node = nod.createPowNode(self.softSpeed_attr, mult2_node+".outputX") | |
mult3_node = nod.createMulNode(self.soft_attr, power_node+".outputX" ) | |
subtract3_node = nod.createPlusMinusAverage1D([plusTotalLength_node.attr("output1D"),mult3_node.attr("outputX")], 2) | |
cond1_node = nod.createConditionNode(self.soft_attr, 0, 2,subtract3_node+".output1D", plusTotalLength_node+".output1D") | |
cond2_node = nod.createConditionNode(mult1_node+".outputX", subtract1_node+".output1D", 2,cond1_node+".outColorR", mult1_node+".outputX") | |
pm.connectAttr(cond2_node+".outColorR", self.tipSoftIK+".tz") | |
#soft blend | |
pc_node = pm.pointConstraint( self.tipSoftIK, self.ik2b_ik_ref, self.softblendLoc2) | |
nod.createReverseNode(self.stretch_attr, pc_node+".target[0].targetWeight") | |
pm.connectAttr(self.stretch_attr, pc_node+".target[1].targetWeight", f=True) | |
#Stretch | |
distance2_node = nod.createDistNode(self.softblendLoc2, self.tipSoftIK) | |
mult4_node = nod.createMulNode(distance2_node+".distance", div1_node+".outputX") | |
for i, mulNode in enumerate([multJnt1_node, multJnt2_node]): | |
div3_node = nod.createDivNode(mulNode+".outputX", plusTotalLength_node+".output1D") | |
mult5_node = nod.createMulNode(mult4_node+".outputX", div3_node+".outputX") | |
mult6_node = nod.createMulNode(self.stretch_attr, mult5_node+".outputX") | |
nod.createPlusMinusAverage1D([mulNode.attr("outputX"), mult6_node.attr("outputX")],1, self.limbBonesIK[i+1]+".tx") | |
### IK/FK connections | |
for i, x in enumerate(self.fk_ctl): | |
pm.parentConstraint( x, self.limbBonesFK[i], mo=True) | |
nod.createPairBlend(self.limbBonesFK[0], self.limbBonesIK[0], self.blend_att, 1, self.limbBones[0]) | |
nod.createPairBlend(self.limbBonesFK[1], self.limbBonesIK[1], self.blend_att, 1,self.limbBones[1]) | |
nod.createPairBlend(self.limbBonesFK[2], self.limbBonesIK[2], self.blend_att, 1,self.limbBones[2], rot=False) | |
parentc_node = pm.parentConstraint( self.limbBonesFK[2], self.ik2b_ik_ref, self.limbBones[2], mo=True, st=["x", "y", "z"]) | |
nod.createReverseNode(self.blend_att, parentc_node+".target[0].targetWeight") | |
pm.connectAttr(self.blend_att, parentc_node+".target[1].targetWeight", f=True) | |
# Twist references --------------------------------- | |
node = nod.createMultMatrixNode(self.eff_loc.attr("worldMatrix"), self.root.attr("worldInverseMatrix")) | |
dm_node = pm.createNode("decomposeMatrix") | |
pm.connectAttr(node+".matrixSum", dm_node+".inputMatrix") | |
pm.connectAttr(dm_node+".outputTranslate", self.tws2_npo.attr("translate")) | |
dm_node = pm.createNode("decomposeMatrix") | |
pm.connectAttr(node+".matrixSum", dm_node+".inputMatrix") | |
pm.connectAttr(dm_node+".outputRotate", self.tws2_npo.attr("rotate")) | |
#spline IK for twist jnts | |
self.ikhUpperLimbTwist, self.upperLimbTwistCrv = aop.splineIK(self.getName("upperLimbTwist"), self.upperLimbTwistChain, parent=self.root, cParent=self.limbBones[0] ) | |
self.ikhlowerLimbTwist, self.lowerLimbTwistCrv = aop.splineIK(self.getName("lowerLimbTwist"), self.lowerLimbTwistChain, parent=self.root, cParent=self.limbBones[1] ) | |
pm.parent(self.upperLimbTwistCrv, self.setup) | |
pm.parent(self.lowerLimbTwistCrv, self.setup) | |
#references | |
self.ikhUpperLimbRef, self.tmpCrv = aop.splineIK(self.getName("upperLimbRollRef"), self.upperLimbRollRef, parent=self.root, cParent=self.limbBones[0] ) | |
self.ikhlowerLimbRef, self.tmpCrv = aop.splineIK(self.getName("lowerLimbRollRef"), self.lowerLimbRollRef, parent=self.root, cParent=self.eff_loc ) | |
self.ikhAuxTwist, self.tmpCrv = aop.splineIK(self.getName("auxTwist"), self.auxTwistChain, parent=self.root, cParent=self.eff_loc ) | |
#setting connexions for ikhUpperLimbTwist | |
self.ikhUpperLimbTwist.attr("dTwistControlEnable").set(True) | |
self.ikhUpperLimbTwist.attr("dWorldUpType").set(4) | |
self.ikhUpperLimbTwist.attr("dWorldUpAxis").set(3) | |
self.ikhUpperLimbTwist.attr("dWorldUpVectorZ").set(1.0) | |
self.ikhUpperLimbTwist.attr("dWorldUpVectorY").set(0.0) | |
self.ikhUpperLimbTwist.attr("dWorldUpVectorEndZ").set(1.0) | |
self.ikhUpperLimbTwist.attr("dWorldUpVectorEndY").set(0.0) | |
pm.connectAttr(self.upperLimbRollRef[0].attr("worldMatrix[0]"), self.ikhUpperLimbTwist.attr("dWorldUpMatrix")) | |
pm.connectAttr(self.limbBones[0].attr("worldMatrix[0]"), self.ikhUpperLimbTwist.attr("dWorldUpMatrixEnd")) | |
#setting connexions for ikhAuxTwist | |
self.ikhAuxTwist.attr("dTwistControlEnable").set(True) | |
self.ikhAuxTwist.attr("dWorldUpType").set(4) | |
self.ikhAuxTwist.attr("dWorldUpAxis").set(3) | |
self.ikhAuxTwist.attr("dWorldUpVectorZ").set(1.0) | |
self.ikhAuxTwist.attr("dWorldUpVectorY").set(0.0) | |
self.ikhAuxTwist.attr("dWorldUpVectorEndZ").set(1.0) | |
self.ikhAuxTwist.attr("dWorldUpVectorEndY").set(0.0) | |
pm.connectAttr(self.lowerLimbRollRef[0].attr("worldMatrix[0]"), self.ikhAuxTwist.attr("dWorldUpMatrix")) | |
pm.connectAttr(self.eff_loc.attr("worldMatrix[0]"), self.ikhAuxTwist.attr("dWorldUpMatrixEnd")) | |
pm.connectAttr(self.auxTwistChain[1].attr("rx"), self.ikhlowerLimbTwist.attr("twist")) | |
pm.parentConstraint(self.limbBones[1], self.aux_npo, maintainOffset=True) | |
#scale upperLimb length for twist chain (not the squash and stretch) | |
arclen_node = pm.arclen(self.upperLimbTwistCrv, ch=True) | |
alAttrUpperLimb = arclen_node.attr("arcLength") | |
muldiv_nodeUpperLimb = pm.createNode("multiplyDivide") | |
pm.connectAttr(arclen_node.attr("arcLength"), muldiv_nodeUpperLimb.attr("input1X")) | |
muldiv_nodeUpperLimb.attr("input2X").set(alAttrUpperLimb.get()) | |
muldiv_nodeUpperLimb.attr("operation").set(2) | |
for jnt in self.upperLimbTwistChain: | |
pm.connectAttr(muldiv_nodeUpperLimb.attr("outputX"),jnt.attr("sx")) | |
#scale lowerLimb length for twist chain (not the squash and stretch) | |
arclen_node = pm.arclen(self.lowerLimbTwistCrv, ch=True) | |
alAttrlowerLimb = arclen_node.attr("arcLength") | |
muldiv_nodelowerLimb = pm.createNode("multiplyDivide") | |
pm.connectAttr(arclen_node.attr("arcLength"), muldiv_nodelowerLimb.attr("input1X")) | |
muldiv_nodelowerLimb.attr("input2X").set(alAttrlowerLimb.get()) | |
muldiv_nodelowerLimb.attr("operation").set(2) | |
for jnt in self.lowerLimbTwistChain: | |
pm.connectAttr(muldiv_nodelowerLimb.attr("outputX"),jnt.attr("sx")) | |
#scale compensation for the first twist join | |
dm_node = pm.createNode("decomposeMatrix") | |
pm.connectAttr(self.root.attr("worldMatrix[0]"), dm_node.attr("inputMatrix")) | |
pm.connectAttr(dm_node.attr("outputScale"), self.upperLimbTwistChain[0].attr("inverseScale")) | |
pm.connectAttr(dm_node.attr("outputScale"), self.lowerLimbTwistChain[0].attr("inverseScale")) | |
#tangent controls | |
muldiv_node = pm.createNode("multiplyDivide") | |
muldiv_node.attr("input2X").set(-1) | |
pm.connectAttr(self.tws1A_npo.attr("rz"), muldiv_node.attr("input1X")) | |
muldiv_nodeBias = pm.createNode("multiplyDivide") | |
pm.connectAttr(muldiv_node.attr("outputX"), muldiv_nodeBias.attr("input1X")) | |
pm.connectAttr(self.roundness_att, muldiv_nodeBias.attr("input2X")) | |
pm.connectAttr(muldiv_nodeBias.attr("outputX"), self.tws1A_loc.attr("rz") ) | |
if self.negate: | |
axis = "xz" | |
else: | |
axis = "-xz" | |
aop.aimCns(self.tws1A_npo, self.tws0_loc, axis=axis, wupType=2, wupVector=[0,0,1], wupObject=self.mid_ctl, maintainOffset=False) | |
aop.aimCns(self.lowerLimbTangentB_loc, self.lowerLimbTangentA_npo, axis=axis, wupType=2, wupVector=[0,0,1], wupObject=self.mid_ctl, maintainOffset=False) | |
pm.pointConstraint(self.eff_loc, self.lowerLimbTangentB_loc) | |
muldiv_node = pm.createNode("multiplyDivide") | |
muldiv_node.attr("input2X").set(-1) | |
pm.connectAttr(self.tws1B_npo.attr("rz"), muldiv_node.attr("input1X")) | |
muldiv_nodeBias = pm.createNode("multiplyDivide") | |
pm.connectAttr(muldiv_node.attr("outputX"), muldiv_nodeBias.attr("input1X")) | |
pm.connectAttr(self.roundness_att, muldiv_nodeBias.attr("input2X")) | |
pm.connectAttr(muldiv_nodeBias.attr("outputX"), self.tws1B_loc.attr("rz") ) | |
if self.negate: | |
axis = "-xz" | |
else: | |
axis = "xz" | |
aop.aimCns(self.tws1B_npo, self.tws2_loc, axis=axis, wupType=2, wupVector=[0,0,1], wupObject=self.mid_ctl, maintainOffset=False) | |
aop.aimCns(self.upperLimbTangentA_loc, self.upperLimbTangentB_npo, axis=axis, wupType=2, wupVector=[0,0,1], wupObject=self.mid_ctl, maintainOffset=False) | |
# Volume ------------------------------------------- | |
distA_node = nod.createDistNode(self.tws0_loc, self.tws1_loc) | |
distB_node = nod.createDistNode(self.tws1_loc, self.tws2_loc) | |
add_node = nod.createAddNode(distA_node+".distance", distB_node+".distance") | |
div_node = nod.createDivNode(add_node+".output", self.root.attr("sx")) | |
dm_node = pm.createNode("decomposeMatrix") | |
pm.connectAttr(self.root.attr("worldMatrix"), dm_node+".inputMatrix") | |
div_node2 = nod.createDivNode(div_node+".outputX", dm_node+".outputScaleX") | |
self.volDriver_att = div_node2+".outputX" | |
# connecting tangent scaele compensation after volume to aboid duplicate some nodes ------------------------------ | |
distA_node = nod.createDistNode(self.tws0_loc, self.mid_ctl) | |
distB_node = nod.createDistNode(self.mid_ctl, self.tws2_loc) | |
div_nodeUpperLimb = nod.createDivNode(distA_node+".distance", dm_node.attr("outputScaleX")) | |
div_node2 = nod.createDivNode(div_nodeUpperLimb+".outputX", distA_node.attr("distance").get()) | |
pm.connectAttr(div_node2.attr("outputX"), self.tws1A_loc.attr("sx")) | |
pm.connectAttr(div_node2.attr("outputX"), self.upperLimbTangentA_loc.attr("sx")) | |
div_nodelowerLimb = nod.createDivNode(distB_node+".distance", dm_node.attr("outputScaleX")) | |
div_node2 = nod.createDivNode(div_nodelowerLimb+".outputX", distB_node.attr("distance").get()) | |
pm.connectAttr(div_node2.attr("outputX"), self.tws1B_loc.attr("sx")) | |
pm.connectAttr(div_node2.attr("outputX"), self.lowerLimbTangentB_loc.attr("sx")) | |
#conection curve | |
aop.curvecns_op(self.upperLimbTwistCrv, [ self.upperLimbTangentA_loc, self.upperLimbTangentA_ctl, self.upperLimbTangentB_ctl,self.midTangent_ctl ]) | |
aop.curvecns_op(self.lowerLimbTwistCrv, [ self.midTangent_ctl, self.lowerLimbTangentA_ctl, self.lowerLimbTangentB_ctl,self.lowerLimbTangentB_loc ]) | |
#Tangent controls vis | |
for shp in self.upperLimbTangentA_ctl.getShapes(): | |
pm.connectAttr( self.tangentVis_att, shp.attr("visibility")) | |
for shp in self.upperLimbTangentB_ctl.getShapes(): | |
pm.connectAttr( self.tangentVis_att, shp.attr("visibility")) | |
for shp in self.lowerLimbTangentA_ctl.getShapes(): | |
pm.connectAttr( self.tangentVis_att, shp.attr("visibility")) | |
for shp in self.lowerLimbTangentB_ctl.getShapes(): | |
pm.connectAttr( self.tangentVis_att, shp.attr("visibility")) | |
for shp in self.midTangent_ctl.getShapes(): | |
pm.connectAttr( self.tangentVis_att, shp.attr("visibility")) | |
# Divisions ---------------------------------------- | |
# at 0 or 1 the division will follow exactly the rotation of the controler.. and we wont have this nice tangent + roll | |
for i, div_cns in enumerate(self.div_cns): | |
if i < (self.settings["div0"]+2): | |
mulmat_node = nod.createMultMatrixNode(self.upperLimbTwistChain[i]+".worldMatrix", div_cns+".parentInverseMatrix") | |
lastUpperLimbDiv = div_cns | |
else: | |
mulmat_node = nod.createMultMatrixNode(self.lowerLimbTwistChain[i-(self.settings["div0"]+2)]+".worldMatrix", div_cns+".parentInverseMatrix") | |
lastForeDiv = div_cns | |
dm_node = nod.createDecomposeMatrixNode(mulmat_node+".matrixSum") | |
pm.connectAttr(dm_node+".outputTranslate", div_cns+".t") | |
pm.connectAttr(dm_node+".outputRotate", div_cns+".r") | |
#force translation for last loc upperLimb and foreamr | |
nod.createMultMatrixNode(self.midTangent_ctl.worldMatrix,lastUpperLimbDiv.parentInverseMatrix, lastUpperLimbDiv, "t" ) | |
nod.createMultMatrixNode(self.tws2_loc.worldMatrix,lastForeDiv.parentInverseMatrix, lastForeDiv, "t" ) | |
# return | |
# NOTE: next line fix the issue on meters. | |
# This is special case becasuse the IK solver from mGear use the scale as lenght and we have shear | |
# TODO: check for a more clean and elimbant solution instead of re-match the world matrix again | |
tra.matchWorldTransform(self.fk_ctl[0], self.match_fk0_off) | |
tra.matchWorldTransform(self.fk_ctl[1], self.match_fk1_off) | |
tra.matchWorldTransform(self.fk_ctl[0], self.match_fk0) | |
tra.matchWorldTransform(self.fk_ctl[1], self.match_fk1) | |
# # match IK/FK ref | |
pm.parentConstraint(self.limbBones[0], self.match_fk0_off, mo=True) | |
pm.parentConstraint(self.limbBones[1], self.match_fk1_off, mo=True) | |
# ===================================================== | |
# CONNECTOR | |
# ===================================================== | |
## Set the relation beetween object from guide to rig.\n | |
# @param self | |
def setRelation(self): | |
self.relatives["root"] = self.div_cns[0] | |
self.relatives["mid"] = self.div_cns[self.settings["div0"] + 2] | |
self.relatives["tip"] = self.div_cns[-1] | |
self.relatives["eff"] = self.eff_loc | |
self.jointRelatives["root"] = 0 | |
self.jointRelatives["mid"] = self.settings["div0"] + 2 | |
self.jointRelatives["tip"] = len(self.div_cns)-2 | |
self.jointRelatives["eff"] = -1 | |
self.controlRelatives["root"] = self.fk0_ctl | |
self.controlRelatives["mid"] = self.fk1_ctl | |
self.controlRelatives["tip"] = self.fk2_ctl | |
self.controlRelatives["eff"] = self.fk2_ctl | |
## Add more connection definition to the set. | |
# @param self | |
def addConnection(self): | |
self.connections["shoulder_01"] = self.connect_shoulder_01 | |
## standard connection definition. | |
# @param self | |
def connect_standard(self): | |
self.connect_standardWithIkRef() | |
if self.settings["pinrefarray"]: | |
self.connectRef2("Auto,"+ self.settings["pinrefarray"], self.mid_cns, self.pin_att, [self.ctrn_loc], False) | |
def connect_shoulder_01(self): | |
self.connect_standard() | |
pm.parent(self.rollRef[0],self.parent_comp.ctl) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MGEAR is under the terms of the MIT License | |
# Copyright (c) 2016 Jeremie Passerin, Miquel Campos | |
# Permission is hereby granted, free of charge, to any person obtaining a copy | |
# of this software and associated documentation files (the "Software"), to deal | |
# in the Software without restriction, including without limitation the rights | |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
# copies of the Software, and to permit persons to whom the Software is | |
# furnished to do so, subject to the following conditions: | |
# The above copyright notice and this permission notice shall be included in all | |
# copies or substantial portions of the Software. | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
# SOFTWARE. | |
########################################################## | |
# GLOBAL | |
########################################################## | |
from functools import partial | |
import pymel.core as pm | |
# mgear | |
from mgear.maya.shifter.component.guide import ComponentGuide | |
import mgear.maya.transform as tra | |
#Pyside | |
from mgear.maya.shifter.component.guide import componentMainSettings | |
import mgear.maya.pyqt as gqt | |
from maya.app.general.mayaMixin import MayaQWidgetDockableMixin | |
from maya.app.general.mayaMixin import MayaQDockWidget | |
import settingsUI as sui | |
QtGui, QtCore, QtWidgets, wrapInstance = gqt.qt_import() | |
# guide info | |
AUTHOR = "Miquel Campos" | |
URL = "www.miquel-campos.com" | |
EMAIL = "" | |
VERSION = [1,0,0] | |
TYPE = "vanilla_limb_01" | |
NAME = "limb" | |
DESCRIPTION = "2 bones arm/leg using only vanilla Maya nodes" | |
########################################################## | |
# CLASS | |
########################################################## | |
class Guide(ComponentGuide): | |
compType = TYPE | |
compName = NAME | |
description = DESCRIPTION | |
author = AUTHOR | |
url = URL | |
email = EMAIL | |
version = VERSION | |
connectors = ["shoulder_01"] | |
# ===================================================== | |
## | |
# @param self | |
def postInit(self): | |
self.save_transform = ["root", "mid", "tip", "eff"] | |
# ===================================================== | |
## Add more object to the object definition list. | |
# @param self | |
def addObjects(self): | |
self.root = self.addRoot() | |
vTemp = tra.getOffsetPosition( self.root, [3,0,-.01]) | |
self.mid = self.addLoc("mid", self.root, vTemp) | |
vTemp = tra.getOffsetPosition( self.root, [6,0,0]) | |
self.tip = self.addLoc("tip", self.mid, vTemp) | |
vTemp = tra.getOffsetPosition( self.root, [7,0,0]) | |
self.eff = self.addLoc("eff", self.tip, vTemp) | |
self.dispcrv = self.addDispCurve("crv", [self.root, self.mid, self.tip, self.eff]) | |
# ===================================================== | |
## Add more parameter to the parameter definition list. | |
# @param self | |
def addParameters(self): | |
# Default Values | |
self.pBlend = self.addParam("blend", "double", 1, 0, 1) | |
self.pIkRefArray = self.addParam("ikrefarray", "string", "") | |
self.pUpvRefArray = self.addParam("upvrefarray", "string", "") | |
self.pUpvRefArray = self.addParam("pinrefarray", "string", "") | |
self.pMaxStretch = self.addParam("maxstretch", "double", 1.5 , 1, None) | |
self.pIKTR = self.addParam("ikTR", "bool", False) | |
self.pMirrorMid = self.addParam("mirrorMid", "bool", False) | |
self.pMirrorIK = self.addParam("mirrorIK", "bool", False) | |
self.pWorldAlign = self.addParam("WorldAlign", "bool", False) | |
# Divisions | |
self.pDiv0 = self.addParam("div0", "long", 2, 1, None) | |
self.pDiv1 = self.addParam("div1", "long", 2, 1, None) | |
# FCurves | |
self.pSt_profile = self.addFCurveParam("st_profile", [[0,0],[.5,-.5],[1,0]]) | |
self.pSq_profile = self.addFCurveParam("sq_profile", [[0,0],[.5,.5],[1,0]]) | |
self.pUseIndex = self.addParam("useIndex", "bool", False) | |
self.pParentJointIndex = self.addParam("parentJointIndex", "long", -1, None, None) | |
########################################################## | |
# Setting Page | |
########################################################## | |
class settingsTab(QtWidgets.QDialog, sui.Ui_Form): | |
def __init__(self, parent=None): | |
super(settingsTab, self).__init__(parent) | |
self.setupUi(self) | |
class componentSettings(MayaQWidgetDockableMixin, componentMainSettings): | |
def __init__(self, parent = None): | |
self.toolName = TYPE | |
# Delete old instances of the componet settings window. | |
gqt.deleteInstances(self, MayaQDockWidget) | |
super(self.__class__, self).__init__(parent = parent) | |
self.settingsTab = settingsTab() | |
self.setup_componentSettingWindow() | |
self.create_componentControls() | |
self.populate_componentControls() | |
self.create_componentLayout() | |
self.create_componentConnections() | |
def setup_componentSettingWindow(self): | |
self.mayaMainWindow = gqt.maya_main_window() | |
self.setObjectName(self.toolName) | |
self.setWindowFlags(QtCore.Qt.Window) | |
self.setWindowTitle(TYPE) | |
self.resize(280, 780) | |
def create_componentControls(self): | |
return | |
def populate_componentControls(self): | |
""" | |
Populate the controls values from the custom attributes of the component. | |
""" | |
#populate tab | |
self.tabs.insertTab(1, self.settingsTab, "Component Settings") | |
#populate component settings | |
self.settingsTab.ikfk_slider.setValue(int(self.root.attr("blend").get()*100)) | |
self.settingsTab.ikfk_spinBox.setValue(int(self.root.attr("blend").get()*100)) | |
self.settingsTab.maxStretch_spinBox.setValue(self.root.attr("maxstretch").get()) | |
self.populateCheck(self.settingsTab.ikTR_checkBox, "ikTR") | |
self.populateCheck(self.settingsTab.mirrorMid_checkBox, "mirrorMid") | |
self.populateCheck(self.settingsTab.mirrorIK_checkBox, "mirrorIK") | |
self.settingsTab.div0_spinBox.setValue(self.root.attr("div0").get()) | |
self.settingsTab.div1_spinBox.setValue(self.root.attr("div1").get()) | |
ikRefArrayItems = self.root.attr("ikrefarray").get().split(",") | |
for item in ikRefArrayItems: | |
self.settingsTab.ikRefArray_listWidget.addItem(item) | |
upvRefArrayItems = self.root.attr("upvrefarray").get().split(",") | |
for item in upvRefArrayItems: | |
self.settingsTab.upvRefArray_listWidget.addItem(item) | |
pinRefArrayItems = self.root.attr("pinrefarray").get().split(",") | |
for item in pinRefArrayItems: | |
self.settingsTab.pinRefArray_listWidget.addItem(item) | |
#populate connections in main settings | |
for cnx in Guide.connectors: | |
self.mainSettingsTab.connector_comboBox.addItem(cnx) | |
self.connector_items = [ self.mainSettingsTab.connector_comboBox.itemText(i) for i in range( self.mainSettingsTab.connector_comboBox.count())] | |
currentConnector = self.root.attr("connector").get() | |
if currentConnector not in self.connector_items: | |
self.mainSettingsTab.connector_comboBox.addItem(currentConnector) | |
self.connector_items.append(currentConnector) | |
pm.displayWarning("The current connector: %s, is not a valid connector for this component. Build will Fail!!") | |
comboIndex = self.connector_items.index(currentConnector) | |
self.mainSettingsTab.connector_comboBox.setCurrentIndex(comboIndex) | |
def create_componentLayout(self): | |
self.settings_layout = QtWidgets.QVBoxLayout() | |
self.settings_layout.addWidget(self.tabs) | |
self.settings_layout.addWidget(self.close_button) | |
self.setLayout(self.settings_layout) | |
def create_componentConnections(self): | |
self.settingsTab.ikfk_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.ikfk_slider, "blend")) | |
self.settingsTab.ikfk_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.ikfk_spinBox, "blend")) | |
self.settingsTab.maxStretch_spinBox.valueChanged.connect(partial(self.updateSpinBox, self.settingsTab.maxStretch_spinBox, "maxstretch")) | |
self.settingsTab.div0_spinBox.valueChanged.connect(partial(self.updateSpinBox, self.settingsTab.div0_spinBox, "div0")) | |
self.settingsTab.div1_spinBox.valueChanged.connect(partial(self.updateSpinBox, self.settingsTab.div1_spinBox, "div1")) | |
self.settingsTab.squashStretchProfile_pushButton.clicked.connect(self.setProfile) | |
self.settingsTab.ikTR_checkBox.stateChanged.connect(partial(self.updateCheck, self.settingsTab.ikTR_checkBox, "ikTR")) | |
self.settingsTab.mirrorMid_checkBox.stateChanged.connect(partial(self.updateCheck, self.settingsTab.mirrorMid_checkBox, "mirrorMid")) | |
self.settingsTab.mirrorIK_checkBox.stateChanged.connect(partial(self.updateCheck, self.settingsTab.mirrorIK_checkBox, "mirrorIK")) | |
self.settingsTab.ikRefArrayAdd_pushButton.clicked.connect(partial(self.addItem2listWidget, self.settingsTab.ikRefArray_listWidget, "ikrefarray")) | |
self.settingsTab.ikRefArrayRemove_pushButton.clicked.connect(partial(self.removeSelectedFromListWidget, self.settingsTab.ikRefArray_listWidget, "ikrefarray")) | |
self.settingsTab.ikRefArray_copyRef_pushButton.clicked.connect(partial(self.copyFromListWidget, self.settingsTab.upvRefArray_listWidget, self.settingsTab.ikRefArray_listWidget, "ikrefarray")) | |
self.settingsTab.ikRefArray_listWidget.installEventFilter(self) | |
self.settingsTab.upvRefArrayAdd_pushButton.clicked.connect(partial(self.addItem2listWidget, self.settingsTab.upvRefArray_listWidget, "upvrefarray")) | |
self.settingsTab.upvRefArrayRemove_pushButton.clicked.connect(partial(self.removeSelectedFromListWidget, self.settingsTab.upvRefArray_listWidget, "upvrefarray")) | |
self.settingsTab.upvRefArray_copyRef_pushButton.clicked.connect(partial(self.copyFromListWidget, self.settingsTab.ikRefArray_listWidget, self.settingsTab.upvRefArray_listWidget, "upvrefarray")) | |
self.settingsTab.upvRefArray_listWidget.installEventFilter(self) | |
self.settingsTab.pinRefArrayAdd_pushButton.clicked.connect(partial(self.addItem2listWidget, self.settingsTab.pinRefArray_listWidget, "pinrefarray")) | |
self.settingsTab.pinRefArrayRemove_pushButton.clicked.connect(partial(self.removeSelectedFromListWidget, self.settingsTab.pinRefArray_listWidget, "pinrefarray")) | |
self.settingsTab.pinRefArray_copyRef_pushButton.clicked.connect(partial(self.copyFromListWidget, self.settingsTab.ikRefArray_listWidget, self.settingsTab.pinRefArray_listWidget, "pinrefarray")) | |
self.settingsTab.pinRefArray_listWidget.installEventFilter(self) | |
def eventFilter(self, sender, event): | |
if event.type() == QtCore.QEvent.ChildRemoved: | |
if sender == self.settingsTab.ikRefArray_listWidget: | |
self.updateListAttr(sender, "ikrefarray") | |
elif sender == self.settingsTab.upvRefArray_listWidget: | |
self.updateListAttr(sender, "upvrefarray") | |
elif sender == self.settingsTab.pinRefArray_listWidget: | |
self.updateListAttr(sender, "pinrefarray") | |
return True | |
else: | |
return QtWidgets.QDialog.eventFilter(self, sender, event) | |
def dockCloseEventTriggered(self): | |
gqt.deleteInstances(self, MayaQDockWidget) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MGEAR is under the terms of the MIT License | |
# Copyright (c) 2016 Jeremie Passerin, Miquel Campos | |
# Permission is hereby granted, free of charge, to any person obtaining a copy | |
# of this software and associated documentation files (the "Software"), to deal | |
# in the Software without restriction, including without limitation the rights | |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
# copies of the Software, and to permit persons to whom the Software is | |
# furnished to do so, subject to the following conditions: | |
# The above copyright notice and this permission notice shall be included in all | |
# copies or substantial portions of the Software. | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
# SOFTWARE. | |
import mgear.maya.pyqt as gqt | |
QtGui, QtCore, QtWidgets, wrapInstance = gqt.qt_import() | |
class Ui_Form(object): | |
def setupUi(self, Form): | |
Form.setObjectName("Form") | |
Form.resize(268, 687) | |
self.gridLayout = QtWidgets.QGridLayout(Form) | |
self.gridLayout.setObjectName("gridLayout") | |
self.groupBox = QtWidgets.QGroupBox(Form) | |
self.groupBox.setTitle("") | |
self.groupBox.setObjectName("groupBox") | |
self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox) | |
self.gridLayout_2.setObjectName("gridLayout_2") | |
self.verticalLayout = QtWidgets.QVBoxLayout() | |
self.verticalLayout.setObjectName("verticalLayout") | |
self.formLayout = QtWidgets.QFormLayout() | |
self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow) | |
self.formLayout.setObjectName("formLayout") | |
self.ikfk_label = QtWidgets.QLabel(self.groupBox) | |
self.ikfk_label.setObjectName("ikfk_label") | |
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.ikfk_label) | |
self.horizontalLayout_3 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_3.setObjectName("horizontalLayout_3") | |
self.ikfk_slider = QtWidgets.QSlider(self.groupBox) | |
self.ikfk_slider.setMinimumSize(QtCore.QSize(0, 15)) | |
self.ikfk_slider.setMaximum(100) | |
self.ikfk_slider.setOrientation(QtCore.Qt.Horizontal) | |
self.ikfk_slider.setObjectName("ikfk_slider") | |
self.horizontalLayout_3.addWidget(self.ikfk_slider) | |
self.ikfk_spinBox = QtWidgets.QSpinBox(self.groupBox) | |
self.ikfk_spinBox.setMaximum(100) | |
self.ikfk_spinBox.setObjectName("ikfk_spinBox") | |
self.horizontalLayout_3.addWidget(self.ikfk_spinBox) | |
self.formLayout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_3) | |
self.maxStretch_label = QtWidgets.QLabel(self.groupBox) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.maxStretch_label.sizePolicy().hasHeightForWidth()) | |
self.maxStretch_label.setSizePolicy(sizePolicy) | |
self.maxStretch_label.setObjectName("maxStretch_label") | |
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.maxStretch_label) | |
self.maxStretch_spinBox = QtWidgets.QDoubleSpinBox(self.groupBox) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.maxStretch_spinBox.sizePolicy().hasHeightForWidth()) | |
self.maxStretch_spinBox.setSizePolicy(sizePolicy) | |
self.maxStretch_spinBox.setMinimum(1.0) | |
self.maxStretch_spinBox.setProperty("value", 1.5) | |
self.maxStretch_spinBox.setObjectName("maxStretch_spinBox") | |
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.maxStretch_spinBox) | |
self.verticalLayout.addLayout(self.formLayout) | |
self.horizontalLayout = QtWidgets.QHBoxLayout() | |
self.horizontalLayout.setObjectName("horizontalLayout") | |
self.divisions_label = QtWidgets.QLabel(self.groupBox) | |
self.divisions_label.setObjectName("divisions_label") | |
self.horizontalLayout.addWidget(self.divisions_label) | |
self.div0_spinBox = QtWidgets.QSpinBox(self.groupBox) | |
self.div0_spinBox.setMinimum(1) | |
self.div0_spinBox.setProperty("value", 2) | |
self.div0_spinBox.setObjectName("div0_spinBox") | |
self.horizontalLayout.addWidget(self.div0_spinBox) | |
self.div1_spinBox = QtWidgets.QSpinBox(self.groupBox) | |
self.div1_spinBox.setMinimum(1) | |
self.div1_spinBox.setProperty("value", 2) | |
self.div1_spinBox.setObjectName("div1_spinBox") | |
self.horizontalLayout.addWidget(self.div1_spinBox) | |
self.verticalLayout.addLayout(self.horizontalLayout) | |
self.ikTR_checkBox = QtWidgets.QCheckBox(self.groupBox) | |
self.ikTR_checkBox.setObjectName("ikTR_checkBox") | |
self.verticalLayout.addWidget(self.ikTR_checkBox) | |
self.mirrorIK_checkBox = QtWidgets.QCheckBox(self.groupBox) | |
self.mirrorIK_checkBox.setObjectName("mirrorIK_checkBox") | |
self.verticalLayout.addWidget(self.mirrorIK_checkBox) | |
self.mirrorMid_checkBox = QtWidgets.QCheckBox(self.groupBox) | |
self.mirrorMid_checkBox.setObjectName("mirrorMid_checkBox") | |
self.verticalLayout.addWidget(self.mirrorMid_checkBox) | |
self.horizontalLayout_2 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_2.setObjectName("horizontalLayout_2") | |
self.squashStretchProfile_pushButton = QtWidgets.QPushButton(self.groupBox) | |
self.squashStretchProfile_pushButton.setObjectName("squashStretchProfile_pushButton") | |
self.horizontalLayout_2.addWidget(self.squashStretchProfile_pushButton) | |
self.verticalLayout.addLayout(self.horizontalLayout_2) | |
self.gridLayout_2.addLayout(self.verticalLayout, 0, 0, 1, 1) | |
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) | |
self.ikRefArray_groupBox = QtWidgets.QGroupBox(Form) | |
self.ikRefArray_groupBox.setObjectName("ikRefArray_groupBox") | |
self.gridLayout_3 = QtWidgets.QGridLayout(self.ikRefArray_groupBox) | |
self.gridLayout_3.setObjectName("gridLayout_3") | |
self.ikRefArray_horizontalLayout = QtWidgets.QHBoxLayout() | |
self.ikRefArray_horizontalLayout.setObjectName("ikRefArray_horizontalLayout") | |
self.ikRefArray_verticalLayout_1 = QtWidgets.QVBoxLayout() | |
self.ikRefArray_verticalLayout_1.setObjectName("ikRefArray_verticalLayout_1") | |
self.ikRefArray_listWidget = QtWidgets.QListWidget(self.ikRefArray_groupBox) | |
self.ikRefArray_listWidget.setDragDropOverwriteMode(True) | |
self.ikRefArray_listWidget.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) | |
self.ikRefArray_listWidget.setDefaultDropAction(QtCore.Qt.MoveAction) | |
self.ikRefArray_listWidget.setAlternatingRowColors(True) | |
self.ikRefArray_listWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) | |
self.ikRefArray_listWidget.setSelectionRectVisible(False) | |
self.ikRefArray_listWidget.setObjectName("ikRefArray_listWidget") | |
self.ikRefArray_verticalLayout_1.addWidget(self.ikRefArray_listWidget) | |
self.ikRefArray_copyRef_pushButton = QtWidgets.QPushButton(self.ikRefArray_groupBox) | |
self.ikRefArray_copyRef_pushButton.setObjectName("ikRefArray_copyRef_pushButton") | |
self.ikRefArray_verticalLayout_1.addWidget(self.ikRefArray_copyRef_pushButton) | |
self.ikRefArray_horizontalLayout.addLayout(self.ikRefArray_verticalLayout_1) | |
self.ikRefArray_verticalLayout_2 = QtWidgets.QVBoxLayout() | |
self.ikRefArray_verticalLayout_2.setObjectName("ikRefArray_verticalLayout_2") | |
self.ikRefArrayAdd_pushButton = QtWidgets.QPushButton(self.ikRefArray_groupBox) | |
self.ikRefArrayAdd_pushButton.setObjectName("ikRefArrayAdd_pushButton") | |
self.ikRefArray_verticalLayout_2.addWidget(self.ikRefArrayAdd_pushButton) | |
self.ikRefArrayRemove_pushButton = QtWidgets.QPushButton(self.ikRefArray_groupBox) | |
self.ikRefArrayRemove_pushButton.setObjectName("ikRefArrayRemove_pushButton") | |
self.ikRefArray_verticalLayout_2.addWidget(self.ikRefArrayRemove_pushButton) | |
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.ikRefArray_verticalLayout_2.addItem(spacerItem) | |
self.ikRefArray_horizontalLayout.addLayout(self.ikRefArray_verticalLayout_2) | |
self.gridLayout_3.addLayout(self.ikRefArray_horizontalLayout, 0, 0, 1, 1) | |
self.gridLayout.addWidget(self.ikRefArray_groupBox, 1, 0, 1, 1) | |
self.upvRefArray_groupBox = QtWidgets.QGroupBox(Form) | |
self.upvRefArray_groupBox.setObjectName("upvRefArray_groupBox") | |
self.gridLayout_5 = QtWidgets.QGridLayout(self.upvRefArray_groupBox) | |
self.gridLayout_5.setObjectName("gridLayout_5") | |
self.upvRefArray_horizontalLayout = QtWidgets.QHBoxLayout() | |
self.upvRefArray_horizontalLayout.setObjectName("upvRefArray_horizontalLayout") | |
self.upvRefArray_verticalLayout_1 = QtWidgets.QVBoxLayout() | |
self.upvRefArray_verticalLayout_1.setObjectName("upvRefArray_verticalLayout_1") | |
self.upvRefArray_listWidget = QtWidgets.QListWidget(self.upvRefArray_groupBox) | |
self.upvRefArray_listWidget.setDragDropOverwriteMode(True) | |
self.upvRefArray_listWidget.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) | |
self.upvRefArray_listWidget.setDefaultDropAction(QtCore.Qt.MoveAction) | |
self.upvRefArray_listWidget.setAlternatingRowColors(True) | |
self.upvRefArray_listWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) | |
self.upvRefArray_listWidget.setSelectionRectVisible(False) | |
self.upvRefArray_listWidget.setObjectName("upvRefArray_listWidget") | |
self.upvRefArray_verticalLayout_1.addWidget(self.upvRefArray_listWidget) | |
self.upvRefArray_copyRef_pushButton = QtWidgets.QPushButton(self.upvRefArray_groupBox) | |
self.upvRefArray_copyRef_pushButton.setObjectName("upvRefArray_copyRef_pushButton") | |
self.upvRefArray_verticalLayout_1.addWidget(self.upvRefArray_copyRef_pushButton) | |
self.upvRefArray_horizontalLayout.addLayout(self.upvRefArray_verticalLayout_1) | |
self.upvRefArray_verticalLayout_2 = QtWidgets.QVBoxLayout() | |
self.upvRefArray_verticalLayout_2.setObjectName("upvRefArray_verticalLayout_2") | |
self.upvRefArrayAdd_pushButton = QtWidgets.QPushButton(self.upvRefArray_groupBox) | |
self.upvRefArrayAdd_pushButton.setObjectName("upvRefArrayAdd_pushButton") | |
self.upvRefArray_verticalLayout_2.addWidget(self.upvRefArrayAdd_pushButton) | |
self.upvRefArrayRemove_pushButton = QtWidgets.QPushButton(self.upvRefArray_groupBox) | |
self.upvRefArrayRemove_pushButton.setObjectName("upvRefArrayRemove_pushButton") | |
self.upvRefArray_verticalLayout_2.addWidget(self.upvRefArrayRemove_pushButton) | |
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.upvRefArray_verticalLayout_2.addItem(spacerItem1) | |
self.upvRefArray_horizontalLayout.addLayout(self.upvRefArray_verticalLayout_2) | |
self.gridLayout_5.addLayout(self.upvRefArray_horizontalLayout, 0, 0, 1, 1) | |
self.gridLayout.addWidget(self.upvRefArray_groupBox, 2, 0, 1, 1) | |
self.pinRefArray_groupBox = QtWidgets.QGroupBox(Form) | |
self.pinRefArray_groupBox.setObjectName("pinRefArray_groupBox") | |
self.gridLayout_4 = QtWidgets.QGridLayout(self.pinRefArray_groupBox) | |
self.gridLayout_4.setObjectName("gridLayout_4") | |
self.pinRefArray_horizontalLayout = QtWidgets.QHBoxLayout() | |
self.pinRefArray_horizontalLayout.setObjectName("pinRefArray_horizontalLayout") | |
self.pinRefArray_verticalLayout = QtWidgets.QVBoxLayout() | |
self.pinRefArray_verticalLayout.setObjectName("pinRefArray_verticalLayout") | |
self.pinRefArray_listWidget = QtWidgets.QListWidget(self.pinRefArray_groupBox) | |
self.pinRefArray_listWidget.setDragDropOverwriteMode(True) | |
self.pinRefArray_listWidget.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) | |
self.pinRefArray_listWidget.setDefaultDropAction(QtCore.Qt.MoveAction) | |
self.pinRefArray_listWidget.setAlternatingRowColors(True) | |
self.pinRefArray_listWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) | |
self.pinRefArray_listWidget.setSelectionRectVisible(False) | |
self.pinRefArray_listWidget.setObjectName("pinRefArray_listWidget") | |
self.pinRefArray_verticalLayout.addWidget(self.pinRefArray_listWidget) | |
self.pinRefArray_copyRef_pushButton = QtWidgets.QPushButton(self.pinRefArray_groupBox) | |
self.pinRefArray_copyRef_pushButton.setObjectName("pinRefArray_copyRef_pushButton") | |
self.pinRefArray_verticalLayout.addWidget(self.pinRefArray_copyRef_pushButton) | |
self.pinRefArray_horizontalLayout.addLayout(self.pinRefArray_verticalLayout) | |
self.pinRefArray_verticalLayout_2 = QtWidgets.QVBoxLayout() | |
self.pinRefArray_verticalLayout_2.setObjectName("pinRefArray_verticalLayout_2") | |
self.pinRefArrayAdd_pushButton = QtWidgets.QPushButton(self.pinRefArray_groupBox) | |
self.pinRefArrayAdd_pushButton.setObjectName("pinRefArrayAdd_pushButton") | |
self.pinRefArray_verticalLayout_2.addWidget(self.pinRefArrayAdd_pushButton) | |
self.pinRefArrayRemove_pushButton = QtWidgets.QPushButton(self.pinRefArray_groupBox) | |
self.pinRefArrayRemove_pushButton.setObjectName("pinRefArrayRemove_pushButton") | |
self.pinRefArray_verticalLayout_2.addWidget(self.pinRefArrayRemove_pushButton) | |
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.pinRefArray_verticalLayout_2.addItem(spacerItem2) | |
self.pinRefArray_horizontalLayout.addLayout(self.pinRefArray_verticalLayout_2) | |
self.gridLayout_4.addLayout(self.pinRefArray_horizontalLayout, 0, 0, 1, 1) | |
self.gridLayout.addWidget(self.pinRefArray_groupBox, 3, 0, 1, 1) | |
self.retranslateUi(Form) | |
QtCore.QObject.connect(self.ikfk_slider, QtCore.SIGNAL("sliderMoved(int)"), self.ikfk_spinBox.setValue) | |
QtCore.QObject.connect(self.ikfk_spinBox, QtCore.SIGNAL("valueChanged(int)"), self.ikfk_slider.setValue) | |
QtCore.QMetaObject.connectSlotsByName(Form) | |
def retranslateUi(self, Form): | |
Form.setWindowTitle(gqt.fakeTranslate("Form", "Form", None, -1)) | |
self.ikfk_label.setText(gqt.fakeTranslate("Form", "IK/FK Blend", None, -1)) | |
self.maxStretch_label.setText(gqt.fakeTranslate("Form", "Max Stretch", None, -1)) | |
self.divisions_label.setText(gqt.fakeTranslate("Form", "Divisions", None, -1)) | |
self.ikTR_checkBox.setText(gqt.fakeTranslate("Form", "IK separated Trans and Rot ctl", None, -1)) | |
self.mirrorIK_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) | |
self.mirrorIK_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) | |
self.mirrorIK_checkBox.setWhatsThis(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) | |
self.mirrorIK_checkBox.setText(gqt.fakeTranslate("Form", "Mirror IK Ctl axis behaviour", None, -1)) | |
self.mirrorMid_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) | |
self.mirrorMid_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) | |
self.mirrorMid_checkBox.setWhatsThis(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) | |
self.mirrorMid_checkBox.setText(gqt.fakeTranslate("Form", "Mirror Mid Ctl and UPV axis behaviour", None, -1)) | |
self.squashStretchProfile_pushButton.setText(gqt.fakeTranslate("Form", "Squash and Stretch Profile", None, -1)) | |
self.ikRefArray_groupBox.setTitle(gqt.fakeTranslate("Form", "IK Reference Array", None, -1)) | |
self.ikRefArray_copyRef_pushButton.setText(gqt.fakeTranslate("Form", "Copy from UpV Ref", None, -1)) | |
self.ikRefArrayAdd_pushButton.setText(gqt.fakeTranslate("Form", "<<", None, -1)) | |
self.ikRefArrayRemove_pushButton.setText(gqt.fakeTranslate("Form", ">>", None, -1)) | |
self.upvRefArray_groupBox.setTitle(gqt.fakeTranslate("Form", "UpV Reference Array", None, -1)) | |
self.upvRefArray_copyRef_pushButton.setText(gqt.fakeTranslate("Form", "Copy from IK Ref", None, -1)) | |
self.upvRefArrayAdd_pushButton.setText(gqt.fakeTranslate("Form", "<<", None, -1)) | |
self.upvRefArrayRemove_pushButton.setText(gqt.fakeTranslate("Form", ">>", None, -1)) | |
self.pinRefArray_groupBox.setTitle(gqt.fakeTranslate("Form", "Pin Elbow Reference Array", None, -1)) | |
self.pinRefArray_copyRef_pushButton.setText(gqt.fakeTranslate("Form", "Copy from IK Ref", None, -1)) | |
self.pinRefArrayAdd_pushButton.setText(gqt.fakeTranslate("Form", "<<", None, -1)) | |
self.pinRefArrayRemove_pushButton.setText(gqt.fakeTranslate("Form", ">>", None, -1)) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<ui version="4.0"> | |
<class>Form</class> | |
<widget class="QWidget" name="Form"> | |
<property name="geometry"> | |
<rect> | |
<x>0</x> | |
<y>0</y> | |
<width>268</width> | |
<height>687</height> | |
</rect> | |
</property> | |
<property name="windowTitle"> | |
<string>Form</string> | |
</property> | |
<layout class="QGridLayout" name="gridLayout"> | |
<item row="0" column="0"> | |
<widget class="QGroupBox" name="groupBox"> | |
<property name="title"> | |
<string/> | |
</property> | |
<layout class="QGridLayout" name="gridLayout_2"> | |
<item row="0" column="0"> | |
<layout class="QVBoxLayout" name="verticalLayout"> | |
<item> | |
<layout class="QFormLayout" name="formLayout"> | |
<property name="fieldGrowthPolicy"> | |
<enum>QFormLayout::AllNonFixedFieldsGrow</enum> | |
</property> | |
<item row="0" column="0"> | |
<widget class="QLabel" name="ikfk_label"> | |
<property name="text"> | |
<string>IK/FK Blend</string> | |
</property> | |
</widget> | |
</item> | |
<item row="0" column="1"> | |
<layout class="QHBoxLayout" name="horizontalLayout_3"> | |
<item> | |
<widget class="QSlider" name="ikfk_slider"> | |
<property name="minimumSize"> | |
<size> | |
<width>0</width> | |
<height>15</height> | |
</size> | |
</property> | |
<property name="maximum"> | |
<number>100</number> | |
</property> | |
<property name="orientation"> | |
<enum>Qt::Horizontal</enum> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QSpinBox" name="ikfk_spinBox"> | |
<property name="maximum"> | |
<number>100</number> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
<item row="1" column="0"> | |
<widget class="QLabel" name="maxStretch_label"> | |
<property name="sizePolicy"> | |
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> | |
<horstretch>0</horstretch> | |
<verstretch>0</verstretch> | |
</sizepolicy> | |
</property> | |
<property name="text"> | |
<string>Max Stretch</string> | |
</property> | |
</widget> | |
</item> | |
<item row="1" column="1"> | |
<widget class="QDoubleSpinBox" name="maxStretch_spinBox"> | |
<property name="sizePolicy"> | |
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> | |
<horstretch>0</horstretch> | |
<verstretch>0</verstretch> | |
</sizepolicy> | |
</property> | |
<property name="minimum"> | |
<double>1.000000000000000</double> | |
</property> | |
<property name="value"> | |
<double>1.500000000000000</double> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
<item> | |
<layout class="QHBoxLayout" name="horizontalLayout"> | |
<item> | |
<widget class="QLabel" name="divisions_label"> | |
<property name="text"> | |
<string>Divisions</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QSpinBox" name="div0_spinBox"> | |
<property name="minimum"> | |
<number>1</number> | |
</property> | |
<property name="value"> | |
<number>2</number> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QSpinBox" name="div1_spinBox"> | |
<property name="minimum"> | |
<number>1</number> | |
</property> | |
<property name="value"> | |
<number>2</number> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
<item> | |
<widget class="QCheckBox" name="ikTR_checkBox"> | |
<property name="text"> | |
<string>IK separated Trans and Rot ctl</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QCheckBox" name="mirrorIK_checkBox"> | |
<property name="toolTip"> | |
<string extracomment="This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ">This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour </string> | |
</property> | |
<property name="statusTip"> | |
<string extracomment="This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ">This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour </string> | |
</property> | |
<property name="whatsThis"> | |
<string>This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour </string> | |
</property> | |
<property name="text"> | |
<string>Mirror IK Ctl axis behaviour</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QCheckBox" name="mirrorMid_checkBox"> | |
<property name="toolTip"> | |
<string extracomment="This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ">This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour </string> | |
</property> | |
<property name="statusTip"> | |
<string extracomment="This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ">This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour </string> | |
</property> | |
<property name="whatsThis"> | |
<string>This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour </string> | |
</property> | |
<property name="text"> | |
<string>Mirror Mid Ctl and UPV axis behaviour</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<layout class="QHBoxLayout" name="horizontalLayout_2"> | |
<item> | |
<widget class="QPushButton" name="squashStretchProfile_pushButton"> | |
<property name="text"> | |
<string>Squash and Stretch Profile</string> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</widget> | |
</item> | |
<item row="1" column="0"> | |
<widget class="QGroupBox" name="ikRefArray_groupBox"> | |
<property name="title"> | |
<string>IK Reference Array</string> | |
</property> | |
<layout class="QGridLayout" name="gridLayout_3"> | |
<item row="0" column="0"> | |
<layout class="QHBoxLayout" name="ikRefArray_horizontalLayout"> | |
<item> | |
<layout class="QVBoxLayout" name="ikRefArray_verticalLayout_1"> | |
<item> | |
<widget class="QListWidget" name="ikRefArray_listWidget"> | |
<property name="dragDropOverwriteMode"> | |
<bool>true</bool> | |
</property> | |
<property name="dragDropMode"> | |
<enum>QAbstractItemView::InternalMove</enum> | |
</property> | |
<property name="defaultDropAction"> | |
<enum>Qt::MoveAction</enum> | |
</property> | |
<property name="alternatingRowColors"> | |
<bool>true</bool> | |
</property> | |
<property name="selectionMode"> | |
<enum>QAbstractItemView::ExtendedSelection</enum> | |
</property> | |
<property name="selectionRectVisible"> | |
<bool>false</bool> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QPushButton" name="ikRefArray_copyRef_pushButton"> | |
<property name="text"> | |
<string>Copy from UpV Ref</string> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
<item> | |
<layout class="QVBoxLayout" name="ikRefArray_verticalLayout_2"> | |
<item> | |
<widget class="QPushButton" name="ikRefArrayAdd_pushButton"> | |
<property name="text"> | |
<string><<</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QPushButton" name="ikRefArrayRemove_pushButton"> | |
<property name="text"> | |
<string>>></string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<spacer name="ikRefArray_verticalSpacer"> | |
<property name="orientation"> | |
<enum>Qt::Vertical</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>20</width> | |
<height>40</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</widget> | |
</item> | |
<item row="2" column="0"> | |
<widget class="QGroupBox" name="upvRefArray_groupBox"> | |
<property name="title"> | |
<string>UpV Reference Array</string> | |
</property> | |
<layout class="QGridLayout" name="gridLayout_5"> | |
<item row="0" column="0"> | |
<layout class="QHBoxLayout" name="upvRefArray_horizontalLayout"> | |
<item> | |
<layout class="QVBoxLayout" name="upvRefArray_verticalLayout_1"> | |
<item> | |
<widget class="QListWidget" name="upvRefArray_listWidget"> | |
<property name="dragDropOverwriteMode"> | |
<bool>true</bool> | |
</property> | |
<property name="dragDropMode"> | |
<enum>QAbstractItemView::InternalMove</enum> | |
</property> | |
<property name="defaultDropAction"> | |
<enum>Qt::MoveAction</enum> | |
</property> | |
<property name="alternatingRowColors"> | |
<bool>true</bool> | |
</property> | |
<property name="selectionMode"> | |
<enum>QAbstractItemView::ExtendedSelection</enum> | |
</property> | |
<property name="selectionRectVisible"> | |
<bool>false</bool> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QPushButton" name="upvRefArray_copyRef_pushButton"> | |
<property name="text"> | |
<string>Copy from IK Ref</string> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
<item> | |
<layout class="QVBoxLayout" name="upvRefArray_verticalLayout_2"> | |
<item> | |
<widget class="QPushButton" name="upvRefArrayAdd_pushButton"> | |
<property name="text"> | |
<string><<</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QPushButton" name="upvRefArrayRemove_pushButton"> | |
<property name="text"> | |
<string>>></string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<spacer name="upvRefArray_verticalSpacer"> | |
<property name="orientation"> | |
<enum>Qt::Vertical</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>20</width> | |
<height>40</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</widget> | |
</item> | |
<item row="3" column="0"> | |
<widget class="QGroupBox" name="pinRefArray_groupBox"> | |
<property name="title"> | |
<string>Pin Elbow Reference Array</string> | |
</property> | |
<layout class="QGridLayout" name="gridLayout_4"> | |
<item row="0" column="0"> | |
<layout class="QHBoxLayout" name="pinRefArray_horizontalLayout"> | |
<item> | |
<layout class="QVBoxLayout" name="pinRefArray_verticalLayout"> | |
<item> | |
<widget class="QListWidget" name="pinRefArray_listWidget"> | |
<property name="dragDropOverwriteMode"> | |
<bool>true</bool> | |
</property> | |
<property name="dragDropMode"> | |
<enum>QAbstractItemView::InternalMove</enum> | |
</property> | |
<property name="defaultDropAction"> | |
<enum>Qt::MoveAction</enum> | |
</property> | |
<property name="alternatingRowColors"> | |
<bool>true</bool> | |
</property> | |
<property name="selectionMode"> | |
<enum>QAbstractItemView::ExtendedSelection</enum> | |
</property> | |
<property name="selectionRectVisible"> | |
<bool>false</bool> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QPushButton" name="pinRefArray_copyRef_pushButton"> | |
<property name="text"> | |
<string>Copy from IK Ref</string> | |
</property> | |
</widget> | |
</item> | |
</layout> | |
</item> | |
<item> | |
<layout class="QVBoxLayout" name="pinRefArray_verticalLayout_2"> | |
<item> | |
<widget class="QPushButton" name="pinRefArrayAdd_pushButton"> | |
<property name="text"> | |
<string><<</string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<widget class="QPushButton" name="pinRefArrayRemove_pushButton"> | |
<property name="text"> | |
<string>>></string> | |
</property> | |
</widget> | |
</item> | |
<item> | |
<spacer name="pinRefArray_verticalSpacer"> | |
<property name="orientation"> | |
<enum>Qt::Vertical</enum> | |
</property> | |
<property name="sizeHint" stdset="0"> | |
<size> | |
<width>20</width> | |
<height>40</height> | |
</size> | |
</property> | |
</spacer> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</item> | |
</layout> | |
</widget> | |
</item> | |
</layout> | |
</widget> | |
<resources/> | |
<connections> | |
<connection> | |
<sender>ikfk_slider</sender> | |
<signal>sliderMoved(int)</signal> | |
<receiver>ikfk_spinBox</receiver> | |
<slot>setValue(int)</slot> | |
<hints> | |
<hint type="sourcelabel"> | |
<x>144</x> | |
<y>47</y> | |
</hint> | |
<hint type="destinationlabel"> | |
<x>220</x> | |
<y>45</y> | |
</hint> | |
</hints> | |
</connection> | |
<connection> | |
<sender>ikfk_spinBox</sender> | |
<signal>valueChanged(int)</signal> | |
<receiver>ikfk_slider</receiver> | |
<slot>setValue(int)</slot> | |
<hints> | |
<hint type="sourcelabel"> | |
<x>222</x> | |
<y>37</y> | |
</hint> | |
<hint type="destinationlabel"> | |
<x>182</x> | |
<y>37</y> | |
</hint> | |
</hints> | |
</connection> | |
</connections> | |
</ui> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment