// =========================================================================== // Copyright 2018 Autodesk, Inc. All rights reserved. // // Use of this software is subject to the terms of the Autodesk license // agreement provided at the time of installation or download, or which // otherwise accompanies this software in either electronic or hard copy form. // =========================================================================== proc string getSymmetryConstraint(string $bone) { string $connected[] = `listConnections ($bone + ".jointOrient")`; for($i in $connected) { if(`nodeType $i` == "symmetryConstraint") { return $i; } } return ""; } proc string getFirstSymmetryConstraint(string $item) { if($item != "") { string $sym = getSymmetryConstraint($item); if($sym != "") { return $sym; } } string $bones[] = `ls -sl -type "joint"`; for($bone in $bones) { string $sym =getSymmetryConstraint($bone); if($sym != "") { return $sym; } } return ""; } proc int isAxisActive(string $axis, string $item) { string $ctx = `currentCtx`; if($ctx == "jointContext") { if(`jointCtx -q -sym $ctx`) { string $qaxis = `jointCtx -q -sa $ctx`; return match($axis, $qaxis) == $axis; } else { return 0; } } else { string $sc = getFirstSymmetryConstraint($item); if($sc != "") { return `getAttr ($sc + "." + $axis + "Axis")`; } } return 0; } global proc InvertJointSymmetryAxis(string $which, string $item) { string $ctx = `currentCtx`; if($ctx == "jointContext") { string $axis = ""; if($which == "x" && !isAxisActive("x", $item)) { $axis += "x"; } else if($which == "y" && !isAxisActive("y", $item)) { $axis += "y"; } else if($which == "z" && !isAxisActive("z", $item)) { $axis += "z"; } if($axis == "") { jointCtx -e -sym 0 $ctx; } else { jointCtx -e -sym 1 -sa $axis $ctx; } } else { string $sc = getFirstSymmetryConstraint($item); if($sc != "") { string $attr = "." + $which + "Axis"; setAttr ($sc + $attr) (!`getAttr ($sc + $attr)`); } } } global proc noSymmetryAxis(string $item) { string $ctx = `currentCtx`; if($ctx == "jointContext") { jointCtx -e -sym 0 -sa "none" $ctx; } else { string $sc = getFirstSymmetryConstraint($item); if($sc != "") { setAttr ($sc + ".xAxis") 0 ; setAttr ($sc + ".yAxis") 0 ; setAttr ($sc + ".zAxis") 0 ; } } } global proc axisOfSymmetryOptionsPopup(string $item) { int $isXActive = isAxisActive("x", $item); int $isYActive = isAxisActive("y", $item); int $isZActive = isAxisActive("z", $item); string $invertXCmd = "InvertJointSymmetryAxis(\"x\", \"" + $item + "\")"; string $invertYCmd = "InvertJointSymmetryAxis(\"y\", \"" + $item + "\")"; string $invertZCmd = "InvertJointSymmetryAxis(\"z\", \"" + $item + "\")"; string $noSymmetry = "noSymmetryAxis(\""+ $item + "\")"; menuItem -label (uiRes("m_axisOfSymmetryOptionsPopup.kAxisofSymmetry")) -command "" -radialPosition "S" -subMenu 1 ; menuItem -label "X-Axis" -radialPosition "W" -checkBox $isXActive -c $invertXCmd ; menuItem -label "Y-Axis" -radialPosition "N" -checkBox $isYActive -c $invertYCmd ; menuItem -label "Z-Axis" -radialPosition "E" -checkBox $isZActive -c $invertZCmd ; menuItem -label (uiRes("m_axisOfSymmetryOptionsPopup.kNone")) -radialPosition "S" -c $noSymmetry ; setParent -menu ..; }